2017-09-04 85 views
0

我用瓷砖和玩家创建了一个小型游戏,我试图在碰撞检测中编程。所以,当角色向左('A')工作时,我设法发生了碰撞,但在向右('D')时它不起作用。这是我的代码:(C#XNA)只通过一个方向穿过物体的字符

public bool ColX(Texture2D sprite, Vector2 pos, float speed) 
    { 
     float PosLeftX = pos.X; 
     float PosUpY = pos.Y; 
     float PosRightX = pos.X + sprite.Width; 
     float PosDownY = pos.Y + sprite.Height; 
     float DestX = pos.X + speed; 
     Vector2 tileTopLeft = GetTile(PosLeftX, PosUpY); //using PosLeftX and PosLeftY to set top left tile to a variable 
     Vector2 tileBotLeft = GetTile(PosLeftX, PosDownY); 
     Vector2 tileTopRight = GetTile(PosRightX, PosUpY); 
     Vector2 tileBotRight = GetTile(PosRightX, PosDownY); 
     Vector2 tileDestUp = GetTile(DestX, PosUpY); 
     Vector2 tileDestDown = GetTile(DestX, PosDownY); 

     if(tileTopRight.X < tileDestUp.X) 
     { 
      float startX = tileTopRight.X; 
      float finishX = tileDestUp.X; 
      float startY = tileTopRight.Y; 
      float finishY = tileBotRight.Y; 

      for (int l = (int)startX; l <= finishX; l++) 
      { 
       for (int i = (int)startY; i <= finishY; i++) 
       { 
        if (tileList[l, i] != null) 
        { 
         return true; 
        } 
       } 
      } 
      return false; 
     } 
     else if (tileTopLeft.X > tileDestDown.X) 
     { 
      float startX = tileDestUp.X; 
      float finishX = tileTopLeft.X; 
      float startY = tileDestUp.Y; 
      float finishY = tileDestDown.Y; 

      for (int l = (int)startX; l <= finishX; l++) 
      { 
       for (int i = (int)startY; i <= finishY; i++) 
       { 
        if (tileList[l, i] != null) 
        { 
         return true; 
        } 
       } 
      } 
      return false; 
     } 
     else 
     { 
      return false; 
     } 
    } 

在按“A”,速度将是一个负的参数,使得目标平铺到播放器的左边,它会检查是否从目的地的矩形每瓦平铺到玩家的左下方瓷砖区域。如果有瓷砖,则移动被取消,并且工作。然而,同样的事情对'D'键不起作用,尽管我认为'A'的相同代码对'D'有效,稍作修改。

回答

0

我知道我迟了整整一个月,但这个人在游戏编程中给了我很多。 Click here打开一个链接,他解释了在2D平台上进行碰撞的“正确”方式。他从另一个角度解释了碰撞。我不会发布任何代码,因为我觉得你会发现自己做这件事更有趣。

它的主要特点是,如果您在物体撞到墙壁时检查碰撞,那么做任何事情都为时已晚。对象很可能会在墙内绘制。您需要检查对象的下一个位置(通过将X和Y速度添加到其位置),并且如果对象正在撞击墙,则将对象移动到其旁边。这样,你永远不会有一个对象在墙的情况。此外,您首先计算X/Y移动,速度,加速度和碰撞,然后对另一个轴执行相同的操作。

这是一种回答。我没有给你代码,但我告诉过你在哪里可以找到你的答案。再一次,我没有提供代码,因为我认为你会对自己的一切编码感到兴奋。我承认,如果情况并非如此,那么你现在应该在Unity论坛上,而不是XNA。

+1

谢谢你,但我知道我做错了什么。当我按下'A'键时,速度会保持为正值,并且速度* -1会改变位置。这意味着,在这里,它只会检查右侧的瓷砖,而不是左侧。不过,我的确将角色速度添加到了角色身上,并在角色穿过时制作了一盒瓷砖,检查是否存在冲突,并采用了不同的方法,如果角色在此框中发生碰撞,则以减少的方式循环速度加1,然后用新的速度重新包装盒子,直到没有碰撞发生,并移动角色。 – SentriCast

+0

其实,从我写的内容来看,我不确定我做错了什么(就像我说的是正确的碰撞不是工作,而不是左边的)。但是,我之前弄清楚了,所以我必须忽略任何代码破坏它。 – SentriCast

相关问题