我用瓷磚和玩家創建了一個小型遊戲,我試圖在碰撞檢測中編程。所以,當角色向左('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