0

cocos2d-x ゲームのリプレイ システムを構築しています。これも box2d を使用しています。

ゲームは非決定論的であるため、ユーザーのアクションを保存して再生することはできません。そのため、ストリームに入るたびにスプライトの位置と角度を保存しています。

現在、次の形式のリプレイ ファイルがあります。

x,y,angle\r\n

各線は、特定のタイム ステップでのスプライトの状態を表します。

同じデバイスで再生すると、すべて完璧ですが、もちろん人生はこれほど簡単ではないので、別のフレーム レートで再生したい場合に問題が発生します。

この問題を処理するスマートな方法はありますか?

私も固定の時間ステップを持っていません。これをすぐに実装して、回答で固定の時間ステップを検討できるようにします:)

ありがとう !

4

1 に答える 1

1

OK、記録された各フレームとともにデルタ時間を記録します。デルタ タイム 0 で最初のフレームの記録を開始し、再生の最初のフレームも同じであると想定するのが最適です。

次に、更新メソッドで現在のデルタ時間を累積します。

-(void) update:(ccTime)delta
{
    if (firstFrame) 
    {
        totalTime = 0;
        totalRecordedTime = 0;
        firstFrame = NO;
    }
    else
    {
        totalTime += delta;
    }

    totalRecordedTime += [self getRecordedDeltaForFrameIndex:recordedFrameIndex];
    if (totalTime > totalRecordedTime)
    {
        [self advanceRecordedFrameIndex];
    }

    // alternative:
    id recordedFrameData = [self getRecordedFrameForDeltaTime:totalTime];
    // apply recorded data ...
}

別の方法: 現在のタイム デルタに基づいて、記録されたフレームを返すか「適用」するメソッドを作成します。記録された合計デルタ時間が現在の合計デルタ時間以下であるフレームを選択します。

フレームの検索を高速化するには、最後に記録されたフレームのインデックスを記憶し、そこから検索を開始します (各フレームのデルタ時間を比較します)。常に最新のフレームも含めます。

実際のデバイスのフレームレートと記録中のフレームレートによっては、同じ記録済みフレームが複数回表示されるか、記録済みフレームがスキップされることがあります。

于 2013-03-23T19:16:40.187 に答える