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