如何在JavaFX中创建sprite运行循环?

如何在JavaFX中创建sprite运行循环?,java,javafx,Java,Javafx,所以,我正在尝试使用JavaFX创建一个游戏。我知道大部分的基础知识,但我对如何在JavaFX中创建sprite运行循环感到困惑 精神片: 我希望能够使用方法调用运行周期,例如: publicstaticvoidruncycle(){ //执行运行循环,我想动画类在这里可能会有所帮助? //同时移动图像,我已经确定了。 } 我知道这不是MRE,但我正试图集思广益,所以如果你有任何建议,请让我知道!:) 链接的图像是精灵表,如果有人能帮我解决这个问题,那就太好了。谢谢 您需要定期更新UI以实现此

所以,我正在尝试使用JavaFX创建一个游戏。我知道大部分的基础知识,但我对如何在JavaFX中创建sprite运行循环感到困惑

精神片:

我希望能够使用方法调用运行周期,例如:

publicstaticvoidruncycle(){
//执行运行循环,我想动画类在这里可能会有所帮助?
//同时移动图像,我已经确定了。
}
我知道这不是MRE,但我正试图集思广益,所以如果你有任何建议,请让我知道!:)


链接的图像是精灵表,如果有人能帮我解决这个问题,那就太好了。谢谢

您需要定期更新UI以实现此目的。具体操作方式取决于对其余更新的编码方式。如果您使用
AnimationTimer
创建游戏循环,这可能是进行这些更新的好地方,但是对于单个图像,
Timeline
似乎最方便

如何更新GUI取决于绘制图像的方式<代码>画布需要与
图像视图
不同的处理。前者要求您使用
drawImage
方法来指定要绘制的源图像部分,后者要求您更新
viewport
属性

以下示例显示了如何使用
图像视图
时间线

@Override
public void start(Stage primaryStage) throws Exception {
    Image image = new Image("https://i.imgur.com/K2nHT23.png");
    int height = 4;
    int width = 2;
    double spriteHeight = image.getHeight() / height;
    double spriteWidth = image.getWidth() / width;

    // create viewports to cycle through
    List<Rectangle2D> areas = new ArrayList<>(height * width);

    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            areas.add(new Rectangle2D(x * spriteWidth, y * spriteHeight, spriteWidth, spriteHeight));
        }
    }

    ImageView imageView = new ImageView(image);
    imageView.setViewport(areas.get(0));

    // create timeline animation cycling through viewports
    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(1000d / 6), new EventHandler<ActionEvent>() {

        int index = 0;

        @Override
        public void handle(ActionEvent event) {
            imageView.setViewport(areas.get(index));
            index++;
            if (index >= areas.size()) {
                index = 0;
            }
        }

    }));
    timeline.setCycleCount(Animation.INDEFINITE);
    timeline.play();

    Scene scene = new Scene(new StackPane(imageView));
    primaryStage.setScene(scene);
    primaryStage.show();
}
@覆盖
public void start(Stage primaryStage)引发异常{
图像=新图像(“https://i.imgur.com/K2nHT23.png");
内部高度=4;
整数宽度=2;
双spriteHeight=image.getHeight()/height;
双spriteWidth=image.getWidth()/width;
//创建要循环浏览的视口
列表区域=新阵列列表(高度*宽度);
对于(int y=0;y=areas.size()){
指数=0;
}
}
}));
timeline.setCycleCount(Animation.unfinite);
timeline.play();
场景=新场景(新StackPane(imageView));
初级阶段。场景(场景);
primaryStage.show();
}

(不确定这是否是动画中所需的精灵顺序。)

您需要定期更新UI以实现此目的。具体操作方式取决于对其余更新的编码方式。如果您使用
AnimationTimer
创建游戏循环,这可能是进行这些更新的好地方,但是对于单个图像,
Timeline
似乎最方便

如何更新GUI取决于绘制图像的方式<代码>画布需要与
图像视图
不同的处理。前者要求您使用
drawImage
方法来指定要绘制的源图像部分,后者要求您更新
viewport
属性

以下示例显示了如何使用
图像视图
时间线

@Override
public void start(Stage primaryStage) throws Exception {
    Image image = new Image("https://i.imgur.com/K2nHT23.png");
    int height = 4;
    int width = 2;
    double spriteHeight = image.getHeight() / height;
    double spriteWidth = image.getWidth() / width;

    // create viewports to cycle through
    List<Rectangle2D> areas = new ArrayList<>(height * width);

    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            areas.add(new Rectangle2D(x * spriteWidth, y * spriteHeight, spriteWidth, spriteHeight));
        }
    }

    ImageView imageView = new ImageView(image);
    imageView.setViewport(areas.get(0));

    // create timeline animation cycling through viewports
    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(1000d / 6), new EventHandler<ActionEvent>() {

        int index = 0;

        @Override
        public void handle(ActionEvent event) {
            imageView.setViewport(areas.get(index));
            index++;
            if (index >= areas.size()) {
                index = 0;
            }
        }

    }));
    timeline.setCycleCount(Animation.INDEFINITE);
    timeline.play();

    Scene scene = new Scene(new StackPane(imageView));
    primaryStage.setScene(scene);
    primaryStage.show();
}
@覆盖
public void start(Stage primaryStage)引发异常{
图像=新图像(“https://i.imgur.com/K2nHT23.png");
内部高度=4;
整数宽度=2;
双spriteHeight=image.getHeight()/height;
双spriteWidth=image.getWidth()/width;
//创建要循环浏览的视口
列表区域=新阵列列表(高度*宽度);
对于(int y=0;y=areas.size()){
指数=0;
}
}
}));
timeline.setCycleCount(Animation.unfinite);
timeline.play();
场景=新场景(新StackPane(imageView));
初级阶段。场景(场景);
primaryStage.show();
}

(不确定这是否是动画中所需的精灵顺序。)

谢谢!这很好用!帮我省去了很多麻烦,哈哈。谢谢你的帮助,非常感谢:)谢谢!这很好用!帮我省去了很多麻烦,哈哈。非常感谢您的帮助,非常感谢:)