复杂动作的抽象实现,比如走路



大家好。我是一名初级java开发者,利用业余时间开发一些2D贴图游戏。现在我正在尝试在游戏模型中实现非常基本的东西-各种类型的对象如何相互作用。我希望有一天添加网络支持,所以现在代理对象同步更改其状态-当单例Ticker(在其自己的线程中运行)使用.tick()通知订阅对象时,使它们执行先前分配给它们的命令对象。实现简单的一键式活动(例如拾取某个对象)非常简单,例如:

abstract class Character extends AbstractActing {
    void tick() {
        action.execute();
    }
    private void pickUp(Item item) {
        inventory.add(item);
    }
    private IAction action;
    //...
    class PickUp implements IAction {
        void execute() {
            //check if allowed to do
            pickUp(item)
        }
        PickUp(Item item) {
            this.item = item;
        }
        private Item item;
    }
}

现在我想为更复杂的动作写一个框架实现,比如引导一些法术,踢别人的屁股或跑到地图上的点。我认为,表示这些复杂动作的对象将在内部将自己解释为简单的原子指令队列。例如,"Walk(Location x)"命令将在内部使用寻路算法来构建"DoOneStep(Direction d)"队列,并且如果途中发生了什么事情,将能够重建它。问题是单个原子步骤需要更多信息才能执行,如角色的速度或地面类型。顺便说一句,根据角色的速度,我可能想要改变角色的真实位置,而不是每一次。我认为我必须在Action中添加一些步进执行器对象,用于观察与计算相关的对象并更新其状态。

我的问题(最后!)是——是否有一些著名的设计模式值得我思考?我的代码每次修改都变得越来越难以理解和不可继承,也许我应该重写整个代理系统?

您可能想要考虑使用状态模式(也称为状态机模式,因为它基于有限状态机的数学理论)。其理念是,角色(或任何其他类型的游戏对象)总是处于一种状态(从预定的可能状态集合中选择),某些事件可以触发到其他状态的转换。然后,tick()方法可以根据当前状态执行不同的操作。这种模式的一个更高级的版本是为不同的状态提供类,并使用状态类的实例来收集信息,例如,你处于那种状态有多长时间。所以在你的情况下,可能的状态是Walking, PickingUp, Idle

实际上,这个模式几乎是你自己发明的,因为你的IAction概念本质上和状态是一样的。所以我认为你的方向是对的。

编辑:为了更具体地针对您的情况,我建议您简单地放弃IAction是原子的要求;相反,它可能会持续几次。IAction.execute()应该在一个tick的过程中执行尽可能多的动作,例如沿着期望的路径走一小段距离。例如,动作本身可以跟踪目标位置的位置,已经走了多远,等等。

(历史注释:最初的虚幻引擎是基于状态的(我猜新版本也是如此)-当编码时,例如自定义武器,你会将代码分成每个可能状态的一个部分,如Firing, Reloading, Idle等)

最新更新