winform重绘自身的问题

时间:2011-04-16 19:58:39

标签: c# winforms timer paint

我正在构建一个太空入侵者游戏。我有一个简单的算法,可以在射击时删除入侵者并添加分数。

问题在于这一系列的陈述:

   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);
            }
        }

1 个答案:

答案 0 :(得分:1)

调试你的程序。 List&lt;&gt; .Remove()返回一个bool。利用它:

            Invaders.Score += removeInvader.addedScore;
            bool ok = invaders.Remove(removeInvader);
            System.Diagnostics.Debug.Assert(ok);

当入侵者不在列表中时,调试器将中断。请考虑您可能没有正确实现其Equals()方法。