僕は今シューティングゲームを制作中しています。
敵の移動のアルゴリズムについての質問です。
やりたいことは、
指定したフレーム(回数)で
指定した座標に
徐々に減速しながら(最終的に速度が0になる)移動する、というものです。
X += (TargetX - X) / Frame * NowFrame;
このような式でやっていたんですが、急に止まるよりも徐々に減速させた方が綺麗に見えるので。
ベジェ曲線でもやってみましたが、それだと徐々に減速して最終的に止まるというわけではないので(-_-;)
○→→→→→○→→→→○→→→→○→→○→○(イメージとしてはこんな感じ。)
この動画の8:30のあたりみたいな移動です
「~~曲線を使えばできます」とかちょっとしたことでもご教示ください。お願いしますm(_ _;m
ゲーム制作、敵の移動アルゴリズム
Re: ゲーム制作、敵の移動アルゴリズム
単純に等加速度だとすると,
初速V0, 移動したい距離L, 移動にかかる時間t に関して
V0 * t /2 = L
みたいな関係が成り立ちそうな気がします.
Lは決まってるでしょうから,tかV0のどちらかを所望の値にすれば
上式から他方が求まるので
後は,加速度を -V0/t みたくすればいけるかな? なんとなくですが.
初速V0, 移動したい距離L, 移動にかかる時間t に関して
V0 * t /2 = L
みたいな関係が成り立ちそうな気がします.
Lは決まってるでしょうから,tかV0のどちらかを所望の値にすれば
上式から他方が求まるので
後は,加速度を -V0/t みたくすればいけるかな? なんとなくですが.
Re: ゲーム制作、敵の移動アルゴリズム
あるいは,
>ベジェ曲線でもやってみましたが…
とのことですが,
時刻と位置に関する2次元の曲線を作れば,速度とかを考えなくても
各時刻における位置がダイレクトに得られるのではないでしょうか.
>ベジェ曲線でもやってみましたが…
とのことですが,
時刻と位置に関する2次元の曲線を作れば,速度とかを考えなくても
各時刻における位置がダイレクトに得られるのではないでしょうか.
- 添付ファイル
-
- クリップボード01.png (15.12 KiB) 閲覧数: 2710 回
Re: ゲーム制作、敵の移動アルゴリズム
すいません、自己解決してしまいました。
初期化処理
求める地点とのX,Y距離をそれぞれ計算、現在の座標を保存、sin関数に与える変数を0にする、sinに与える変数の移動一回ごとの増加値を移動に使う回数から計算。
移動処理
sinに与える変数を一定量増加
X,Y座標にそれぞれ、初期値+距離*sin関数の値を代入する。
初期化処理
求める地点とのX,Y距離をそれぞれ計算、現在の座標を保存、sin関数に与える変数を0にする、sinに与える変数の移動一回ごとの増加値を移動に使う回数から計算。
移動処理
sinに与える変数を一定量増加
X,Y座標にそれぞれ、初期値+距離*sin関数の値を代入する。
void Boss::MoveSinMain()
{
MSin[4] += MSin[5];
X = MSin[0] + MSin[2] * sin(MSin[4]);
Y = MSin[1] + MSin[3] * sin(MSin[4]);
}
void Boss::MoveSinSet(double pTX, double pTY, int pFrame)
{
MSin[0] = X;
MSin[1] = Y;
MSin[2] = pTX - X;
MSin[3] = pTY - Y;
MSin[4] = 0;
MSin[5] = DegToRad90 / pFrame; // DegToRad90は定数。90度をラジアンに変換したもの。
}