0

我正在为我的 cocos2d-x 游戏构建一个回放系统,它也使用 box2d。

游戏是不确定的,因此我无法存储用户操作并重播它们,所以我正在做的是将每个时间步长的精灵的位置和角度存储到流中。

现在我有以下格式的重播文件

x,y,angle\r\n

每条线代表精灵在给定时间步的状态。

现在,当我在同一台设备上回放时,一切都很完美,但生活当然不是那么容易,所以如果我想以不同的帧速率回放,问题就来了,怎么会这样呢?

有没有聪明的方法来处理这个问题?

我也没有固定的时间步长,我会尽快实现,所以你可以在你的答案中考虑一个固定的时间步长:)

谢谢 !

4

1 回答 1

1

好的,您记录增量时间以及每个记录的帧。最好以 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 回答