GAME
ベクトルによる移動処理(初級編)


HomeProgramming TipsGame Tips[GAME004]

ゲームの移動といえば、最近ではすっかりベクトルで管理することが多くなりました。
以前のゲームは X,Y 座標をそれぞれプラスマイナスすることで移動させていたものですが、
それは、今は時代遅れになっています。

ベクトルを使って移動を管理すると何か良いことがあるのでしょうか。
数学的な演算で如何にも実行速度が遅そうなのに、難しそうなことをなぜわざわざやるのでしょうか。
答えは簡単です。「簡単」だからです。

縦横の移動しかないゲームならば、ベクトルは使わないでしょう。
角度が何度でも良いですから斜めが入った時点でベクトルを使いましょう。

何度も言います。そのほうが簡単だからです。

ベクトルってよく分からない?
そうかもしれません。

でも、使えれば良いと思いませんか?
冷蔵庫が冷える原理を知らなくてもビールは冷やせるでしょ?
赤外線がなぜ情報を送れるのか知らなくてもテレビの音量を変えられるでしょ?

同じです。

まず、実践あるのみです。
座標管理に今まで int を使っていたかもしれませんが、これからは float です。
なに!? D3DXVECTOR2 のほうが便利ですと? はい、そういう上級者はこのページは退場です。


    float fPosX, fPosY;     // 自分の位置


次に移動方向です。角度を覚えるのではなくベクトルを覚えさせます。
まだ、意味は分からなくてもいいですから、用意します。


    float fVecX, fVecY;     // 進行方向


以上で準備は出来ました。
さて、動かしましょう。
まずは右に動かしましょうか。


    // 方向設定
    fVecX = 1.0f;
    fVecY = 0.0f;

    // 移動処理
    fPosX += fVecX;
    fPosY += fVecY;


できました。うおお、危ない! ビール瓶を投げないでください。
決してバカにしているわけではありません。
続いて左に移動させましょう。


    // 方向設定
    fVecX = -1.0f;
    fVecY = 0.0f;

    // 移動処理
    fPosX += fVecX;
    fPosY += fVecY;


はい、できま…うわなにをするやめ$&%
お、落ち着いてください。
嘘みたいに簡単でしょ?これがベクトルです。
大事なのは、どの方向に移動する場合でも、移動処理自体は何も変わっていないと言うことです。
下に移動するときは fVecX = 0.0f, fVecY = 1.0f ですね。
そろそろ気がつきましたか?
斜めに移動するときはどうすればいいのかを。

そうです。fVecX, fVecY に 0 以外の値を入れてやればいいのです。
しかも、float ですから、小数を使って移動方向の微調整まで出来てしまいます。


    // 方向設定
    fVecX = +0.5f;
    fVecY = -1.732f;

    // 移動処理
    fPosX += fVecX;
    fPosY += fVecY;


これで斜め上30度方向に移動していきます。
ただ、方向の指定に小数を入れるのは分かりにくいし面倒ですね。
やっぱり角度を使いたいでしょ?
そこで登場するのが三角関数です。…まて、そこ、逃げるな(笑)。

三角関数を理解しろとは言いません。
使うと便利だから紹介するのです。

サイン、コサイン、タンジェント〜。
ここで使うのは sin() と cos() です。
…って、実行速度がこいつらは遅いので sinf() と cosf() にします。

使うだけなら話は簡単だ。これだけ覚えろ。

 三角関数を使うには #include <math.h> を記述する。 
 fVecX を求めるなら cosf(角度) を使う 
 fVecY を求めるなら sinf(角度) を使う 

…以上だ。簡単なはずだ。
sinf や cosf の引数には角度を指定するだけだ。
ただ、ちょっとラジアンというややこしい単位なので変換して使いましょう。
このマクロを進呈しよう。


#define RADIAN(x)   (3.1415926f * 2 * (x) / 360)


例えば、左上(160度)方向に物体を移動させたいときは、


    // 方向設定
    float fAngle = 160.0f;
    fVecX = cos(RADIAN(fAngle));
    fVecY = sin(RADIAN(fAngle));

    // 移動処理
    fPosX += fVecX;
    fPosY += fVecY;


ここでも移動処理に関しては一切変更がないわけだ。
※ ここで得られた fVecX, fVecY は数学的には単位ベクトルと呼ばれています。

さて、最後は加速と減速だ。
方向設定の後に速さを掛け算してやるだけでよい。


    // 方向設定
    float fAngle = 160.0f;
    fVecX = cos(RADIAN(fAngle));
    fVecY = sin(RADIAN(fAngle));

    // 速度設定
    float fSpeed = 2.5f;   // 2.5倍のスピードにする
    fVecX *= fSpeed;
    fVecY *= fSpeed;

    // 方向設定
    fPosX += fVecX;
    fPosY += fVecY;


> 中級編に進む



 Copyright 2005 VALGUS. All Rights Reserved.