2012-03-25 109 views
2

好吧,我正在制作一个小型的基于瓦片的挖掘游戏,现在我想要做碰撞。我会如何正确地做这件事?我知道如何检查玩家是否与瓦片发生碰撞,但是我不知道如何让玩家在碰到墙壁时停下来。平铺引擎碰撞

enter image description here

这是游戏,我得到了20×20瓦这里。

这是代码我使用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; 
        } 
       } 
      } 
     } 
+0

您是否在制作['Terraria'](http://terraria.org/)? – Marty 2012-03-26 00:30:40

+0

@Marty华莱士:嗯,我正在做一些克隆,是的。 – Stan 2012-03-26 05:36:02

+0

啊,真棒^ _^ – Marty 2012-03-26 05:37:59

回答

1

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

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

如果您想阻止他左右移动,只需测试他正在触摸的矩形的哪一侧,并阻止他在“X”轴上移动。例如,如果他正在向右走并与矩形的左侧部分相交,则块是'走向右'运动。

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. 
     } 

    } 

如果你想测试Top或Bottom,Position.Y也是一样。

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

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

+0

我看到类似于你的问题。 也许这就是你需要的 http://www.dreamincode.net/forums/topic/167529-xna-tile-collision-detection/ – phadaphunk 2012-03-25 19:56:59

+0

感谢您的帮助,我会尝试尽快完成这项工作。 – Stan 2012-03-25 21:27:12

+0

我试过这个左右碰瓷砖,但它不起作用,它不停地说它正在撞到左侧,不管我在哪里。碰撞令人讨厌,因为它一次撞击了很多方块。 – Stan 2012-03-25 22:39:52