2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
簡(jiǎn)短回答
您可以使用這部分代碼做出您想要的行為
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()在主線程上使用,這會(huì)導(dǎo)致您的 UI 凍結(jié),因此您需要在另一個(gè)線程上使用它,并且為了在更改 UI/主線程中的任何內(nèi)容時(shí)更安全,您應(yīng)該使用Platform.runLater()
您可以在這些函數(shù)中編寫任何效果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作為參數(shù)

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
您正在阻止 JavaFX 應(yīng)用程序線程,從而Thread.sleep
阻止呈現(xiàn)更改。(在您的代碼中實(shí)際上沒有任何變化,因?yàn)槟皇翘鎿Q了用于繪制的顏色,假設(shè)該顏色沒有在其他地方使用,但如果您除了修改屬性之外還繪制了某些內(nèi)容,則會(huì)發(fā)生這種情況fill
。 )
javafx.animation
我建議使用包中的一個(gè)類來更改此設(shè)置。
在這種情況下, aPauseTransition
似乎是最簡(jiǎn)單的方法,但如果您想包含更新循環(huán),我建議使用AnimationTimer
orTimeline
代替,并將這種邏輯集成到更新“循環(huán)”中。使用后一種可能性,您可以簡(jiǎn)單地保存球上次撞墻的時(shí)間,并根據(jù)此信息決定使用哪種顏色來繪制背景。
使用示例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();
請(qǐng)注意,您可能需要重繪的不僅僅是背景,因?yàn)?usingfillRect會(huì)替換矩形中當(dāng)前的所有內(nèi)容。
添加回答
舉報(bào)