实现游戏播放的最佳方式?

Luc*_*cky 11 java playback recording

我正在用Java创建一个基于网格的游戏,我想实现游戏录制和播放.我不知道怎么做,虽然我已经考虑了两个想法:

  1. 每秒几次,我会记录整个游戏状态.为了回放它,我写了一个渲染器来读取状态并尝试创建一个可视化表示.但是,有了这个,我可能会有一个大的保存文件,任何播放尝试都可能会有明显的延迟.

  2. 我也可以将每个按键和鼠标点击写入保存文件.这会给我一个较小的文件,并可以减少滞后回放.然而,游戏开始时的最轻微错误(例如,1毫秒后拍摄)将导致游戏几分钟内完全不同的游戏状态.

那么,实现游戏播放的最佳方式是什么?

编辑 - 我不确定我的游戏究竟有多确定,所以我不确定整个游戏是否只​​能通过按键和鼠标点击来拼凑.

Ale*_*ris 14

良好的播放机制不是可以简单地添加到游戏中而没有重大困难的东西.最好的方法是设计游戏基础设施.该命令模式可以用来实现这样的游戏的基础设施.

例如:

public interface Command{
    void execute();
}
public class MoveRightCommand implements Command {
   private Grid theGrid;
   private Player thePlayer;

   public MoveRightCommand(Player player, Grid grid){
        this.theGrid = grid;
        this.thePlayer = player;
       }

   public void execute(){
     player.modifyPosition(0, 1, 0, 0);
   } 
}
Run Code Online (Sandbox Code Playgroud)

然后命令可以在执行队列被推动当用户按下键盘按键,移动鼠标或不与再生机构的触发器.命令对象可以有一个时间戳值(相对于播放的开始),以便精确播放...

  • 这是一种处理它的优雅方式.如果实际的游戏玩法和录制基于相同的时间/帧机制,则应避免因时序问题导致的错误.如果事件中存在随机化,则可能还需要记录随机数生成器的起始种子值.这就是RTS游戏中"随机地图"功能允许您重新生成您喜欢的随机地图的方式. (2认同)

Mic*_*ael 8

Shawn Hargreaves最近在他的博客上发表了关于他们如何在MotoGP中实施重播的帖子.讨论了几种不同的方法及其优缺点.

http://blogs.msdn.com/shawnhar/archive/2009/03/20/motogp-replays.aspx