(C# XNA) 字符仅沿一个方向穿过对象
(C# XNA) Character passing through objects in only one direction
我创建了一个带有方块和玩家的小游戏,我正在尝试编写碰撞检测程序。所以,我设法在角色向左 ('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',只需稍作修改。
我知道我迟到了整整一个月,但是这个人在游戏编程方面帮了我很多。 Click here 打开一个 link,他在其中解释了 'right' 在 2D 平台游戏中进行碰撞的方法。他从另一个角度解释碰撞。我不会 post 编写任何代码,因为我认为您会发现自己编写更有趣。
它的要点是,如果您在对象撞到墙上时检查碰撞,那么再做任何事情都为时已晚。物体很可能会被拉入墙内。您需要检查对象的下一个位置(通过将其 X 和 Y 速度添加到其位置),如果对象随后撞到墙上,则将对象移动到它旁边。这样,您将永远不会遇到墙中物体的情况。此外,您首先计算 X/Y 移动、速度、加速度和碰撞,然后对另一个轴执行相同的操作。
这是一种回答。我没有给你代码,但我已经告诉你在哪里可以找到你的答案。同样,我没有提供代码,因为我认为您自己编写所有代码会很有趣。我相信如果不是这种情况,您现在应该在 Unity 论坛上,而不是 XNA。
我创建了一个带有方块和玩家的小游戏,我正在尝试编写碰撞检测程序。所以,我设法在角色向左 ('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',只需稍作修改。
我知道我迟到了整整一个月,但是这个人在游戏编程方面帮了我很多。 Click here 打开一个 link,他在其中解释了 'right' 在 2D 平台游戏中进行碰撞的方法。他从另一个角度解释碰撞。我不会 post 编写任何代码,因为我认为您会发现自己编写更有趣。
它的要点是,如果您在对象撞到墙上时检查碰撞,那么再做任何事情都为时已晚。物体很可能会被拉入墙内。您需要检查对象的下一个位置(通过将其 X 和 Y 速度添加到其位置),如果对象随后撞到墙上,则将对象移动到它旁边。这样,您将永远不会遇到墙中物体的情况。此外,您首先计算 X/Y 移动、速度、加速度和碰撞,然后对另一个轴执行相同的操作。
这是一种回答。我没有给你代码,但我已经告诉你在哪里可以找到你的答案。同样,我没有提供代码,因为我认为您自己编写所有代码会很有趣。我相信如果不是这种情况,您现在应该在 Unity 论坛上,而不是 XNA。