我用瓷砖和玩家创建了一个小游戏,我正试图在碰撞检测中编程。所以,当角色向左('A')工作时我设法发生碰撞,但是当它向右('D')时它不起作用。这是我的代码:
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 :(得分:0)
我知道我已经整整一个月了,但这个家伙在游戏编程方面给了我太多的帮助。 Click here打开一个链接,在那里他解释了在2D平台游戏中进行碰撞的“正确”方法。他从另一个角度解释了碰撞。我不会发布任何代码只是因为我觉得你会发现自己做的更有趣。
它的主旨是,如果你在物体撞到墙壁时检查碰撞,那么做任何事都为时已晚。对象很可能是在墙内绘制的。您需要检查对象的下一个位置(通过将其X和Y速度添加到其位置),如果对象正在撞击墙壁,则将对象移动到它旁边。通过这种方式,您将永远不会遇到墙内物体。此外,您首先计算X / Y移动,速度,加速度和碰撞,然后对另一个轴执行相同操作。
这是一种答案。我没有给你代码,但我告诉你在哪里可以找到你的答案。再说一遍,我没有提供代码,因为我认为你自己编写一些有趣的编码。我认为,如果情况并非如此,那么你现在就在Unity论坛上,而不是XNA。