【问题标题】:rectangle collision detection xna矩形碰撞检测 xna
【发布时间】:2016-08-31 20:15:49
【问题描述】:

大家好,我最近开始制作自己的平台游戏,我已经成功地使用 2d 数组创建了地图,并且还创建了具有运动的玩家。 我现在陷入了如何处理矩形碰撞侧的问题,非常感谢任何帮助。

这是我创建地图的方法,现在我只需要弄清楚如何处理碰撞。

    List<Texture2D> tileTextures = new List<Texture2D>();
    private const int tileWidth = 64;
    private const int tileHeight = 64;


    public void Draw(SpriteBatch spriteBatch, Camera camera)
    {         
        int tileMapWidth = tileMap.GetLength(1);
        int tileMapHeight = tileMap.GetLength(0);

        for (int x = 0; x < tileMapWidth; x++)
        {
            for (int y = 0; y < tileMapHeight; y++)
            {
                int textureIndex = tileMap[y, x];
                Texture2D texture = tileTextures[textureIndex];

                spriteBatch.Draw(
                    texture,
                    new Rectangle(x * tileWidth - (int)camera.cameraPosition.X,
                        y * tileHeight - (int)camera.cameraPosition.Y,
                        tileWidth,
                        tileHeight),
                    Color.White);
            }
        }           
    }

【问题讨论】:

  • 我记得当我开始使用 XNA 时,你有一个带有 intersects 方法的矩形类,你可以用它来确定一个对象是否与另一个对象发生碰撞
  • 你知道我会如何比较我的播放器矩形和我的图块吗?当我每次在平铺绘制函数中设置一个新矩形时,但我不知道如何实际调用它来检查它是否相交。
  • 如果你在做 XNA,你可能应该有一个update, 方法,你可以遍历你所有的玩家和瓷砖,创建一个新的矩形,并检查那里的碰撞
  • 所以我为我的播放器创建了一个函数,如下所示: public Rectangle BoundingBox { get { return new Rectangle( (int)position.X, (int)position.Y, spriteWidth, spriteHeight);但我仍然不确定如何从上面发布的代码中检索平铺矩形,以便我可以使用 intersects 函数,您有什么建议吗?

标签: c# xna collision


【解决方案1】:

您可以使用对象的Rectangle 并使用它的Intersect 方法来检查它们是否碰撞。

您可以在我的blog 上找到一个非常简单的示例,说明如何检查矩形碰撞,用户点击敌人即可摧毁它:

if (mouseState.LeftButton == ButtonState.Pressed)
{
   for (int index = this.enemies.Count - 1; index >= 0; index--)
   {
       if (this.enemies[index].Intersects(
              new Rectangle((int)this.mouseCoordinates.X, 
                            (int)this.mouseCoordinates.Y,     
                            this.mouseTexture.Width, 
                            this.mouseTexture.Height)))
       {
            this.enemies.RemoveAt(index);
       }
    }
 }

【讨论】:

    【解决方案2】:

    @Nahuel Ianni 所说的内容非常适合检测碰撞。现在,您没有指定需要碰撞的目的,我可以看到您很可能需要它来摧毁敌人和子弹,@Nahuel Ianni 解释得很好,但我认为你'还需要玩家和墙壁之间的碰撞

    Shaun Spalding 在this tutorial(用于 GameMaker)中就如何检测和解决平台游戏中的碰撞提出了很好的观点,该平台也可用于鸟瞰游戏。简而言之,在他的教程中,他向您解释了如何获取播放器的 nextRectangle* 并检查它是否与墙壁发生碰撞,如果是,只需将播放器移到该墙壁旁边。这样一来,您就不会在框架内看到玩家在墙内/玩家不会被卡在墙内。

    *nextRectangle 代表你的玩家的Rectangle(身体),由速度/力量移动(无论逻辑适用于你)。这就是下一帧中的主体。因此,您可以说您需要研究游戏流程的未来,以获得最佳的碰撞结果(并避免玩家进入墙内)。

    【讨论】:

      【解决方案3】:

      您要检查冲突的每个对象都应该有一个Rectangle。这样就可以了

      bool isHit=obj1.Rect.Intersects(obj2.Rect);
      

      【讨论】:

        猜你喜欢
        • 2015-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多