OpenGL を使用して C++ でプログラムを実行しています。
私のゲームには船と敵船があります。
現時点では、キーボードに満足しているので、船を動かすことができます。
しかし、敵の船に何らかの動きを与えたいと思っています。たとえば、それらは特定の座標x、yにあり、特定の時間内に5ステップ右、5ステップ左に繰り返し移動するメソッドが必要です。
何か案は?
最初のパラメータvoid glutTimerFunc(unsigned int msecs,void (*func)(int value), value);
はミリ秒単位の時間で、2 番目のパラメータは敵船の座標を更新する関数です。ここで見つけることができる詳細な説明。使い方は以下からご覧いただけます。
void update(int value) {
//do your logic to change the cordinate of the enemy ships
glutPostRedisplay();
glutTimerFunc(25, update, 0);
}
敵船の座標を変更するロジックを入れた関数名の更新です。その中には、時間が 25 ミリ秒の glutTimerFunc がありました。これは、25 ミリ秒ごとに関数 update が呼び出され、ロジックに従って敵船の座標が変化することを意味します。メイン関数で glutTimerFunc を呼び出す必要があります。
int main(int argc,char** argv)
{
//your program code
glutTimerFunc(25, update, 0);
}
船をδt秒 (t 0 から開始) でAからBに移動するには、各フレームの A + ( B - A )( t - t 0 )/ δt ( tは現在の時間) で船を描くだけです。 t = t 0 + δt .
これにより直線運動が誘発されることに注意してください。動きの開始時と終了時に速度を上げたり下げたりしたい場合、それはより複雑です。物理にとらわれずに滑らかにするには、Smoothstep関数を使用して、( t - t 0 )/ δtを Smoothstep( t 0 , t 0 + δt , t ) に置き換えます。
これは速度と呼ばれ、ユーザーの入力によって速度が変化します。
位置があり、一定時間後にX
速度(x の速度) がある場合、次の方法で新しい位置を取得します。vx
t
X'
X'=X+vx*t
次のようなものを呼び出すだけです
void update()
{
myObject.X += myObject.vx*t;
}
void leftArrow()
{
const float increment = 0.05f;
const float maxSpeed = 0.50f;
if (myObject.vx >= maxSpeed)
{
myObject.vx -=increment;
}
}
どのように選択しますt
か?あなたが説明する滑らかな動きの場合、事実上、どんな小さな値でt
も機能します。衝突などのより複雑な動きを計画している場合は、統合している機能の安定性を評価する必要があります...(ただし、それはあなたが説明したことをはるかに超えています.)