我是Windows Presentation Foundation和C#的初学者。作为一个启动项目,我决定创建,或者我应该说在WPF中重新创建“ Simon”游戏。
Simon游戏形象:
以下是处理闪烁的部分代码:
{
if (watchMode)
{
// In watch mode the user can't click on the simon button.
return;
}
DoubleAnimation opacityClickAnimation = new DoubleAnimation
{
From = 0,
To = 1,
Duration = new Duration(TimeSpan.FromSeconds(0.3)),
AutoReverse = true
};
List<int> clickList = new List<int>();
Path objButton = (Path)sender;
// Switching all the possible options - determining them by name.
// This method is much easier than creating 4 different events.
switch (objButton.Name)
{
case "RedBlock":
RedBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
await Task.Delay(taskDelay);
clickList.Add(redButtonValue);
lightValueClicked = redButtonValue;
break;
case "BlueBlock":
BlueBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
await Task.Delay(taskDelay);
clickList.Add(blueButtonValue);
lightValueClicked = blueButtonValue;
break;
case "OrangeBlock":
OrangeBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
await Task.Delay(taskDelay);
clickList.Add(orangeButtonValue);
lightValueClicked = orangeButtonValue;
break;
case "GreenBlock":
GreenBlockGradient.BeginAnimation(RadialGradientBrush.OpacityProperty, opacityClickAnimation);
await Task.Delay(taskDelay);
clickList.Add(greenButtonValue);
lightValueClicked = greenButtonValue;
break;
}
我希望无论阅读此书的人都熟悉Simon的工作方式,否则请在线进行搜索。我创建了一个双重动画,(opacityClickAnimation)
DoubleAnimation opacityClickAnimation = new DoubleAnimation
{
From = 0,
To = 1,
Duration = new Duration(TimeSpan.FromSeconds(0.3)),
AutoReverse = true
};
上面是闪光灯的不透明度动画。
因此在Simon中,每种颜色都会闪烁,并且两者之间总是会稍有停顿。首先,我不确定如何解决这个问题。 我现在正在做的事情有效,但是我想知道是否有替代方法。我对异步方法和类似的东西不感兴趣-我的程序是同步的-我正在寻找一种在闪烁之间暂停的同步方法。
我也意识到这段代码并不完美-我应该使用Tasks而不是异步void方法-这就是为什么我正在寻找同步替代方法
答案 0 :(得分:1)
您可以通过附加到Completed
事件来将动画排队:
<Storyboard x:Name="MyStoryboard" Completed="MyStoryboardCompleted" ...>
以及您后面的代码中
private async void MyStoryboardCompleted(object sender, EventArgs e)
{
await Task.Delay(delay); // wait
StartMyNextAnimation(); // start next
}