我正在为我的cocos2d-x游戏构建重播系统,它也使用box2d。
游戏是不确定的,所以我不能存储用户动作并重放它们,所以我正在做的是将精灵的位置和角度存储到流中。
现在我重放了以下格式的文件
x,y,angle\r\n
每一行代表给定时间步的精灵状态。
现在当我在同一台设备上重播它时,这一切都很完美,但当然生活并不容易,所以如果我想以不同的帧速率播放它就会出现问题,这怎么会发生呢? / p>
有一种聪明的方法来处理这个问题吗?
我也没有固定的时间步骤,我会尽快实现这一点,以便您可以考虑在答案中固定的时间步骤:)
谢谢!
答案 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 ...
}
替代方法:创建一种方法,根据当前时间增量返回或“应用”记录的帧。选择记录的总增量时间等于或低于当前总增量时间的帧。
要更快地搜索帧,请记住最近录制的帧的索引并从那里开始搜索(比较每帧的增量时间),同时也包括最近的帧。
有时这会多次显示相同的录制帧,或者可能会跳过录制的帧 - 具体取决于实际设备帧率和录制时的帧速率。