Как рисовать мои 2D объекты в таймере - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь сделать игру со змеями, используя ООП.ООП - это новая концепция для меня, поскольку я обычно использую функциональное программирование.

У меня есть таймер, и когда он запускается, он должен рисовать змею и еду.

@Override
protected void paintComponent(Graphics g) {

    Timer timer = new Timer();

    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {

            //SNAKE AND FOOD DO NOT SHOW UP HERE

            g.setColor(Color.GREEN);
            drawSnake(g, snek);
            drawFood(g, foodPack);  
            snek.changeYDir(10);
            snek.moveHeadY();
            System.out.println("Timer is running");
            System.out.println(snek.getHeadY());
            System.out.println(snek.getChunkX(0));

        }
    };
    timer.scheduleAtFixedRate(timerTask, 0, 1000);



    //If code in timer is put here, snake and food show up


}

** Aнесколько подсказок, которые я вывел!

  1. Таймер работает
  2. голова движется - показано в консоли
  3. Тело змеи существует - показано, что оно существует вконсоль

ЖУРНАЛ КОНСОЛИ:

Timer is running
340
130

Вот ссылка на весь проект.https://files.fm/u/b8kvgebq

1 Ответ

0 голосов
/ 20 октября 2018

Начните с чтения Рисование в AWT и Swing и Выполнение пользовательской рисования , чтобы лучше понять, как на самом деле работает рисование в Swing.

Далеепрочитайте Параллельность в Swing , чтобы понять, как работает многопоточность в Swing.

paintComponent должен отображать только текущее состояние компонента, он никогда не должен выполнять никаких операций, которые могут вызватьновый проход для рисования.

Поскольку paintComponent можно вызывать в любое время по любым причинам, многие из которых вы не контролируете, попытка запланировать новый TimerTask в нем - оченьочень, очень плохая идея.Вы можете получить любое количество таймеров, пытающихся внести изменения в пользовательский интерфейс, что приведет к снижению производительности и возможному конфликту друг с другом.

Поскольку Graphics сам по себе также является временным, вы никогда не должны поддерживать ссылку наэто выходит за рамки paint методов.

Сначала рассмотрим Как использовать Swing Timers для лучшего базового решения.Вы должны создать один Timer, который обновляет состояние компонента и вызывает repaint, который косвенно вызовет ваш paintComponent, когда вы рисуете текущее состояние компонента.

Например,см. SnakeGame, как заставить хвост следовать за головой?

...