Vector2 forward = new Vector2((float)Math.Sin(Rotation),-(float)Math.Cos(Rotation)); Vector2 right = new Vector2(-forward.Y, forward.X);Actorオブジェクトが持っているプロパティーRotation(角度)を使って。
Y軸の正方向に向かって Vector2 forward
それに直行する右向きの Vector2 right
スティックを動かしていないときは処理をしない。
float angleDiff = (float)Math.Acos(Vector2.Dot(wantedForward, forward));内積の式の変形より、スティックで入力された角度と、現在のforwardとのなす角を出す。
ベクトルが正規化されているので、計算が簡単になるところがミソ。
float facing = (Vector2.Dot(wantedForward, right) > 0f) ? 1f : -1f;内積の符号を調べることで、なす角が鋭角か鈍角かを調べることができる。
(符号が正のとき 鋭角、符号が負のとき 鈍角)
この場合、現在の向きに対して直行する右向きのベクトルと、スティックで入力された向き(ベクトル)とを比較している。 よって鋭角の場合は右方向への変化、鈍角のときは左方向への変化になる。
if(angleDiff > 0f) { Rotation += Math.Min(angleDiff, facing * elapsedTime * rotationRadiansPerSecond); } Velocity += leftStick * (elapsedTime * speed); if(Velocity.Length() > velocityLengthMaximum) { Velocity = Vector2.Normalize(Velocity) * velocityLengthMaximum; }
angleDiffの範囲は0からπまで、0は動いていないのでそれを省く
1秒当たりの向きを変えられる量、速度など1秒当たりで決める。
elapsedTimeは経過時間なので掛けることで移動量などが計算できる。
0 コメント :: Shipの動きの入力
コメントを投稿