我一直在尝试在我用 Java 编写的游戏中实现和撤消/重做系统。我正在采取在每次移动后序列化游戏状态的方法。我有办法将序列化对象保存在堆栈上并访问它们以进行撤消/重做吗?
最佳答案
游戏编程与“企业应用程序”编程或“网络应用程序编程”没有太大关系。
因此,这取决于您正在开发的游戏类型,但您的方法和给出的方法与“真实”游戏中游戏状态的保存方式绝对无关。性能会非常糟糕,您最终会使用很多内存和磁盘空间。
例如,暴雪的魔兽争霸 III 或微软的帝国时代 等伟大的游戏只会存储重现任何游戏状态所需的用户输入.
这就是他们如何实现超高效的网络传输,即使玩家有成百上千个对象,这就是他们如何实现微小的游戏存档文件(可用于继续游戏或重播):想要低延迟?很简单,只需通过 UDP 发送玩家的击键和鼠标点击以及这些输入发生的时间。
这与撤消/重做有什么关系?琐碎的...
假设自游戏开始以来您已经有 200 次用户输入并且想要撤消最后一步:您从头开始游戏并提供 199 次输入。就是这样。完美撤消。
当然你只需要在回放那199步的时候回放逻辑,不需要更新需要更新你的 View 。对于大多数游戏来说,逻辑只占总时间的一小部分(大部分时间花在 View 上)。因此重放这些输入非常快。
去过那里,做过:)
现在,如果您想要另一种方式来进行无限制的撤消/重做,那么就必须对“OO over immutable objects”说点什么:我编写的游戏工具编辑器(如 map 编辑器)具有以下特点无限制的撤消/重做。诀窍是仅使用不可变对象(immutable对象)。然后保持以前的状态很容易:只是层次结构顶部的对象('gamemap239')。
因为您只使用不可变对象(immutable对象),"new"游戏 map 与以前的游戏 map 共享其 99.9% 的对象,因此内存使用率低得离谱,可以保留大量状态。
我已经在非游戏的商业软件中成功地应用了这种“面向不可变对象(immutable对象)的 OO 以实现高效的撤消/重做”,这确实是一项了不起的技术。
现在这取决于您正在做的游戏:当然,对于扫雷游戏,您可以使用 Swing 和常规 Java 编程技术。但对于更高级的游戏,常规的 Java 集合和 API 以及常规的 entreprise/webapp/fatclient 编程技术根本行不通。
关于java - 撤消/重做功能 Java 的对象序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2429548/