Проблема с перерисовкой winform - PullRequest
0 голосов
/ 16 апреля 2011

Я строю игру 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);
            }
        }

1 Ответ

1 голос
/ 17 апреля 2011

Отладка вашей программы. List <>. Remove () возвращает логическое значение. Используйте это:

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

Отладчик сломается, когда захватчик отсутствует в списке. Учтите, что вы, возможно, неправильно реализовали его метод Equals ().

...