瓷砖引擎碰撞

时间:2012-03-25 16:18:21

标签: c# xna collision tile

好的,所以,我正在制作一个基于小块的挖掘游戏,现在我想做碰撞。我该如何正确地做到这一点?我知道如何检查玩家是否与瓷砖碰撞,但我不知道如何让玩家在碰到墙壁时停下来。

enter image description here

这是游戏,我在这里获得了20x20的牌。

这是我正在使用atm的代码:

            foreach (Tile tiles in allTiles)
        {
            if (ply.rect.Intersects(tiles.rect))
            {
                if (tiles.ID != -1 && tiles.ID != 1)
                {
                    if (ply.X > tiles.X)
                    {
                        Console.WriteLine("Right part.");
                        ply.X = tiles.pos.X + 30;
                    }

                    if (ply.X <= tiles.X)
                    {
                        Console.WriteLine("Left part.");
                        ply.X  = tiles.pos.X - 30;
                    }

                    if (ply.Y > tiles.Y) 
                    {
                        Console.WriteLine("Bottom part.");
                        ply.Y = tiles.pos.Y + 30;
                    }

                    if (ply.Y <= tiles.Y) 
                    {
                        Console.WriteLine("Upper part.");
                        ply.Y = tiles.pos.Y - 30;
                    }
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

您使用什么类型的碰撞检测?

如果你使用矩形和'.intersects'方法,你总是可以声明一个bool来确保你的角色接触到地板。如果他不是你,你应用一个重力矢量使其落入下一个具有不同矩形的平铺,所以当他击中它时他将会停止下降。

如果你想阻挡他从一边到另一边只是测试看他正在触摸的矩形的哪一边并阻止他在'X'轴上移动。 例如,如果他向右移动并与矩形的左边部分相交,那么阻挡就是“GoingRight”运动。

    if(myCharacterRectangle.Intersects(tileRectangle)
    {

        if(myCharacterPosition.X > (tilePosition.X)
       {
         //You know the character hits the Right part of the tile.
       }

        if(mycharacterPosition.X <= tilePosition.X)
       {
         //You know the character hits the Left Part of the tile.
       }

    }

如果你想测试顶部或底部,那么Position.Y也是如此。

如果你想使用矩阵使用Pixel by Pixel碰撞检测我知道一个很好的教程here。 如果没有碰撞,检测将返回'Vector2(-1,-1)'。 如果有一个方法,该方法将返回碰撞的坐标,这使得更容易确定角色正在触摸的图块的哪个部分。

希望这会有所帮助。祝你好运。