如何正确删除JavaFX中动画的图像

如何正确删除JavaFX中动画的图像,java,animation,javafx,Java,Animation,Javafx,我试图创建一个简单的太空入侵者游戏。这是我第一次参加比赛,所以我有一些问题。入侵者是一个矩形的物体,上面有一个老式入侵者的图像。在每一帧中,我将这些框向右绘制15个像素,然后使用root.getChildren().remove()删除每一帧中的精灵。但它会导致一些奇怪的行为。它看起来好像没有足够快地被移除,所以就在我启动应用程序的时候,它有点爆炸,之后似乎有一点延迟,导致两个图像不断显示 我想这可能会帮助你看到它自己,所以我会张贴我的所有文件在这里 public class Main exte

我试图创建一个简单的太空入侵者游戏。这是我第一次参加比赛,所以我有一些问题。入侵者是一个矩形的物体,上面有一个老式入侵者的图像。在每一帧中,我将这些框向右绘制15个像素,然后使用root.getChildren().remove()删除每一帧中的精灵。但它会导致一些奇怪的行为。它看起来好像没有足够快地被移除,所以就在我启动应用程序的时候,它有点爆炸,之后似乎有一点延迟,导致两个图像不断显示

我想这可能会帮助你看到它自己,所以我会张贴我的所有文件在这里

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Space invaders");
        primaryStage.setResizable(false);
        Group root = new Group();
        Scene game = new Scene(root, Color.BLACK);
        primaryStage.setFullScreen(true);

        Images images = new Images();

        // Make canvas and add it to primaryStage
        Canvas canvas = new Canvas(1280,720);
        root.getChildren().add(canvas);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        new AnimationTimer() {

            int move = 0;
            private long lastUpdate = 0;
            ArrayList<Sprite> enemies = new ArrayList<>();

            @Override
            public void handle(long now) {

                if (now - lastUpdate >= 150_000_000) {

                    int spacing = 0;

                    try {
                        for (int i = 0; i < enemies.size(); i++) {
                            root.getChildren().remove(enemies.get(i));
                            enemies.remove(i);
                        }
                    } catch (IndexOutOfBoundsException ioobe) {
                        System.out.println(ioobe.toString());
                    }

                    for (int i = 0; i < 12; i++) {
                        for (int j = 0; j < 6; j++) {
                            Sprite enemy = new Sprite(60 * i + spacing + move, 43 * j, 60, 43, "enemy", true, images.getEnemy1());
                            enemies.add(enemy);
                            root.getChildren().add(enemy);
                        }
                        spacing += 15;
                    }
                    move += 5;

                    lastUpdate = now;

                }
            }
        }.start();

        primaryStage.setScene(game);
        primaryStage.show();
    }
}

这不是场景图应该使用的方式。为什么你总是移除并重新添加你的精灵?你为什么不通过你已经在使用的setTranslateX/Y更新他们的位置呢

try {
    for (int i = 0; i < enemies.size(); i++) {
        root.getChildren().remove(enemies.get(i));
        enemies.remove(i);
    }
} catch (IndexOutOfBoundsException ioobe) {
    System.out.println(ioobe.toString());
}
注 应该避免在每个帧中重新创建精灵。如果可以避免的话,
节点
s的内存需求不会使它们成为您应该扔掉的对象。否则,垃圾收集器最多只能忙于清理您“丢弃”的对象,最坏的情况下会发生
OutOfMemoryException

重新使用精灵并修改属性


另外,我建议使用
ImageView
而不是
Rectangle
s填充
ImagePattern
。您可以使用
fitWidth
fitHeight
属性调整大小。

感谢各位的回复,我不知道为什么我认为需要删除每个动画中的精灵。我现在已经更新了我的代码,只需更新已经存在的精灵的位置,现在它就可以完美地工作了。
try {
    for (int i = 0; i < enemies.size(); i++) {
        root.getChildren().remove(enemies.get(i));
        enemies.remove(i);
    }
} catch (IndexOutOfBoundsException ioobe) {
    System.out.println(ioobe.toString());
}
root.getChildren().removeAll(enemies);
enemies.clear();