2 回答
TA贡献1829条经验 获得超6个赞
简短回答
您可以使用这部分代码做出您想要的行为
Runnable collide = new Runnable() {
@Override
public void run() {
Platform.runLater(() ->
damageEffect()
);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Platform.runLater(() ->
resetEffect()
);
}
};
new Thread(collide).start();
说明 您不能Thread.Sleep()在主线程上使用,这会导致您的 UI 冻结,因此您需要在另一个线程上使用它,并且为了在更改 UI/主线程中的任何内容时更安全,您应该使用Platform.runLater()
您可以在这些函数中编写任何效果boomEffect(),resetEffect() 如果您想更改画布填充颜色,您可以在注释中使用 @Barudar 提供的代码,如下所示
private void resetEffect() {
canvas.getGraphicsContext2D().setFill(Color.RED);
canvas.getGraphicsContext2D().fillRect(0,0,canvas.getWidth(),canvas.getHeight());
}
其中fillRect()以startingX、startingY、endX、endY作为参数
TA贡献1911条经验 获得超7个赞
您正在阻止 JavaFX 应用程序线程,从而Thread.sleep
阻止呈现更改。(在您的代码中实际上没有任何变化,因为您只是替换了用于绘制的颜色,假设该颜色没有在其他地方使用,但如果您除了修改属性之外还绘制了某些内容,则会发生这种情况fill
。 )
javafx.animation
我建议使用包中的一个类来更改此设置。
在这种情况下, aPauseTransition
似乎是最简单的方法,但如果您想包含更新循环,我建议使用AnimationTimer
orTimeline
代替,并将这种逻辑集成到更新“循环”中。使用后一种可能性,您可以简单地保存球上次撞墙的时间,并根据此信息决定使用哪种颜色来绘制背景。
使用示例PauseTransition
:
gc.setFill(Color.WHITESMOKE);
gc.fillRect(x, y, w, h);
// schedule update without blocking
PauseTransition pause = new PauseTransition(Duration.millis(100));
pause.setOnFinished(evt -> {
gc.setFill(Color.BLACK);
gc.fillRect(x, y, w, h);
});
pause.play();
请注意,您可能需要重绘的不仅仅是背景,因为 usingfillRect会替换矩形中当前的所有内容。
添加回答
举报