我目前正在尝试为我的射击游戏在GameMaker中开发一个重播系统。基本的想法是记录/跟踪玩家在游戏中的运动和输入,然后在重播中重现或播放这些动作。然而,每次我尝试播放录制的游戏时,重播都会频繁脱序,从实际发生的事情中脱离。已经采取了几个标准预防措施以防止非确定性行为,包括: * 避免内置的运动变量: 我不使用 speedhspeedvspeed,而是手动管理位置/速度。 * 避免非确定性函数: 我已经审计了输入中的浮点不一致性、非种子随机性和帧依赖逻辑。游戏确实使用了很多事件来为子弹效果。尽管采取了这些措施,但位置会逐渐漂移,直到重播完全破坏。 我在obj_control的Step Event中使用以下代码记录玩家的输入: if global.freeplaymode == false { for(var i = 0; array_length(global.player_stats); i++) { scr_get_input(i); if global.replay_mode == false and global.main_stats.continues_used == 0 { array_push(global.replay_input[i].replay_stage[global.main_stats.stage - 1],[rKey,lKey,dKey,uKey,action_shoot,action_focus,action_bomb]) } } } replay_frame++; 我使用以下函数让玩家对象执行动作: function scr_replay_input(_player) { rKey = global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame][0] lKey = global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame][1] dKey = global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame][2] uKey = global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame][3] xaxis = (rKey - lKey); yaxis = (dKey - uKey); action_shoot = global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame][4] action_focus = global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame][5] if global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame][6] == true and global.replay_input[_player].replay_stage[global.main_stats.stage - 1][obj_control.replay_frame - 1][6] == false { action_bomb = true; } else { action_bomb = false; } if gamepad_is_connected(0) { action_pause = gamepad_button_check_pressed(_player,gp_start); } else { action_pause = keyboard_check_pressed(vk_escape); } } 有没有人遇到与输入重播或GameMaker中确定性状态记录相关的类似脱序问题?我应该检查哪些微妙的脱序源或边缘情况?如果我仍然无法解决这个问题,即使尝试了每个人的建议,我可能会被迫在Fiverr上雇用对GameMaker重播系统有经验的人来帮助我调试和修复它。