814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
1

Timer в linux

27.09.2015, 20:04. Показов 486. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Изучал java, решил написать змейку. Писал на винде, было все хорошо.
Для шага змейки использовал Timer. По его событию, совершался шаг, потом перерисовка, проверка на съедение яблока и выход за поле.. Все хорошо, но на линуксе если не нажимать клавиш, то змейка начинает перескакивать через несколько полей..

Может есть особенность в Timer'е на линуксе?

Код конечно ужасный, но части могу выложить какие надо будет..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2015, 20:04
Ответы с готовыми решениями:

Linux. boost. Timer реагирует на системное время?
Доброго дня, спецы по бусту. Есть: Debian, boost 1.49 и простой пример из доков буста void...

Запуск/остановка таймера при вводе в Edit команд Timer Start/Timer Stop
Суть вот в чём на форме есть таймер который выполняет обратный отсчёт и есть Edit, задача вот...

Не удаётся связать два файла timer.h и timer.cpp
Добрый вечер, у меня есть класс и библиотеки которые нужно использовать в нескольких программах, по...

Timer vs System.Windows.Forms.Timer
Занятную штуку недавно обнаружил: Всем известный Timer из модуля Timers отказывается работать,...

12
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
28.09.2015, 15:58 2
На счёт Timer в Линуксе не проверял, но попробуй задержкой реализовать:
Java
1
TimeUnit.MILLISECONDS.sleep(milisecond);
или
Java
1
TimeUnit.SECONDS.sleep(second);
а Timer в ноль ставь, а в нём задержку... Хотя я решения твоего не видел, могу предполагать только!
0
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
28.09.2015, 18:10  [ТС] 3
Тогда нужен будет бесконечный цикл...
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
28.09.2015, 18:18 4
Timer сам по себе цикл с какой-то переодичностью или действием... В нём и размещай задержку
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
28.09.2015, 18:31 5
Без кода сложно что-то сказать. Попробуйте добавить логов и увеличить время между тиками - хотя бы точно сможете определить, действительно ли проблема в самом таймере, а не в вашем коде.
Какой таймер вы используете? javax.swing.Timer или java.util.Timer?
0
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
28.09.2015, 18:50  [ТС] 6
таймер используется javax.swing.Timer
По событию таймеры происходит
Java
1
2
3
4
snake.step();                     // шаг змейки
snake.checkOver(point);     // съела ли змейка яблоко
snake.checkGameOver();    // вышла ли змейка за экран или укусила сама себя
frame.repaint();
Snake::step
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void step() {
        if(Main.status == Status.PAUSE) return;
 
        int lastIndex = coor.size()-1;
        Coor lastPoint = coor.get(lastIndex);
        Coor firstPoint = coor.get(0);
 
        coor.remove(lastIndex);
        direction = step;
        switch (direction) {
 
            case RIGHT:
                lastPoint.setX(firstPoint.getX() + Main.CELL);
                lastPoint.setY(firstPoint.getY());
                break;
 
            case DOWN:
                lastPoint.setY(firstPoint.getY() + Main.CELL);
                lastPoint.setX(firstPoint.getX());
                break;
 
            case LEFT:
                lastPoint.setX(firstPoint.getX() - Main.CELL);
                lastPoint.setY(firstPoint.getY());
                break;
 
            case TOP:
                lastPoint.setY(firstPoint.getY() - Main.CELL);
                lastPoint.setX(firstPoint.getX());
                break;
        }
 
        coor.add(0, lastPoint);
 
    }


Если время ставить на ~700ms и выше, то такого не наблюдается
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
28.09.2015, 20:05 7
А само поле сами рисуете?
0
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
28.09.2015, 20:16  [ТС] 8
Да, весь вывод графики в классе наследуемом от JPanel
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
 
public class GamePanel extends JPanel {
 
    private Snake snake;
    private Point point;
 
    public GamePanel(@NotNull Snake snake, Point point) {
        this.snake = snake;
        this.point = point;
        setPreferredSize(new Dimension(Main.WIDTH, Main.HEIGHT));
    }
 
    @Override
    public void paint(Graphics g) {
        super.paint(g);
 
        paintStep(g);
 
        switch(Main.status) {
            case PAUSE: paintPause(g); break;
 
            case SNAKE_IS_OVER_SCREEN:
            case SHAKE_EAT_SELF:
                paintGameOver(g);
                break;
        }
 
    }
 
    private void paintPause(Graphics g) {
        int cellWidth = (Main.WIDTH/Main.CELL - 8);
 
        g.setColor(GameColor.BACKGROUND.getColor());
        g.fillRect(Main.CELL * 4+1, Main.CELL * 18+1, Main.CELL * cellWidth -1, Main.CELL * 8-1);
 
        g.setColor(GameColor.BLACK.getColor());
        g.drawRect(Main.CELL*4+2, Main.CELL*18+2, Main.CELL*cellWidth-4, Main.CELL*8-4);
 
        String text = "ПАУЗА";
        g.setFont(new Font( "SansSerif", Font.BOLD, 30 ));
        FontMetrics fm = g.getFontMetrics(g.getFont());
        g.drawString(text, (Main.WIDTH - fm.stringWidth(text))/2, Main.CELL*22+10);
    }
 
    private void paintGameOver(Graphics g) {
        int cellWidth = (Main.WIDTH/Main.CELL - 8);
 
        g.setColor(GameColor.BACKGROUND.getColor());
        g.fillRect(Main.CELL * 4+1, Main.CELL * 18+1, Main.CELL * cellWidth-1, Main.CELL * 8-1);
 
        g.setColor(GameColor.BLACK.getColor());
        g.drawRect(Main.CELL*4+2, Main.CELL*18+2, Main.CELL*cellWidth-4, Main.CELL*8-4);
 
        String gameOver = "ИГРА ОКОНЧЕНА";
        String score = "Количество очков: " + snake.getScore();
 
 
        g.setFont(new Font( "SansSerif", Font.BOLD, 25 ));
        FontMetrics fm = g.getFontMetrics(g.getFont());
        g.drawString(gameOver, (Main.WIDTH - fm.stringWidth(gameOver))/2, Main.CELL*21);
 
        g.setFont(new Font( "SansSerif", Font.PLAIN, 18 ));
        fm = g.getFontMetrics(g.getFont());
        g.drawString(score, (Main.WIDTH - fm.stringWidth(score))/2, Main.CELL*24);
    }
 
    private void paintStep(Graphics g) {
        g.setColor(GameColor.BACKGROUND.getColor());
        g.fillRect(0, 0, Main.WIDTH, Main.HEIGHT);
 
        g.setColor(GameColor.CELL.getColor());
        for (int i=0; i < Main.WIDTH; i += Main.CELL) {
            g.drawLine(i, 0, i, Main.HEIGHT);
        }
        for (int i=0; i < Main.HEIGHT; i += Main.CELL) {
            g.drawLine(0, i, Main.WIDTH, i);
        }
 
        int i = 0;
        g.setColor(GameColor.SNAKE.getColor());
        ArrayList<Coor> list = snake.getCoor();
        for (Coor coor : list) {
            g.fillRect(coor.getX()+2, coor.getY()+2, Main.CELL-3, Main.CELL-3);
 
            if(i == 0) {
                g.setColor(GameColor.SNAKE_HEAD.getColor());
                g.fillRect(coor.getX()+4, coor.getY()+4, Main.CELL-7, Main.CELL-7);
                g.setColor(GameColor.SNAKE.getColor());
            }
 
            i++;
        }
 
        g.setColor(GameColor.POINT.getColor());
        int x = Main.CELL*point.getX()+2;
        int y = Main.CELL*point.getY()+2;
        g.fillRect(x, y, Main.CELL-3, Main.CELL-3);
    }
}
0
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
28.09.2015, 20:35 9
Я не силён в swing-е, но везде рекомендуют перегружать paintComponent, а не paint.
1
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
28.09.2015, 20:38  [ТС] 10
Хорошо, завтра попробую paintComponent использовать
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
28.09.2015, 20:40 11
проблема таймера не в коде прорисовки... И кстати да, используй не paint, а paintComponent... и ещё перерисовку можно делать updateUI(), тоже быстро и надёжно

А на счёт таймера ,попробуй таймер из utils
0
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
29.09.2015, 20:58  [ТС] 12
поменял на paintComponent, но разницы никакой.
Вообще что-то как-то странно все, если нажимать на какие-то клавиши или водить мышкой в окне, тогда все хорошо. Иначе около 4 шагов нормально, потом начинает перепрыгивать..
0
746 / 493 / 285
Регистрация: 10.09.2015
Сообщений: 1,530
30.09.2015, 02:02 13
такое у меня в Pascal наблюдалось...но это было связанно с процессорной задержкой... На слабых процах шло, как надо, а на мощных пару секунд нормально, а потом летало как самолёт )))

Решил проблему с задержкой используя системное время... Я думаю, что есть другой способ задержки в Java, который устроит тебя. Экспериментируй. Я, к сожалению, ещё пока не сталкивался с такой проблемой в Java
0
30.09.2015, 02:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2015, 02:02
Помогаю со студенческими работами здесь

Неоднозначная ссылка "Timer" между "System.Windows.Forms.Timer" и "System.Timers.Timer"
Я делю таймер в Windows Form. но ругается компилятор на такой код: using System; using...

При randomize timer: пишет invalid outside procedure и указывает на randomize Timer
почему в к примеру таком коде: Randomize Timer Dim tm As Integer Private Sub Timer1_Timer() tm...

System.Timers.Timer vs System.Threading.Timer
System.Timers.Timer vs System.Threading.Timer. в чем разница если можно примеры....

Ошибка Kernel driver not installed (rc=-1908) linux в VirtualBox (Linux Mint)
При попытке запустить ВМ в VB вылетает ошибка Kernel driver not installed (rc=-1908)Смотрел в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru