Функция Java, которая вызывается в каждом кадре

Мне было интересно, существует ли такая функция, как void draw(), которая Обработка использует язык программирования, который вызывается в каждом кадре. Или даже просто функция, которая выполняет бесконечный цикл при вызове, но выполняет ее только каждый раз, когда появляется новый кадр. Я слышал о чем-то, что называется runnable в java, как мне это использовать? также есть ли лучший способ, чем иметь исполняемый файл с задержкой, такой как функция, которая жестко закодирована для запуска каждого кадра. О, а также, что такое вызов функции, который позволит мне увидеть, сколько времени (предпочтительно в миллисекундах) с тех пор, как приложение начало работать таким образом, я могу сделать мои вызовы runnables/frame намного более точными, чтобы игра работала примерно с той же скоростью на каждом компьютере независимо от частоты кадров.


person semicolon    schedule 16.07.2012    source источник
comment
Что именно вы подразумеваете под frame Вы говорите о графическом окне?   -  person Mohayemin    schedule 16.07.2012
comment
Я имею в виду как кадр, как в FPS. Как каждый раз, когда экран обновляется. 60 раз в секунду для большинства приличных мониторов.   -  person semicolon    schedule 16.07.2012
comment
Я предполагаю, что вы пишете свою первую игру. Я бы посоветовал купить книгу или прочитать несколько руководств в Интернете о разработке игр на Java. Это должно научить вас всему, что вы хотите знать.   -  person Brad    schedule 16.07.2012
comment
Мне просто интересно, почему люди проголосовали за мой вопрос, может кто-нибудь сказать мне, что я сделал неправильно?   -  person semicolon    schedule 18.07.2012
comment
это потому, что невежественные Java-программисты не утруждают себя исследованием Processing, даже если вы дали ссылку на него. Я проголосовал.   -  person jesses.co.tt    schedule 15.06.2013


Ответы (1)


Возможно, вам нужно что-то вроде этого

import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class Repainter extends JPanel {
    private Point topLeft;
    private int increamentX = 5;

    public Repainter() {
        topLeft = new Point(100, 100);
    }

    public void move() {
        topLeft.x += increamentX;
        if (topLeft.x >= 200 || topLeft.x <= 100) {
            increamentX = -increamentX;
        }

        repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(topLeft.x, topLeft.y, 100, 100);
    }

    public void startAnimation() {
        SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
            @Override
            protected Object doInBackground() throws Exception {
                while (true) {
                    move();
                    Thread.sleep(100);
                }
            }
        };

        sw.execute();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame("Repaint Demo");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 400);

                Repainter repainter = new Repainter();

                frame.add(repainter);

                repainter.startAnimation();
                frame.setVisible(true);
            }
        });
    }
}
person Mohayemin    schedule 16.07.2012