左/右に回転してから前方に加速することでスプライトを制御するテクニックを使用しています。それに関して2つの質問があります。(ポリモーフィズムのために異なるクラスから一緒に貼り付けられたコード。意味がなければ教えてください。動きはうまく機能し、オフスクリーン検出も同様です。)
プレーヤーが画面外に移動すると、Bounce メソッドを呼び出します。プレーヤーが画面外に移動できないようにしたいのですが、方向を変えて戻ることができます。これは上下で機能しますが、左右の端ではほとんど機能しません。ほとんどの場合、それは奇妙なバウンスを行い、画面を離れます。
最大速度と加速速度を設定できるように、加速アルゴリズムを変更したいと思います。Atm TangentalVelocity は両方を行います。
float TangentalVelocity = 8f;
//Called when up arrow is down
private void Accelerate()
{
Velocity.X = (float)Math.Cos(Rotation) * TangentalVelocity;
Velocity.Y = (float)Math.Sin(Rotation) * TangentalVelocity;
}
//Called once per update
private void Deccelerate()
{
Velocity.X = Velocity.X -= Friction * Velocity.X;
Velocity.Y = Velocity.Y -= Friction * Velocity.Y;
}
// Called when player hits screen edge
private void Bounce()
{
Rotation = Rotation * -1;
Velocity = Velocity * -1;
SoundManager.Vulture.Play();
}
//screen edge detection
public void CheckForOutOfScreen()
{
//Check if ABOVE screen
if (Position.Y - Origin.Y / 2 < GameEngine.Viewport.Y) { OnExitScreen(); }
else
//Check if BELOW screen
if (Position.Y + Origin.Y / 2 > GameEngine.Viewport.Height) { OnExitScreen(); }
else
//Check if RIGHT of screen
if (this.Position.X + Origin.X / 2 > GameEngine.Viewport.Width) { OnExitScreen(); }
else
//Check if LEFT of screen
if (this.Position.X - Origin.X / 2 < GameEngine.Viewport.X) { OnExitScreen(); }
else
{
if (OnScreen == false)
OnScreen = true;
}
}
virtual public void OnExitScreen()
{
OnScreen = false;
Bounce();
}