Java 如何在游戏循环中绘制图形上下文?
我正在制作水果忍者游戏,我想暂停动画计时器一段时间,并在切片时将图像设置为切片水果图像“current.getBufferedImages()[1]”,但我得到的图像与非切片水果图像“current.getBufferedImages()[0]”相同,即使我将图像更改为在graphicsContext.setImage()中绘制Java 如何在游戏循环中绘制图形上下文?,java,javafx,Java,Javafx,我正在制作水果忍者游戏,我想暂停动画计时器一段时间,并在切片时将图像设置为切片水果图像“current.getBufferedImages()[1]”,但我得到的图像与非切片水果图像“current.getBufferedImages()[0]”相同,即使我将图像更改为在graphicsContext.setImage()中绘制 public void startName(Stage primaryStage)引发异常{ ga=GameActions.get(); 画布=新画布(1024683)
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;igameUpdate
在JavaFX应用程序线程上执行。这意味着此方法返回的任何延迟都会冻结GUI,直到该方法返回。因此
for(int i=0;i<150000;i++) {
gc.drawImage(k, current.getXlocation(), current.getYlocation());
timer.stop();
}
此外,我强烈建议不要在游戏循环的每一次迭代中反复转换BufferedImage
s。最好直接用JavaFXImage
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。最好用JavaFXImage
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();
}
}
});