我目前正在为我的Java课程编写一个作业,我需要在其中创建一个类" Simon Says"游戏(按顺序猜测颜色)。我的问题出现在我尝试显示第二种颜色时,它与第一种颜色完全相同。
调用方法使颜色闪烁的循环如下所示:
private void GameCycle(ArrayList<Color> colorSequence)
{
colorSequence.add(generateColor());
for(int i = 0; i<colorSequence.size(); i++)
{
Color colorRef = colorSequence.get(i);
if (colorRef != null)
{
showColor(findRect(colorRef), colorRef);
}
}
getGuesses(colorSequence);
}
然后我的代码显示颜色如下:
private void showColor(Rectangle shapeToChange, Color colorToChangeTo)
{
toggleVisibility(); //make buttons invisible when displaying a color
KeyFrame swapColor = new KeyFrame(Duration.millis(0), f->{ //Occurs immediately
shapeToChange.setFill(colorToChangeTo); //change to the inputed color
});
KeyFrame swapColorBack = new KeyFrame(Duration.millis(1000), f->{ //Occurs after 1 second into the cycle
shapeToChange.setFill(Color.BLACK); //change back to black
});
Timeline anim = new Timeline(swapColor, swapColorBack);
anim.setCycleCount(1); //Animation will play once
anim.play();
anim.setOnFinished(e ->{
toggleVisibility(); //make buttons visible
});
}
我可以添加我的所有代码,但现在它相当长,而且有点草率。
举一个我的问题的例子:第一个颜色显示在开始(红色),用户点击红色按钮,现在红色和绿色同时显示。
我想要改变的是,在红色完成之前,绿色不会出现。有没有一种简单的方法可以实现这一点而不会搞砸我的其余代码?
由于
答案 0 :(得分:0)
我认为您的问题是您正在创建并行运行的多个Animation
。您只需创建一个Animation
并将所有KeyFrame
添加到其中:
private void GameCycle(ArrayList<Color> colorSequence)
{
colorSequence.add(generateColor());
Timeline anim = new Timeline();
anim.setCycleCount(1); //Animation will play once
for(int i = 0; i<colorSequence.size(); i++)
{
Color colorRef = colorSequence.get(i);
if (colorRef != null)
{
showColor(anim, i, findRect(colorRef), colorRef);
}
}
anim.play();
anim.setOnFinished(e ->{
toggleVisibility(); //make buttons visible
});
getGuesses(colorSequence);
}
private void showColor(Timeline anim, int step, Rectangle shapeToChange, Color colorToChangeTo)
{
toggleVisibility(); //make buttons invisible when displaying a color
KeyFrame swapColor = new KeyFrame(Duration.millis(1000*step), f->{ //Occurs immediately
shapeToChange.setFill(colorToChangeTo); //change to the inputed color
});
KeyFrame swapColorBack = new KeyFrame(Duration.millis(1000*(step+1)), f->{ //Occurs after 1 second into the cycle
shapeToChange.setFill(Color.BLACK); //change back to black
});
anim.getKeyFrames().add(swapColor);
anim.getKeyFrames().add(swapColorBack);
}