【问题标题】:XNA Remove Sprites after CollisionXNA 碰撞后移除精灵
【发布时间】:2014-07-11 22:03:28
【问题描述】:

我正在 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);
      }
}

【问题讨论】:

  • 您需要跟踪收集了哪些猕猴桃。您将在一个循环中遍历所有这些,因此您需要跟踪与将标志设置为 true 时对应的那个。

标签: c# xna sprite collision


【解决方案1】:

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

如果你这样做,你需要摆脱 bot (!isCollected)。如果你将 isCollected 设置为 Kiwi 的道具,你可以在 Collision 中插入这样的内容:

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


          }
       }

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

【讨论】:

    【解决方案2】:

    使用单个精灵是正确的决定。 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 ()
         }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多