我正在尝试使用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
?
感谢您的帮助。
答案 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作为方法名称。