2

フレームごとに呼び出されるProcessingプログラミング言語void draw()ような関数があるのではないかと思いました。または、呼び出されたときに無限にループするが、新しいフレームがあるたびに実行される関数だけでもかまいません。Javaでランナブルと呼ばれるものを聞いたのですが、これを使用するにはどうすればよいですか?また、すべてのフレームを実行するようにハードコードされた関数のように、遅延のある実行可能ファイルを作成するよりも良い方法があります。ああ、また、アプリケーションがそのように実行を開始してからどれくらいの時間(ミリ秒単位が望ましい)を確認できる関数呼び出しは何ですか?ゲームがほぼ同じ速度で実行されるように、ランナブル/フレーム呼び出しをはるかに正確にすることができますフレームレートに関係なく、すべてのコンピュータで。

4

1 に答える 1

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);
            }
        });
    }
}
于 2012-07-16T10:57:53.887 に答える