Как настроить JFrame с частотой обновления? - PullRequest
0 голосов
/ 07 июня 2011

У меня есть 2D-игра, в которой вся структура полностью закодирована, кроме графики. Я просто обновляю единственный компонент JFrame, который представляет собой графическое изображение, содержащее 50 изображений. В каждом кадре изображения находятся в разных местах, поэтому необходима частота обновления.

Для рисования я переопределил метод paintComponent (), поэтому все, что мне действительно нужно сделать, это перекрасить компонент (который, опять же, просто Графика) каждые 40 мс.

Как настроить JFrame с 25FPS?

Ответы [ 2 ]

4 голосов
/ 07 июня 2011

Это плохая идея, чтобы обновить JFrame. Это один из немногих тяжелых компонентов в Swing. Лучший способ -

  • идентифицирует панель, содержащую вашу анимацию
  • создать класс, расширяющий JPanel. то есть GamePane расширяет JPanel
  • переопределить paintComponent (нет)

Ваш заголовок вводит в заблуждение, вы поступили правильно.

  • в вашем JFrame создайте класс бегуна

/** Thread running the animation. */
private class Runner extends Thread
{
    /** Wether or not thread should stop. */
    private boolean shouldStop = false;
    /** Pause or resume. */
    private boolean pause = false;

    /** Invoke to stop animation. */
    public void shouldStop() {
        this.shouldStop = true;
    }//met

    /** Invoke to pause. */
    public void pauseGame() { pause = true; }//met
    /** Invoke to resume. */
    public void resumeGame() { pause = false; }//met

    /** Main runner method : sleeps and invokes engine.play().
     * @see Engine#play */
    public void run()
    {
        while( !shouldStop )
        {
            try {
                Thread.sleep( 6 );
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }//catch
            if( !pause )
            {
                engine.play();
                                    gamePane.repaint();

            }//if
        }//while
    }//met

    /** Wether or not we are paused. */
    public boolean isPaused() {
        return pause;
    }//met
}//class Runner (inner)

Ваша анимация будет намного плавнее. И используйте MVC и события для обновления других частей пользовательского интерфейса.

С уважением, Stéphane

2 голосов
/ 07 июня 2011

Это AnimationTest использует javax.swing.Timer. Период 40 мс даст частоту 25 Гц.

private final Timer timer = new Timer(40, this);

Добавление: таймер ActionListener отвечает, вызывая repaint(), который впоследствии вызывает ваш переопределенный paintComponent() метод

@Override
public void actionPerformed(ActionEvent e) {
    this.repaint();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...