Shipの動きの入力

ベクトルが入ってきて難しくなってきたけど2Dならなんとか。


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の動きの入力

コメントを投稿