エンティティを方向に移動させるにはどうすればよいですか?


11

Entityゲームティックごとに更新されるインスタンスがあります。エンティティが常に前進していると仮定しましょう。エンティティの角度を、その方向に移動させる関数に与えることができるようにしたいと思います。

moveForward(90);右に移動する必要があります。ローテーションをグローバルとして宣言した場合int

moveForward(rotation);
rotation++;

その動きで小さな円を描くようになります。

これどうやってするの?私はこれがベクトル演算に関係していると思います。わからないので、簡単に説明していただければ幸いです。

回答:


16

まあ、最も単純な意味では、このようなものがあります。

   y  |\
      | \
   m  |  \         s
   o  |   \        p
   v  |(a) \       e
(y)e  |angle\      e
   m  |      \     d
   e  |       \
   n  |        \
   t  |         \
      |__________\
      x movement
        (x)

速度は敵の速さですが、敵のx方向への移動量とy方向への移動量は、角度のsinまたはcosを取り、速度を乗算することで決定できます。なぜなら...

 sin(a) = x / speed

そう:

 x = speed * sin(a)

そして:

cos(a) = y / speed

そう:

y = speed * cos(a)

あなたの例でmoveForward(90)生じるであろうspeed * sin(90)か、speed * 1x方向およびspeed * cos(90)または0Y方向に(あなたが指定したように、それは右に移動する必要があります)。基本的な意味であなたはそれを始めるはずです。

一般的にする:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}

ああ、それは私が想像していたよりもずっとシンプルです。ありがとうございました:)
Shaun Wild

私はあなたがyとxを切り替える必要があると確信しています。sin(alpha)= b / c。
jcora

@Baneこれは、SOH-CAH-TOAで作成した図面と一致します。罪は、図面ではx /速度である斜辺の反対です。角度が三角形の反対側にある場合、角度は逆になります(そして、それがゲームデザインの目的でより実用的である場合、変更することができますが、それはすべて恣意的です)。
Kevin DiTraglia-2012

私は携帯電話を使っているので、それを解釈するのはかなり困難でした。数式を
ざっと読み飛ばしたところ

それはあなたがそこに着いた本当に素晴らしい三角形です。+1
Bro Kevin D.

3

他の答えは今のところ間違っています。回転に基づいて平面に沿って正しく移動するには、次のようにします。

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

ただし、回転が変化したときにのみ更新するcos / sinの変数を作成して、ティックを4倍計算しないようにすることをお勧めします。

strafeSpeedは左右に移動し、forwardSpeedは回転に沿って前方に移動します。

編集:テッセローデは、左右の動きがないことを除いて同じことをします。


2

あなたは更新ティックを言ったので、私はあなたが可変フレームレートを持っていないと仮定しています。その場合:

x + =速度* math.cos(角度)

y + =速度* math.sin(角度)

可変フレームレートを使用している場合は、デルタタイムも乗算する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.