【发布时间】:2020-06-25 13:21:32
【问题描述】:
我现在编程已经 3 周了,所以我尝试构建一个记忆游戏。
一切正常,除了延迟。我尝试了许多不同的选项,但不知何故,延迟出现在 Button_Click 事件的末尾。
如果我单击第一个按钮,它会更改内容,但是当我单击第二个按钮时
按钮无论触发哪个if 语句,第二张卡片都不会显示。代码工作正常,直到事件结束 THEN 3 秒的延迟发生
我想要实现的是你可以在短时间内看到第二张卡片 在两张牌被翻回或消失之前。
附: - 如果我在“延迟”之后添加MessageBox 似乎有效
但这不是目标,所以是否有诸如等待同步之类的东西或我错过的东西?
代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
int index = ContainderGrid.Children.IndexOf(button);
mCounterSecondPic++;
button.Content = new BitmapImage(new Uri(mImgPath[mPairs[index]]));//change content
mPic[mCounterSecondPic-1] = mPairs[index];
button.IsEnabled = false;
if (mPic[0] == mPic[1] & mCounterSecondPic == 2)
{
mCounterSecondPic = 0;
new System.Threading.ManualResetEvent(false).WaitOne(3000); //wait for 3sec
ContainderGrid.Children.RemoveAt(mPairs.IndexOf(mPic[0]));
mPairs.RemoveAt(mPairs.IndexOf(mPic[0]));
ContainderGrid.Children.RemoveAt(mPairs.IndexOf(mPic[0]));
mPairs.RemoveAt(mPairs.IndexOf(mPic[0]));
}
if (mCounterSecondPic == 2 & mPic[0] != mPic[1])
{
mCounterSecondPic = 0;
new System.Threading.ManualResetEvent(false).WaitOne(3000);//wait for3 sec
ContainderGrid.Children.Cast<Button>().ToList().ForEach(resetbuttons =>
{
resetbuttons.IsEnabled = true;
resetbuttons.Content = new BitmapImage(new Uri(mCardBack));
});
}
ps:如果我在“延迟”之前添加一个消息框,它似乎可以工作 但这不是 gole,所以有什么类似等待同步或我错过的东西吗?
MessageBox.Show("x");
new System.Threading.ManualResetEvent(false).WaitOne(3000);
【问题讨论】:
-
使用计时器 - 需要时启动和停止。
-
查找
Task.Delaydocs.microsoft.com/en-us/dotnet/api/… -
我想建议阅读有关游戏编程的内容。这个想法是在游戏中编写一些时钟,它将向“经过一个时间间隔”的对象发送消息。然后对象可以检查内部状态并在“时间”时执行某些操作。您可以查看quartz.net 或Reactive。您可以使用Thread.Sleep 来简单地等待 N 毫秒