在碰撞后移除精灵

本文关键字:精灵 碰撞 | 更新日期: 2023-09-27 18:12:38

我正在制作一款XNA游戏,玩家在屏幕上移动"收集"猕猴桃(猕猴桃是动物,不是水果)。我希望当玩家与几维鸟碰撞时,几维鸟精灵就会消失。

到目前为止,我只能在碰撞发生时让所有的几维鸟消失。我只希望每个单独的精灵在碰撞中消失。我对所有的猕猴桃都使用了相同的精灵。

碰撞函数:

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

              }
           }
      }

}

kiwiRectangle是一个数组,包含在绘制的每个kiwi精灵周围创建的矩形。

然后在Draw()函数中:
if (!isCollected)
{
      foreach (Vector2 position in kiwiPosition)
      {
           spriteBatch.Draw(kiwi, position, Color.White);
      }
}

在碰撞后移除精灵

你应该让iscollect成为Kiwi的一个属性,这样每个Kiwi都有它自己的iscollect。

如果这样做,则需要删除bot (!isCollected)。对于碰撞,你可以像这样插入一些东西,如果你让iscollect成为Kiwi的一个道具:

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

          }
       }

因为我不知道kiwiPosition是如何建立的,所以我不能给你建议如何解决Draw

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

为什么需要标记isCollected?创建一个小类,只保留每个kiwi的单独数据

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

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