gpt4 book ai didi

java - 棘手 Action 的抽象实现,例如,呃,行走

转载 作者:行者123 更新时间:2023-11-30 05:00:59 28 4
gpt4 key购买 nike

哦,嗨。我是一名初级 Java 开发人员,在空闲时间从事一些基于 2D 图 block 的游戏。现在我正在尝试实现游戏模型中非常基本的东西 - 各种类型的对象如何彼此交互。我希望有一天添加网络支持,所以现在 Action 对象同步更改它们的状态 - 当单例 Ticker(在自己的线程中运行)使用 .tick() 通知订阅对象时,使它们执行先前分配给它们的命令对象。实现简单的一次性 Activity (例如拾取某个对象)非常简单,例如:

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

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

我的问题(最后!)是 - 是否有一些众所周知的设计模式可供我思考?每次编辑我的代码都会变得更加难以理解和不可继承,也许我应该重写整个代理系统?

最佳答案

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

实际上,您几乎自己发明了这种模式,因为您的 IAction 概念本质上与状态相同。所以我认为你正朝着正确的方向前进。

编辑:为了更具体地说明您的情况,我建议您简单地放弃 IAction 是原子的要求;相反,它可能会持续几个周期。 IAction.execute() 应该简单地执行在一次刻度期间可以执行的尽可能多的操作,例如沿着所需的路径走一小段距离。 Action 本身可以例如跟踪目标位置在哪里、已经走了多远等。

(历史注释:最初的虚幻引擎是基于状态的(我猜新版本也是如此) - 当编码例如自定义武器时,您可以将代码分成每个可能状态的一个部分,例如射击重新加载空闲等)

关于java - 棘手 Action 的抽象实现,例如,呃,行走,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6733878/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com