我用瓷砖和玩家创建了一个小型游戏,我试图在碰撞检测中编程。所以,当角色向左('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'有效,稍作修改。
谢谢你,但我知道我做错了什么。当我按下'A'键时,速度会保持为正值,并且速度* -1会改变位置。这意味着,在这里,它只会检查右侧的瓷砖,而不是左侧。不过,我的确将角色速度添加到了角色身上,并在角色穿过时制作了一盒瓷砖,检查是否存在冲突,并采用了不同的方法,如果角色在此框中发生碰撞,则以减少的方式循环速度加1,然后用新的速度重新包装盒子,直到没有碰撞发生,并移动角色。 – SentriCast
其实,从我写的内容来看,我不确定我做错了什么(就像我说的是正确的碰撞不是工作,而不是左边的)。但是,我之前弄清楚了,所以我必须忽略任何代码破坏它。 – SentriCast