タイルとプレーヤーで小さなゲームを作成しましたが、私は衝突検出でプログラムしようとしています。だから、私はキャラクターが仕事に残っているとき( 'A')は衝突するように管理しましたが、それが正しければ動作しません( 'D')。これは私のコードです:「A」を押すことで(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;
}
}
、速度はプレイヤーの左側に目的地タイルを作り、負のパラメータとなり、それが先から長方形に各タイルかどうかをチェックしますタイルをプレーヤーの左下のタイル領域にタイルします。タイルがある場合、移動はキャンセルされ、動作します。しかし、同じことが 'D'キーのために働いていませんが、私は 'A'のための同じコードが少しの変更で 'D'のために働くと仮定しました。
ありがとうございますが、私が間違ったことを理解しました。 「A」キーを押すと、速度は正のままで、位置は速度* -1で変化します。これは、ここでは、左ではなく右にあるタイルだけをチェックすることを意味します。キャラクターが通過するタイルの箱を作って衝突をチェックし、別の方法ではキャラクターがこのボックスで衝突した場合は減速してループします速度を1倍にしてから、衝突が発生しなくなるまで新しい速度でボックスを再読み込みし、文字を移動します。 – SentriCast
実際、私が書いたことから、私は何が間違っていたのか分かりません(私はそれが左ではなく、うまく動作しないと言ったので)。しかし、私は前にそれを把握していたので、コードを壊したものはすべて削除しておかなければならない。 – SentriCast