窗体重绘本身的问题

本文关键字:问题 窗体 | 更新日期: 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()方法。