所以我正在尝试javaFX,因为它是我研究的主题之一。 我有一个弹射器,可以向某个方向射球。我想知道您是否可以在某些情况下在运行时以某种方式更改画布背景的颜色-例如,当球碰到墙时。 我已经想出了如何使球弹回墙壁,但是我想不出如何在运行时更改背景色。
我正在使用import javafx.scene.canvas.GraphicsContext;因为这是我们“必须”与之合作的东西。
我以为这样的事情会起作用,我发现了一些有关睡眠的话题,所以尝试了一下。
public void flashCanvas() {
try
{
gc.setFill(Color.WHITESMOKE);
Thread.sleep(100);
gc.setFill(Color.BLACK);
Thread.sleep(100);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
}
我认为这只会改变颜色,然后再等一遍。
感谢帮助!
答案 0 :(得分:0)
简短答案
您可以使用这部分代码来实现所需的行为
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();
说明
您不能在会导致UI冻结的主线程上使用Thread.Sleep()
,因此您需要在另一个线程上使用它,并且为了更安全地更改UI / Main线程中的任何内容,您应该使用{{1} }
您可以在这些功能Platform.runLater()
和boomEffect()
中编写任何效果
如果要更改画布填充颜色,可以使用@Barudar在注释中提供的代码,像这样
resetEffect()
其中private void resetEffect() {
canvas.getGraphicsContext2D().setFill(Color.RED);
canvas.getGraphicsContext2D().fillRect(0,0,canvas.getWidth(),canvas.getHeight());
}
将startingX,startingY,endX,endY作为参数
答案 1 :(得分:0)
您正在使用Thread.sleep
阻止JavaFX应用程序线程,这将阻止呈现更改。 (在您的代码中,实际上没有任何变化,因为您只是替换了用于绘制的颜色,假设该颜色未在其他任何地方使用,但是如果您除了修改{{ 1}}属性。)
我建议使用javafx.animation
package中的一个类来更改它。
在这种情况下,使用fill
似乎是最简单的方法,但是如果要包括更新循环,我建议使用PauseTransition
或AnimationTimer
并集成这种逻辑进入更新“循环”。使用后一种可能性,您可以简单地保存上次击球墙的时间,然后根据此信息来决定使用哪种颜色绘制背景。
使用Timeline
的示例:
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();
会替换矩形中当前的所有内容,因此您可能不仅需要重绘背景,还需要重绘。