我正在构建一个太空入侵者游戏。我有一个简单的算法,可以在射击时删除入侵者并添加分数。
问题在于这一系列的陈述:
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);
}
}
答案 0 :(得分:1)
调试你的程序。 List&lt;&gt; .Remove()返回一个bool。利用它:
Invaders.Score += removeInvader.addedScore;
bool ok = invaders.Remove(removeInvader);
System.Diagnostics.Debug.Assert(ok);
当入侵者不在列表中时,调试器将中断。请考虑您可能没有正确实现其Equals()方法。