2012-04-29 3 views
1

Я читаю книгу «Изучение XNA 4.0», и я в объектно-ориентированной части дизайна. У меня возникла странная проблема с столкновением из двух прямоугольников.XNA столкновения странное поведение

У меня есть список automateSprite и класс игрока, оба производные от класса Sprite. В методе обновления я проверяю игру, а прямоугольники aotomatedSprite касаются друг друга, теперь, когда я перебрался через список, у меня есть строка, называемая касанием, представляющая столкновение.

Моя проблема заключается в том, что прикосновение можно изменить, только если игрок Sprite коснется последнего automateSprite в списке.

Код, предлагаемый для тестирования, должен состоять из Game.Exit(), если обнаружен какой-либо конфликт. Это работает с каждым автоматическимSprite в списке, но когда я меняю его на мой простой тест, он действует, как будто я проверяю только последний элемент из списка из 4 automaticSprite.

вот код:

string touching = ""; 
public override void Update(GameTime gameTime) 
    { 
     // TODO: Add your update code here 
     player.Update(gameTime, Game.Window.ClientBounds); 

     foreach (Sprite sprite in spriteList) 
     { 
      sprite.Update(gameTime, Game.Window.ClientBounds); 
      if (sprite.collisionRect.Intersects(player.collisionRect)) 
       touching = "touching"; 
      else 
       touching = "not touching"; 
     } 

     base.Update(gameTime); 
    } 

    public override void Draw(GameTime gameTime) 
    { 
     spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend); 


     spriteBatch.DrawString(font, touching, Vector2.Zero, Color.Red); 

     player.Draw(gameTime, spriteBatch); 
     foreach (Sprite sprite in spriteList) 
     { 
      sprite.Draw(gameTime, spriteBatch); 

     } 

     spriteBatch.End(); 
     base.Draw(gameTime); 
    } 

Редактировать --------------------------------- ---------------------------------------- Решение: Я прошу об этом в игре и я получил ответ. Я должен был иметь break; в цикле foreach, чтобы он не продолжал идти после того, как он нашел столкновение.

ответ

2

Это потому, что ваш код постоянно перезаписывает трогательную переменную, поэтому в итоге представлен только последний результат.

Перед Еогеаспом, сбросить трогательные переменный с touching = ""; и продлить, если так:

if (sprite.collisionRect.Intersects(player.collisionRect) || touching == "touching") 

Таким образом, вы получите «прикосновение», если какие-либо из спрайтов касается ваших игроков спрайта.

+0

спасибо, но он все равно дал мне тот же результат, я спросил его в игре devlopment и 1 сказал мне использовать перерыв в foreach, когда есть какой-либо конфликт. – samy

+0

Хорошо, исправил. Во всяком случае, это тоже может работать. – Matzi

Смежные вопросы