怎么等到计时器停止?

时间:2012-12-07 12:16:00

标签: c# winforms timer wait

我正在尝试使用C#构建二十一点游戏。 我有一个赌场类和玩家,卡和甲板课,它们是赌场的对象。 赌场将随机牌发给具有以下功能的玩家:

        public void giveRandomCardTo(Player P)
        {
            P.takeCard(this.deck.getRandomCard());
        }

这很好用,但后来我想添加一个动画,就像一个封闭的卡片图像移动到播放器的卡片图片框,使用计时器。所以我将这部分添加到函数中:

public void giveRandomCardTo(Player P)
        {
            while (_timerRunning) {/*wait*/ }
            this.currentDealingID = P.id;
            if (this.currentDealingID >= 0 && this.currentDealingID < this.NumberOfPlayers && this.currentDealingID!=10) 
            {//Checking the current player is not the dealer.
                this.MovingCard.Show(); //Moving card is a picture box with a closed card
                _timerRunning=true;
                T.Start();
            }
            P.takeCard(this.deck.getRandomCard());    
        }

和Timer T的Timer.Tick事件处理程序是:

public void TimerTick(object sender, EventArgs e)
{
              movingcardvelocity = getVelocityFromTo(MovingCard.Location, this.Players[this.currentDealingID].CardPBS[0].Location);
              double divide=5;
              movingcardvelocity = new Point((int)(movingcardvelocity.X / divide), (int)(movingcardvelocity.Y / divide));
              this.MovingCard.Location = new Point(this.MovingCard.Location.X + movingcardvelocity.X, this.MovingCard.Location.Y + movingcardvelocity.Y);
//Stop if arrived:
              double epsilon = 20;
              if (Distance(this.MovingCard.Location, this.Players[this.currentDealingID].CardPBS[0].Location) < epsilon) 
    {
    _timerRunning=false;  
    this.MovingCard.Hide();
    T.Stop();
    }
}

计时器工作得很好。但是当我一个接一个地发牌时,我必须等到第一个动画结束。 while(_timerRunning){/*wait*/}中的void giveRandomCardTo行将程序置于无限循环中。

如何让它等到bool _timerRunning = false

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

对您有帮助 - WaitHandle.WaitOne方法

有一个例子可以重复使用/修改

答案 1 :(得分:1)

你不需要等待。只需从Tick事件处理程序调用您的方法,而不使用_timerRunning标志。停止计时器并将卡片给玩家:

T.Stop(); 
this.MovingCard.Hide();
giveRandomCardTo(this.Players[this.currentDealingID]);

我还创建了一个方法IsCardArrivedTo(Point location)来简化条件逻辑:

public void TimerTick(object sender, EventArgs e)
{
     var player = Players[currentDealingID];
     Point pbsLocation = player.CardPBS[0].Location;
     MoveCard();

     if (IsCardArrivedTo(pbsLocation)) 
     {        
        MovingCard.Hide();
        T.Stop();
        giveRandomCardTo(player);
     }
}

private bool IsCardArrivedTo(Point location)
{
    double epsilon = 20;
    return Distance(MovingCard.Location, location) < epsilon;
}

private void MoveCard()
{
   // calculate new location
   MovingCard.Location = newLocation;
}
在C#中

BTW 我们使用CamelCasing作为方法名称。