0

画面に画像を描画するプログラムがあります。ここでの描画関数は、描画コードがすべて含まれているフレームごとに呼び出されます。

画像のインデックスからそれぞれの画像を返す画像シーケンサーを作成しました。

void draw()
{
sequence.getFrameForTime(getCurrentElapsedTime()).draw(0,0); //get current time returns time in float and startson application start
}

キーを押すと、最初の画像 [0] からシーケンスを開始し、さらに続けます。そのため、キーを押すたびに、基本的に currentTime%numImages を使用してフレームを取得する上記のコードとは異なり、[0] から開始する必要があります (これは画像の開始位置 0 ではありません)。

基本的にキーを押すたびにトリガーできる独自のタイマーを作成して、時間が常に0から始まるようにすることを考えていました。

編集
なぜカウンターだけを使わなかったのですか? ImageSequence でもフレームレートを調整しています。

Image getFrameAtPercent(float rate)
{
float totalTime = sequence.size() / frameRate;
float percent = time / totalTime;
return setFrameAtPercent(percent);
}

int getFrameIndexAtPercent(float percent){
if (percent < 0.0 || percent > 1.0) percent -= floor(percent);
    return MIN((int)(percent*sequence.size()), sequence.size()-1);
}
4

2 に答える 2

1
void draw()
{
    sequence.getFrameForTime(counter++).draw(0,0); 
}

void OnKeyPress(){ counter = 0; }

これで十分ではない理由はありますか?

于 2013-01-29T05:21:34.777 に答える
0

あなたがすべきことは、「currentFrame」を として増やし、フレームにインデックスを付けるfloatために に変換することです。int

void draw()
{
    currentFrame += deltaTime * framesPerSecond; // delta time being the time between the current frame and your last frame
    if(currentFrame >= numImages)
        currentFrame -= numImages;
    sequence.getFrameAt((int)currentFrame).draw(0,0);
}

void OnKeyPress() { currentFrame = 0; }

これにより、異なるフレームレートのマシンや、単一のマシンでのフレームレートの変更さえも適切に処理する必要があります。

また、減算の残りが保持されるため、ループオーバーするときにフレームの一部をスキップすることはありません。

于 2013-01-29T05:45:40.493 に答える