私はここで、動きに関する他の2つのスレッドを読みました: 時間ベースの動きとフレームレートベースの動き?、および 固定または可変の時間ステップをいつ使用すべきですか?
しかし、どちらのスレッドが何を話しているのか理解できないので、フレームに依存しない動きの基本的な理解が不足していると思います。
私はlazyfooのSDLチュートリアルに従っていて、フレームに依存しないレッスンに出会いました。http://lazyfoo.net/SDL_tutorials/lesson32/index.php
コードの動きの部分が何を言おうとしているのかわかりませんが、これはそうだと思います(私が間違っている場合は修正してください):フレームに依存しない動きをするためには、オブジェクトの距離を知る必要があります(例:スプライト)は、たとえば1秒など、特定の時間枠内で移動します。ドットが200ピクセル/秒で移動する場合、200 ppsに1/1000秒を掛けて、その1秒内に移動する量を計算する必要があります。
そうですか?レッスンは言う:
「秒あたりのピクセル数での速度*秒単位での最後のフレームからの時間。したがって、プログラムが毎秒200フレームで実行される場合:200 pps * 1/200秒= 1ピクセル」
しかし... 200 ppsを1/1000秒で乗算していると思いました。1秒あたりのフレーム数でこのビジネスは何ですか?
フレームに依存しない動きがどのように機能するかについて、もう少し詳しく説明してもらえれば幸いです。
ありがとうございました。
添加:
SDL_Rect posRect;
posRect.x = 0;
posRect.y = 0;
float y, yVel;
y = 0;
yVel = 0;
Uint32 startTicks = SDL_GetTicks();
bool quit = false;
SDL_Event gEvent;
while ( quit == false )
{
while ( SDL_PollEvent( &gEvent ) )
{
if ( gEvent.type == SDL_QUIT )
quit = true;
}
if ( y <= 580 )
{
yVel += DOT_VEL;
y += (yVel * (SDL_GetTicks() - startTicks)/1000.f);
posRect.y = (int)y;
}
startTicks = SDL_GetTicks();
SDL_BlitSurface( bg, NULL, screen, NULL );
SDL_BlitSurface( dot, NULL, screen, &posRect );
SDL_Flip( screen );
}
これは、ドットを画面の下に移動するコードです。これまでのところ、すべてが正しいと思います。画面を下に移動しますが、説明できない奇妙なことが発生します。ドットは、そのy値より大きくなると、y = 580に留まるはずです。ただし、プログラムを実行するたびに、ドットは異なる場所に移動します。つまり、580を少し超える程度です。そのため、ドットは画面の半分または半分以上です(ドットは20ピクセル、画面寸法800x600)。プログラムのタイトルバーをクリックして押したままにして放すと、ドットが画面から消えます。どうして毎回可変なのですか?タイトルバーの問題については、タイトルバーを押し続けると、タイマーがまだ実行中であり、経過時間が長くなるためだと思います。その結果、次のフレームでドットが移動する距離が長くなります。そうですか?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
その後、次のようにしますif(y + yMovement <= 580){ y += yMovement; } else { y = 580; }