窗体重绘本身的问题
本文关键字:问题 窗体 | 更新日期: 2023-09-27 17:50:26
我正在制作一款《太空入侵者》游戏。我有一个简单的算法,当入侵者被击中时,它会被移除并添加分数。
问题在这一堆语句中:
if (removeInvaderBool)
{
// removeInvader is an Invader object which was hit, and to be removed.
Invaders.Score += removeInvader.addedScore; //Invader class has got a property with a specific score (e.g. score 50). Score is a static field in the Invaders class.
invaders.Remove(removeInvader);//invaders is a List<Invaders>
}
现在80%的时间,分数正在升级,入侵者正在被移除。另外20%的时间,分数上升,入侵者没有被移除…
为什么…?
我的游戏是在winforms上,Form1_Paint事件处理程序每33毫秒绘制所有图形,游戏计时器每10毫秒运行一次(我使用2个计时器,而不是线程)
为什么有20%的时间入侵者在更新分数时没有被移除?
下面是我的代码的一个更大的摘录:
foreach (var invaderItem in hitInvaders)
{
// if the area of hte alien contains the shot remove the shot.
foreach (var player in playerShots)
{
if (isWeapon)
{
//Me: Will remove players shot.
if (invaderItem.Area.IntersectsWith(player.Area))
{
removeShot = true;
removePlayerShot = player;
removeInvaderBool = true;
}
}
else
{
//Me: Will remove players shot.
if (invaderItem.Area.Contains(player.Location))
{
removeShot = true;
removePlayerShot = player;
removeInvaderBool = true;
}
}
}
// remove the alien that contains the shot
removeInvader = invaderItem;
}
if (removeShot)
{
Invaders.Score += removeInvader.addedScore;
playerShots.Remove(removePlayerShot);
}
if (removeInvaderBool)
{
invaders.Remove(removeInvader);
}
}
调试程序。List<>. remove()返回bool值。使用that:
Invaders.Score += removeInvader.addedScore;
bool ok = invaders.Remove(removeInvader);
System.Diagnostics.Debug.Assert(ok);
当入侵者不在列表中时,调试器将中断。请考虑您可能没有正确实现它的Equals()方法。