Java TimerTick событие для игрового цикла - PullRequest
4 голосов
/ 01 мая 2011

Я попытался сделать игровой цикл на Java, используя Timer из java.util.Timer.Я не могу запустить цикл игры во время таймера.Вот пример этой проблемы.Я пытаюсь переместить кнопку во время игрового цикла, но она не перемещается по событию таймера.

import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JButton;

public class Window extends JFrame {

    private static final long serialVersionUID = -2545695383117923190L;
    private static Timer timer;
    private static JButton button;

    public Window(int x, int y, int width, int height, String title) {

        this.setSize(width, height);
        this.setLocation(x, y);
        this.setTitle(title);
        this.setLayout(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        timer = new Timer();
        timer.schedule(new TimerTick(), 35);

        button = new JButton("Button");
        button.setVisible(true);
        button.setLocation(50, 50);
        button.setSize(120, 35);
        this.add(button);
    }

    public void gameLoop() {

        // Button does not move on timer tick.
        button.setLocation( button.getLocation().x + 1, button.getLocation().y );

    }

    public class TimerTick extends TimerTask {

        @Override
        public void run() {
            gameLoop();
        }
    }
}

Ответы [ 2 ]

9 голосов
/ 01 мая 2011

Поскольку это приложение Swing, не используйте java.util.Timer, а скорее javax.swing.Timer, также известный как Swing Timer.

например,

private static final long serialVersionUID = 0L;
private static final int TIMER_DELAY = 35;

в конструкторе

  // the timer variable must be a javax.swing.Timer
  // TIMER_DELAY is a constant int and = 35;
  new javax.swing.Timer(TIMER_DELAY, new ActionListener() {
     public void actionPerformed(ActionEvent e) {
        gameLoop();
     }
  }).start();

и

   public void gameLoop() {
      button.setLocation(button.getLocation().x + 1, button.getLocation().y);
      getContentPane().repaint(); // don't forget to repaint the container
   }
4 голосов
/ 01 мая 2011

Прежде всего, Timer.schedule планирует задачу на одно выполнение, а не на повторное выполнение. Так что эта программа может сделать кнопку только один раз.

И у вас есть вторая проблема: все взаимодействия с компонентами Swing должны выполняться в потоке диспетчеризации событий, а не в фоновом потоке. Прочитайте http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading для более подробной информации. Используйте javax.swing.Timer для выполнения действий свинга через повторяющиеся интервалы.

...