我在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();
}
}
答案 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;你的方法的作用。对于一个物体来说,它是完全可以接受的。