如何使主窗体暂停执行1秒,然后在c#中继续执行?
我正在创建一个纸牌游戏,我需要一个方法执行暂停,而一张牌正在屏幕上动画。目前我有这个,它动画卡罚款,但将继续玩游戏,而卡是动画。我不知道该怎么办。我尝试了Thread.Sleep(),但它仍然继续执行所有可能的操作,然后暂停如何使主窗体暂停执行1秒,然后在c#中继续执行?,c#,winforms,C#,Winforms,我正在创建一个纸牌游戏,我需要一个方法执行暂停,而一张牌正在屏幕上动画。目前我有这个,它动画卡罚款,但将继续玩游戏,而卡是动画。我不知道该怎么办。我尝试了Thread.Sleep(),但它仍然继续执行所有可能的操作,然后暂停 private void btnPlay_Click(object sender, EventArgs e) { try { string input = Microsoft.V
private void btnPlay_Click(object sender, EventArgs e)
{
try
{
string input = Microsoft.VisualBasic.Interaction.InputBox("Please enter your betting amount (£3.00 minimum bet)", "Play", "3.00", -1, -1);
bet = double.Parse(input);
if (Globals.Balance > bet)
{
btnHit.Enabled = true;
btnStick.Enabled = true;
Globals.Balance -= bet;
lblBalance.Text = Globals.Balance.ToString();
Play();
}
else
{
throw new Exception("You don't have enough money!");
}
}
catch (FormatException)
{
MessageBox.Show("Incorrect format for betting amount");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Play()
{
ClearDetails();
DealPlayerCard();
Classes.Deck.NextCard(Deck);
DealPlayerCard();
UpdatePlayerTotal();
}
private void DealPlayerCard()
{
//does stuff here
switch (cardNum)
{
case 3:
pb.Location = new Point(120, 0);
timerCard.Enabled = true;
timerCard_Tick(null, null);
break;
case 4:
pb.Location = new Point(180, 0);
timerCard.Enabled = true;
timerCard_Tick(null, null);
break;
case 5:
pb.Location = new Point(240, 0);
timerCard.Enabled = true;
timerCard_Tick(null, null);
break;
}
AddPlayerCard(pb);
AddToHand("Player");
}
private void timerCard_Tick(object sender, EventArgs e)
{
this.SuspendLayout();
//sets x and y in a switch statement here
if ((CardBack.Location.X == x) && (CardBack.Location.Y == y))
{
timerCard.Enabled = false;
CardBack.Visible = false;
CardBack.Location = new Point(775, 247);
this.ResumeLayout();
}
else if ((CardBack.Location.X > 417) && (CardBack.Location.Y < 434))
{
CardBack.Location = new Point(CardBack.Location.X - 1, CardBack.Location.Y + 1);
timerCard_Tick(null, null);
}
else if ((CardBack.Location.X > 417) && (CardBack.Location.Y == 434))
{
CardBack.Location = new Point(CardBack.Location.X - 1, CardBack.Location.Y);
timerCard_Tick(null, null);
}
else if ((CardBack.Location.X == 417) && (CardBack.Location.Y < 434))
{
CardBack.Location = new Point(CardBack.Location.X, CardBack.Location.Y + 1);
timerCard_Tick(null, null);
}
}
private void btnPlay\u单击(对象发送方,事件参数e)
{
尝试
{
string input=Microsoft.VisualBasic.Interaction.InputBox(“请输入您的下注金额(最低下注3英镑)”、“玩”、“3.00”、-1、-1);
bet=double.Parse(输入);
如果(Globals.Balance>bet)
{
btnHit.Enabled=true;
btnStick.Enabled=true;
全球。余额-=赌注;
lblBalance.Text=Globals.Balance.ToString();
Play();
}
其他的
{
抛出新的异常(“你没有足够的钱!”);
}
}
捕获(格式化异常)
{
MessageBox.Show(“下注金额格式不正确”);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
私人虚空游戏()
{
ClearDetails();
DealPlayerCard();
类别.甲板.下一卡(甲板);
DealPlayerCard();
UpdatePlayerTotal();
}
私有void DealPlayerCard()
{
//这里有东西吗
开关(cardNum)
{
案例3:
pb.位置=新点(120,0);
timerCard.Enabled=true;
timerCard_Tick(空,空);
打破
案例4:
pb.位置=新点(180,0);
timerCard.Enabled=true;
timerCard_Tick(空,空);
打破
案例5:
pb.位置=新点(240,0);
timerCard.Enabled=true;
timerCard_Tick(空,空);
打破
}
AddPlayerCard(pb);
AddToHand(“玩家”);
}
私有void timerCard_Tick(对象发送方、事件参数e)
{
这个.SuspendLayout();
//在此处的switch语句中设置x和y
if((CardBack.Location.X==X)和&(CardBack.Location.Y==Y))
{
timerCard.Enabled=false;
CardBack.Visible=false;
位置=新点(775247);
这是resumeloayout();
}
否则如果((CardBack.Location.X>417)和&(CardBack.Location.Y<434))
{
CardBack.Location=新点(CardBack.Location.X-1,CardBack.Location.Y+1);
timerCard_Tick(空,空);
}
else if((CardBack.Location.X>417)和&(CardBack.Location.Y==434))
{
CardBack.Location=新点(CardBack.Location.X-1,CardBack.Location.Y);
timerCard_Tick(空,空);
}
else if((CardBack.Location.X==417)和&(CardBack.Location.Y<434))
{
CardBack.Location=新点(CardBack.Location.X,CardBack.Location.Y+1);
timerCard_Tick(空,空);
}
}
启用计时器会立即返回,并且计时器事件会单独发生,这就是为什么您会看到游戏继续进行
相反,在动画完成后,将游戏的其余部分移动到计时器事件。像这样(伪代码):
我想您可能有一些示例中没有的游戏循环,您可能还需要暂停。您是否可以编辑您的帖子以包括调用
DealPlayerCard
的位置?如果它是一个事件处理程序,您可以将其标记为async void
并使用wait Task.Delay(1000)代码>我已经编辑过,它也会从btnHit事件处理程序以及btnPlayYou在click处理程序中执行很多不应该执行的操作。不过,我担心建议一个更好的架构实在太宽泛了。也许你应该研究一下如何设计这种类型的游戏。我猜您可能希望某种队列或调度程序在应该发生的时候让事情发生。在根解释中通常是正确的,但是请注意,这不会像预期的那样起作用,因为“continueGame”将在TimerRead的上下文中执行,而不是在主线程中执行。一般来说,最好使用完全不同的方法在屏幕上“呈现”内容。@JorgeCórdoba:在一个致力于正确回答用户问题的网站上纠正错误是不礼貌的,这种想法很奇怪;指出错误没有什么不礼貌的。在这种情况下,以及所有这些情况下,我都对了解人们是如何形成对编程的信念感兴趣,因为这有助于我设计更好的对象模型、更好的文档等等,从而在开始之前防止可能的错误。你能说说为什么你认为windows窗体应用程序可能使用线程计时器吗?@JorgeCórdoba:我还注意到,我从来没有说过你错了;如果你因为某种原因感到尴尬,那不是我的责任。到目前为止,我所做的只是(1)请您解释为什么计时器会回调错误的线程,(2)确认在winforms中使用线程计时器被记录为错误的,(3)指出我没有看到任何证据表明用户正在这样做
private void DealPlayerCard()
{
//does stuff here
timer.Enabled = true;
// no more code
}
private void timerCard_Tick(object sender, EventArgs e)
{
switch (location)
case first:
DoSomeStuff();
case next:
DoSomeOtherStuff();
case finished:
timer.enabled = false;
continueGame();
}