如何在AnimationTimer循环JavaFX中创建Object生成器

时间:2017-01-30 19:47:20

标签: java javafx

我在JavaFX上制作简单的太空飞船游戏。我有类SpaceShip,我想在随机起始位置(例如5秒的间隔)中在我的主游戏循环中从这个类中制作随机对象。我尝试使用Timer schedule()方法完成任务。问题在于我无法获得宇宙飞船的清晰图像,它会因为不断循环而消失并显示在其他方面。有人可以帮我提供如何处理的建议。

我的游戏循环:



new AnimationTimer() {
            @Override
            public void handle(long currentNanoTime) {

                double t = (currentNanoTime - startNanoTime) / 1000000000.0;

                double xMoving = ((100 * t) % (canvas.getWidth() + 100));

                double x = 232 + 128 * Math.cos(t);
                double y = 232 + 128 * Math.sin(t);

                //background image clears canvas
                gc.drawImage(space, 0, 0);
                gc.drawImage(earth, x, y);
                gc.drawImage(sun, 196, 196);
                // draw UFO
                gc.drawImage(ufo.getFrame(t), 100, 25);

                //draw spaceShip
                SpaceShip.generate(new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 150)));
                //timer schedule
                Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        SpaceShip.generate(new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 230)));
                    }
                }, 5000);
            }
        }.start();




SpaceShip课程:

package objectClasses;

import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;


public class SpaceShip{

private final GraphicsContext gc;
private final double frame;
private final double y;
private final double x;
private AnimatedImage object;

public SpaceShip(Image[] arr, double duration, GraphicsContext gc, double frame, double x, double y) {
    object = new AnimatedImage();
    this.object.frames = arr;
    this.object.duration = duration;
    this.gc = gc;
    this.frame = frame;
    this.y = y;
    this.x = x;
}

private void drawShip() {
    this.gc.drawImage(this.object.getFrame(frame), x, y);
}

public static void generate(SpaceShip spaceShip) {
    spaceShip.drawShip();
}

}

1 个答案:

答案 0 :(得分:0)

这是罪魁祸首。

SpaceShip.generate(new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 150)));

基本上,在每个框架中,您都可以创建SpaceShip的新实例。闪烁的图像是由一次又一次地创建太空船引起的。那不会起作用。

您需要在游戏循环外创建这些对象并存储其引用:

SpaceShip mySpaceShip = new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 150));

在游戏循环中,您只需更新演员的位置(该部分缺失)并继续将它们绘制到新位置。

SpaceShip.generate(mySpaceShip);

附注:您可以完全删除generate方法,公开drawShip,将其重命名为draw,然后只需致电mySpaceShip.draw() - 这将更加明显&# 39;你的方法的作用。对于一个物体来说,它是完全可以接受的。