XNA在碰撞后删除精灵

时间:2014-07-11 22:03:28

标签: c# xna sprite collision

我正在XNA制作游戏,玩家在屏幕上移动'收集'猕猴桃(动物,而不是水果)。我想做到这一点,当玩家与奇异鸟相撞时,奇异果精灵就会消失。

到目前为止,我只能在发生碰撞时让所有的猕猴桃消失。我只想让每个精灵在碰撞中消失。我正在为所有的猕猴桃使用相同的精灵。

这是碰撞功能:

void Collision()
{
     if (!isCollected)
     {
          foreach (Rectangle kiwi in kiwiRectangle)
          {
              if (kiwi.Intersects(Sprite.spriteDestinationRectangle))
              {
                  isCollected = true;


              }
           }
      }


}

kiwiRectangle是一个数组,其中包含围绕每个绘制的奇异果精灵创建的矩形。

然后在Draw()函数中:

if (!isCollected)
{
      foreach (Vector2 position in kiwiPosition)
      {
           spriteBatch.Draw(kiwi, position, Color.White);
      }
}

3 个答案:

答案 0 :(得分:0)

你应该使isCollected成为Kiwi的一个属性,所以每个Kiwi都拥有它自己的isCollected。

如果你这样做,你需要摆脱僵尸(!isCollected)。对于碰撞,如果你将isCollected设为Kiwi的支柱,你可以插入这样的东西:

      foreach (Rectangle kiwi in kiwiRectangle)
      {
          if (!kiwi.isCollected && kiwi.Intersects(Sprite.spriteDestinationRectangle))
          {
              isCollected = true;


          }
       }

由于我无法判断kiwiPosition是如何构建的,所以我无法告诉你如何解决这个问题。

答案 1 :(得分:0)

使用单精灵是正确的决定。 XNA清楚地分配了两个方法 - Update和Draw,因为它暗示数据及其表示是两个不同的东西。

为什么你需要一个标志isCollected?创建一个只保留每个奇异果的个别数据的小类

class Kiwi
{
     public Vector2 position;

     public bool Intersect (Vector2 pPlayerPosition)
     {
         // Return true if this kiwi's rectangle intersects with player rectangle
     }
}

并像这样使用

List <Kiwi> kiwis;
Vector2 playerPosition;
Texture2D kiwiTexture;
Initialize ()
{
     this.kiwis = new Kiwi ();
     // Add some kiwi to collection
}

LoadContent ()
{
     this.kiwiTexture = Content.Load <Texture2D> (...);
}

Update (GameTime pGameTime)
{
     if (! this.isGameOwer)
     {
         // Update playerPosition
         playerPosition = ...

         // Then check collisions
         for (int i = 0; i <this.Kiwis.Count ;)
         {
             if (this.Kiwis [i]. Intersect (playerPosition))
             {
                 this.Kiwis.RemoveAt (i);
                 / / Add points to score or whatever else ...
             }
             else
             {
                 i + +;
             }
         }

         if (this.Kiwis.Count == 0)
         {
             // All kiwis colelcted - end of game
             this.isGameOwer = true;
         }
     }
}

Draw (GameTime pGameTime)
{
     if (! this.isGameOwer)
     {
         this.spritebatch.Begin ();

         // Draw kiwis
         for (int i = 0; i <this.Kiwis.Count ;)
         {
             Vector2 kiwiDrawPosition = new Vector2 (
                 this.Kiwis [i]. position.X - kiwiTexture.Width * 0.5f,
                 this.Kiwis [i]. position.Y - kiwiTexture.Height * 0.5f);
             this.spritebatch (
                 this.kiwiTexture,
                 kiwiDrawPosition,
                 Color.White);
         }

         // Draw player
         ...

         this.spritebatch.end ()
     }
}

答案 2 :(得分:0)

我会给每个Kiwi一个isAlive布尔值。 当发生碰撞时,将特定Kiki的isAlive布尔值设置为false,然后在draw / update方法中循环遍历所有Kiwi,并且只有在isAlive = true时才绘制/更新它们。