使用FPS校正的cocos2d重播系统

时间:2013-03-23 16:48:05

标签: c++ cocos2d-iphone cocos2d-x game-physics

我正在为我的cocos2d-x游戏构建重播系统,它也使用box2d。

游戏是不确定的,所以我不能存储用户动作并重放它们,所以我正在做的是将精灵的位置和角度存储到流中。

现在我重放了以下格式的文件

x,y,angle\r\n

每一行代表给定时间步的精灵状态。

现在当我在同一台设备上重播它时,这一切都很完美,但当然生活并不容易,所以如果我想以不同的帧速率播放它就会出现问题,这怎么会发生呢? / p>

有一种聪明的方法来处理这个问题吗?

我也没有固定的时间步骤,我会尽快实现这一点,以便您可以考虑在答案中固定的时间步骤:)

谢谢!

1 个答案:

答案 0 :(得分:1)

好的,您可以记录增量时间以及每个记录的帧。最好以delta时间为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 ...
}

替代方法:创建一种方法,根据当前时间增量返回或“应用”记录的帧。选择记录的总增量时间等于或低于当前总增量时间的帧。

要更快地搜索帧,请记住最近录制的帧的索引并从那里开始搜索(比较每帧的增量时间),同时也包括最近的帧。

有时这会多次显示相同的录制帧,或者可能会跳过录制的帧 - 具体取决于实际设备帧率和录制时的帧速率。