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