私の衝突検出を正しく動作させる方法を見つけようとしているのですが、私の壁のオブジェクトはリストの中に積み重ねられています。 DetectCollisionメソッドでは、オブジェクトが壁の内側にあるかどうかによってtrueまたはfalseを返します。C#2D衝突検出の問題
ウォールが衝突を検出プレイヤーが移動しようとする私のプレーヤー機能でそう
public bool DetectCollision(float x, float y)
{
if ((x >= this.XCoordinate && x <= (this.XCoordinate + this.BlockWidth)) && (y >= this.YCoordinate && y <= (this.YCoordinate + this.BlockHeight)))
return true;
else
return false;
}
(X軸、Y座標は壁の位置です)、私は一時的なX、Yへの移動を追加しますそれらが壁に衝突するかどうかチェックします。もし何も起こらなければ、そうでなければ私はプレーヤーを動かします。
しかし、私はそれがすべきではないことに気付きました。私がゲームフィールドの中に壁の部分を追加すると、コリジョン検出の右下隅のみがチェックされます。
プレーヤーの移動方法:
float x, y;
if (direction == Direction.E)
{
x = LiveObjects.player.XCoordinate - MovementSpeed;
y = LiveObjects.player.YCoordinate;
}
else if (direction == Direction.W)
{
x = LiveObjects.player.XCoordinate + MovementSpeed;
y = LiveObjects.player.YCoordinate;
}
else if (direction == Direction.N)
{
x = LiveObjects.player.XCoordinate;
y = LiveObjects.player.YCoordinate - MovementSpeed;
}
else
{
x = LiveObjects.player.XCoordinate;
y = LiveObjects.player.YCoordinate + MovementSpeed;
}
if (GameMechanics.DetectWallCollision(x, y) || GameMechanics.DetectWallCollision((x + LiveObjects.player.BlockWidth), (y + LiveObjects.player.BlockHeight))
{
OnPlayerInvalidMove(null, new PlayerEventArgs());
return;
}
とDetectWallCollisionためのループだけです:
foreach (Wall wall in LiveObjects.walls)
{
if (wall.DetectCollision(x, y))
return true;
}
return false;
任意のアイデア?
座標系のレイアウトはどのようになっていますか(0,0ポイントはどこですか)? – Niko
左上隅が0, – Patrick
です。DetectCollisonメソッドを "return(x> = this.XCoordinate && x <=(this.XCoordinate + this.BlockWidth))&&(y> = this.YCoordinate && y <=(this.YCoordinate + this.BlockHeight)); " –