Java 如何在游戏循环中绘制图形上下文?

Java 如何在游戏循环中绘制图形上下文?,java,javafx,Java,Javafx,我正在制作水果忍者游戏,我想暂停动画计时器一段时间,并在切片时将图像设置为切片水果图像“current.getBufferedImages()[1]”,但我得到的图像与非切片水果图像“current.getBufferedImages()[0]”相同,即使我将图像更改为在graphicsContext.setImage()中绘制 public void startName(Stage primaryStage)引发异常{ ga=GameActions.get(); 画布=新画布(1024683)

我正在制作水果忍者游戏,我想暂停动画计时器一段时间,并在切片时将图像设置为切片水果图像“current.getBufferedImages()[1]”,但我得到的图像与非切片水果图像“current.getBufferedImages()[0]”相同,即使我将图像更改为在graphicsContext.setImage()中绘制

public void startName(Stage primaryStage)引发异常{
ga=GameActions.get();
画布=新画布(1024683);
gc=canvas.getGraphicsContext2D();
时间线=新时间线(新关键帧(持续时间.毫秒(下降)),事件->{
时间+=下降/3000;
IGameObject c=ga.createGameObject();
删除.加入(c);
}));
时间线。setCycleCount(4000);
timeline.play();
计时器=新建动画计时器(){
@凌驾
公共无效句柄(长arg0){
游戏更新(初级阶段);
}
};
timer.start();
场景=新场景(根,1024683);
root.getChildren().addAll(ivBackground、lblMissed、canvas、back、reset);
初级阶段。场景(场景);
primaryStage.show();
}
公开作废游戏更新(阶段){
图像k;
gc.drawImage(背景,300300);
gc.clearRect(0,0,1024,683);
迭代器itr=drop.Iterator();
while(itr.hasNext()){
IGameObject current=itr.next();
EventHandler e=新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(当前的.insideBounds(event.getX(),event.getY())
current.slice();
}
};
gc.getCanvas().setOnMousePressed(e);
如果(!current.isSliced()){
k=SwingFXUtils.toFXImage(current.getBuffereImage()[0],null);
}否则{
k=SwingFXUtils.toFXImage(current.getBuffereImage()[1],null);
if(current.getObjectType().toString().equalsIgnoreCase(“危险炸弹”)){

for(int i=0;i
gameUpdate
在JavaFX应用程序线程上执行。这意味着此方法返回的任何延迟都会冻结GUI,直到该方法返回。因此

for(int i=0;i<150000;i++) {
    gc.drawImage(k, current.getXlocation(), current.getYlocation());
    timer.stop();
}

此外,我强烈建议不要在游戏循环的每一次迭代中反复转换
BufferedImage
s。最好直接用JavaFX
Image
s替换
BufferedImage
s,或者保留包含每个转换结果的
Map

gameUpdate
在JavaFX应用程序线程。这意味着该方法返回的任何延迟都会冻结GUI,直到该方法返回

for(int i=0;i<150000;i++) {
    gc.drawImage(k, current.getXlocation(), current.getYlocation());
    timer.stop();
}
此外,我强烈建议不要在游戏循环的每一次迭代中反复转换
BufferedImage
s。最好用JavaFX
Image
s直接替换
BufferedImage
s,或者保留包含每个转换结果的
Map

timer = new AnimationTimer() {

    @Override
    public void handle(long arg0) {
        gameUpdate(arg0);
    }

};
private long pauseEnd = 0L;

/**
 * Continue updates after a certain number of milliseconds after the current time
 */
private void pauseFor(long currentTime, long durationMillis) {
    pauseEnd = currentTime + 1_000_000L * durationMillis;
}

public void gameUpdate(long timestamp) {
    if (timestamp >= pauseEnd) { // only redraw, if not paused
        ...

        //for(int i=0;i<150000;i++) {
        //    gc.drawImage(k, current.getXlocation(), current.getYlocation());
        //    timer.stop();
        //}
        //timer.start();
        //itr.remove();
        //score++;
        gc.drawImage(k, current.getXlocation(), current.getYlocation());
        itr.remove();
        score++;
        pauseFor(timestamp, 3000); // start updates again in 3000 ms

        ...
    }
}
canvas.setOnMousePressed(event -> {
    for (IGameObject current : drop) {
        if(current.insideBounds(event.getX(), event.getY())) {
            current.slice();
        }
    }
});