如何通过循环调用时间轴在不同时间发生?

时间:2017-03-17 05:22:27

标签: java animation javafx timeline

我目前正在为我的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
    });

}

我可以添加我的所有代码,但现在它相当长,而且有点草率。

举一个我的问题的例子:第一个颜色显示在开始(红色),用户点击红色按钮,现在红色和绿色同时显示。

我想要改变的是,在红色完成之前,绿色不会出现。有没有一种简单的方法可以实现这一点而不会搞砸我的其余代码?

由于

1 个答案:

答案 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);
}