我创建一个基于网格的游戏中爪哇和我想要实现的游戏记录和播放。我不知道该如何做到这一点,虽然我认为2个想法:

  1. 有几次,每次第二,我会记录的整个游戏的状态。要打回来的,我写的一呈示器阅读的国家,并试图创造一个视觉表现。有了这个,然而,我可能有一个大的保存文件,以及任何播放的尝试可能会有明显滞后。

  2. 我也可以写入每一个关键的新闻和鼠标点击进入该省的文件。这会给我一个小的文件,并可能打回来小滞后。然而,丝毫错误,在游戏开始(例如,拍摄1毫秒后)会导致截然不同的比赛状态几分钟进入游戏。

那么,什么是最好的方式来实现游戏重放?

编辑-我不知道究竟是如何确定我的游戏,所以我不确定整个游戏中可以拼凑在一起正是通过只记录按键和鼠标点击。

有帮助吗?

解决方案

好播放机制不是可以被简单地添加一个游戏没有重大difiiculties.最好将做设计游戏基础设施与它的中心。的 命令图案 可用于实现这样一个游戏的基础设施。

例如:

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);
   } 
}

然后命令可以推动在执行中队 当用户按键钮,移鼠或没有一个触发放机制。该命令对象可以有时间邮票的价值(相对于开始播放),为精确的回放...

其他提示

肖恩Hargreaves了最近发表的他的博客上有关它们如何实现的重播中的摩托车。去过几种不同的方法及其优点和缺点。

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

假设你的游戏是确定性,它可能是足够的,如果你记录的投入的用户(方法2).但是,你会需要确保你是认识到正确和一致的时间对这些事件,例如当它被承认的服务器。我不知道你怎么处理事件在网。

我担心的是,如果没有一种机制,可以匀定时参考的事件,可能存在问题的方式你的代码处理分布的用户。

考虑一个游戏就像晕3的XBOX360例如-每个客户的记录,他看的游戏,包括基于服务器的更正。

为什么不记录的几次然后压缩你的输出,或者也许这样做:

recordInitialState();
...
runs 30 times a second:
recordChangeInState(previousState, currentState);
...

如果你只记录状态更改时间戳(和每一个变化是很小的,如果没有改变,然后记录没有)的,你应该结束了合理的文件的大小。

没有必要保存一切都在现场对于每一个框架。保存的变化逐步采用的一些良好的插值技术。我不会真正使用一个指令模式为基础的方法,而是做检查,在一个固定的利率为每场比赛的对象,并看看如果它已经改变的任何特性。如果有变化,改变被记录在一些很好的编码和重播的甚至不会成为那么大。

你是如何办法,这将在很大程度上取决于语言使用的是你的游戏,但在一般条款有许多方法,这取决于如果你想要使用大量的储存,或想一些延迟。这将是有益的,如果你能得到的一些想法为什么牺牲,你愿意做。

但是,这似乎是最好的办法可以是只保存输入的用户,如前所述,并且存储位置的所有行动者/精灵在游戏,同时,它作为简单,因为只节省的方向、速度和瓦x,y,或者,如果一切都可以被确定性可忽略的行为者/精灵为你可以得到他们的信息。

如何不确定你的游戏也将是有用的,得到更好的建议。

如果有一个很大的动态运动,例如一个崩溃的比赛,然后您可能想要保存的信息的每一个框架,正如你应该更新队员/行为者在某一帧率。

我只想说最好的方式记录的重放一个游戏完全取决于大自然的游戏。在格基于的不是个问题;问题是如何以可预测的行为是下一个状态的改变,如何,往往有新的输入系统,是否有随机数据被注射在任何一点,等等,你可以存储整个国际象棋游戏,只是通过记录每一个举动反过来,但是,这不起作为一种第一人称射击,那里有明确的。你可以储存的第一人称射击游戏注意到的确切时间,每个输入,但不会作为一个RPG结果的输入可能修改的结果的一个随机的骰子.即使是看似简单的想法,采取一个快照尽可能经常不够好,如果重要的信息似乎瞬间并不存在任何捕捉的形式。

有趣的是,这是非常相似的问题,你得到与网络。怎么一个计算机中确保的另一个计算机知道比赛的状态,而不必发出这一整个游戏的状态在非常非常高的频率?典型的做法结束是一个定制的混合物的事件通知和状态的更新,这可能是你需要什么在这里。

我这样做一旦通过借用一个想法,从视频压缩:关键帧和中间框架。基本上,每隔几秒钟你保存完整状态的世界。然后,一旦每场比赛的更新,您保存的所有变化的世界状态已经发生,因为最后一场比赛的更新。详细信息(你经常保存的关键帧?什么计数作为一种'改变世界状态'?) 将取决于什么样的游戏中你需要的信息以保存。

在我们的情况下,世界包括很多很多的游戏对象,其中大多数是仍然保持在任何给定的时间,所以这种方式拯救了我们大量的时间和存在记录的位置的对象,没有移动。在你的取舍可能是不同的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top