【问题标题】:Tile Engine Collision瓷砖引擎碰撞
【发布时间】:2012-04-09 08:15:53
【问题描述】:

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

这就是游戏,我这里有 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;
                    }
                }
            }
        }

【问题讨论】:

  • 你在制作Terraria吗?
  • @Marty Wallace:嗯,我正在做某种克隆,是的。

标签: c# xna collision tile


【解决方案1】:

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

如果你使用 Rectangles 和 '.intersects' 方法,你总是可以声明一个布尔值来确保你的角色接触到地板。如果他不是,您应用重力矢量使其落到具有不同矩形的下一个 Tile 上,这样当他击中它时,他将停止下落。

如果您想从一侧到另一侧阻止他,只需测试他正在触摸矩形的哪一侧并阻止他在“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 也是如此。

如果您想通过矩阵使用逐像素碰撞检测,我知道一个很好的教程here。 如果没有碰撞,检测将返回“Vector2(-1,-1)”。 如果有一个,该方法将返回碰撞的坐标,这样可以更轻松地确定您的角色正在触摸瓷砖的哪个部分。

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

【讨论】:

  • 我看到了和你类似的问题。也许这就是你需要的dreamincode.net/forums/topic/…
  • 我试过左右敲击瓷砖,但它不起作用,它一直说它敲击左侧,无论我在哪里。碰撞很烦人,因为它一次会撞到很多块。
  • 好的,我过几分钟试试看问题出在哪里
  • 只需替换 : if(myCharacterPosition.X >= (tilePosition.X + tileTexture.Width)) 我会在我的答案中更改它
  • 所以我将运算符 >= 更改为一个简单的 > 并删除了 +tileTexture 部分,这应该可以解决 Always hit left 问题。是的,碰撞总是很烦人。只需确保所有矩形的大小都正确,并检查双重碰撞不会破坏您的逻辑。例如,如果你做一个方块破坏游戏并且碰撞产生了反弹效果 Position * -1 同时击中两个方块会做 Position *-1 两次,所以 Position *1 这根本不是我们想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多