矩形碰撞检测xna

时间:2016-05-05 21:45:07

标签: c# xna collision

大家好我最近开始制作自己的平台游戏,我设法使用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);
            }
        }           
    }

3 个答案:

答案 0 :(得分: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);
       }
    }
 }

答案 1 :(得分:0)

@Nahuel Ianni所说的非常适合检测碰撞。现在,你没有指定你需要碰撞的东西,我可以看到你很可能需要它来摧毁敌人和子弹,@ Nahuel Ianni很好地解释了,但我想你呢? ll还需要玩家和墙壁之间的碰撞

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

* nextRectangle代表你的玩家的Rectangle(身体),由速度/力量(无论什么逻辑适合你)移动。那是下一帧中的主体。因此,您可以说,您需要了解游戏流程的未来,以获得最佳的碰撞效果(并避免玩家在墙内)。

答案 2 :(得分:0)

要检查冲突的每个对象都应包含Rectangle。这样,你可以做到

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