我已经创建了一个带有瓷砖和玩家的小型游戏,我正在尝试进行碰撞检测编程。因此,当角色向左('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",速度将是一个负参数,将目的地瓷砖放在玩家的左侧,它将检查从目标瓷砖到播放器底部左瓷砖区域的A矩形中的每个瓷砖是否。如果有瓷砖,则该动作将被取消,并且可以正常工作。但是,同一件事对" D"密钥不起作用,尽管我假设" A"的代码适用于" D",并进行较小的修改。
我知道我整整一个月迟到了,但是这个家伙在游戏编程中给我带来了很多帮助。单击此处打开一个链接,他在其中解释了在2D平台器中进行碰撞的"正确"方法。他从另一个角度解释了碰撞。我不会发布任何代码,因为我认为您会发现自己更有趣。
它的JIST是,如果您在物体撞到墙壁时检查碰撞,那么做任何事情就为时已晚。物体很可能会在墙内画。您需要检查对象的下一个位置(通过将其X和Y速度添加到其位置),如果对象撞到墙壁,则将对象移到其旁边。这样,您将永远不会有对象的情况。另外,您首先计算X/Y运动,速度,加速度和碰撞,然后对其他轴进行相同的操作。
这是一种答案。我没有给您代码,但是我告诉过您在哪里可以找到答案。同样,我没有提供代码,因为我认为您会自己编码所有内容。我认为,如果不是这样,您现在将在Unity论坛上,而不是XNA。