0

我想以前一定有人问过类似的问题,但是这里有。

能够录制游戏会很有用,这样如果在游戏过程中发生错误,录制的游戏可以在以后通过修复的版本重复使用,以确认错误是否已修复。我也在使用 box2d,据我记忆,box2d 似乎不是真的确定性,但至少在很多情况下能够从第一次重新创建大部分状态是可以的。我假设重新创建相同的随机值将需要恢复相同的时间等。有什么见解吗?

  • 我一直在摆弄 calabash-ios 并取得了各种成功。我知道可以录制播放,然后在那里播放。我只是假设它不会重新创建随机值。

  • 快速浏览一下 box2d 常见问题,我认为 box2d 已经足够确定了

对于相同的输入和相同的二进制文件,Box2D 将重现任何模拟。Box2D 不使用任何随机数,也不基于随机事件(例如计时器等)进行任何计算。

然而,人们往往想要更严格的确定性。人们经常想知道 Box2D 是否可以在不同的二进制文件和不同的平台上产生相同的结果。答案是不。这个答案的原因与浮点数学在许多编译器和处理器中的实现方式有关。如果您好奇,我建议您阅读这篇文章: http ://www.yosefk.com/blog/consistency-how-to-defeat-the- purpose-of-ieee-floating-point.html

4

1 回答 1

1

如果您封装玩家在每个时间步中向世界提供的输入状态(例如,在 POD 结构中),那么将其写入文件非常简单。例如,假设您的输入状态如下:

struct inputStruct {
    bool someButtonPressed;
    bool someOtherKeyPressed;
    float accelerometerZ;
    ... etc
};

然后你可以在每个时间步做这样的事情:

inputStruct currentState;
currentState.someButtonPressed = ...; // set contents from live user input

if ( recording )
    fwrite( &currentState, sizeof(inputStruct), 1, file );
else if ( replaying ) {
    inputStruct tmpState;
    int readCount = fread( &tmpState, sizeof(inputStruct), 1, file );
    if ( readCount == 1 )
        currentState = tmpState; //overwrite live input
}

applyState( currentState ); // apply forces, game logic from input

world->Step( ... ); // step the Box2D world

请原谅以 C++ 为中心的代码 :~) 毫无疑问,Objective-C 有等效的方法。

此方法可让您在文件输入用完时重新获得实时控制。'file' 是一个 FILE*,您必须在关卡加载时以适当的模式(rb 或 wb)打开它。如果您正在追踪的错误导致崩溃,您可能需要在写入后 fflush 以确保在崩溃之前实际写入输入状态。

正如您所指出的,这极不可能跨不同平台工作。您不应该假设重播文件会在记录它的设备以外的任何设备上重现相同的结果(这对于调试目的应该没问题)。

至于随机值,您需要确保使用可能影响 Box2D 世界的随机值的任何内容都通过一个不与其他代码共享的确定性随机生成器,并且您需要记录每个使用的种子重播。您可能想使用位于http://en.wikipedia.org/wiki/Mersenne_twister的众多 Mersenne Twister 实现之一

当我说“不共享”时,假设您还使用 MT 算法为粒子生成随机方向,纯粹是为了渲染目的 - 您不希望使用与物理相关随机化相同的生成器实例。

于 2013-06-17T04:45:28.847 回答