Я строю игру Space Invaders. У меня есть простой алгоритм, который удаляет захватчика, когда он выстрелил, и добавляет счет.
Проблема в этой связке оценок:
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);
}
}