游戏架构 - 夫妻双方是否结合?

bug*_*ixr 10 c# architecture

我正在构建一个简单的游戏,其中包括移动游戏 - 游戏中的角色(怪物).每个暴徒都可以执行某些功能.为了向Mob提供该功能,我创建了一个Behavior.

例如,假设一个暴徒需要在游戏领域移动,我会给它MoveBehavior - 这被添加到mob类的内部行为列表中:

// Defined in the Mob class
List<Behavior> behaviors;

// Later on, add behavior...
movingMob.addBehavior(new MovingBehavior());
Run Code Online (Sandbox Code Playgroud)

我的问题是这个.大多数行为都会操纵一些关于暴民的事情.在MoveBehavior示例中,它将改变世界中暴徒的X,Y位置.但是,每个行为都需要特定的信息,例如"movementRate" - 应该在哪里存储movingRate?

它应该存储在Mob类中吗?其他怪物可能会通过减慢/加速暴徒来尝试与它进行交互,并且在暴徒级别更容易进入...但并非所有怪物都有动作速度,因此它会导致混乱.

或者它应该存储在MoveBehavior类中?这会将它隐藏起来,使其他怪物与之交互更加困难 - 但它不会使具有额外和未使用属性的非移动怪物混乱(例如,不移动的塔将永远不需要使用movementRate).

sea*_*ley 4

这是经典的“行为构成”问题。权衡是,行为越独立,它们彼此交互就越困难。

从游戏编程的角度来看,最简单的解决方案是决定一组“核心”或“引擎”数据,并将其放入主对象中,然后让行为能够访问和修改该数据 - 可能通过功能界面。

如果您想要特定于行为的数据,那很好,但为了避免变量名称发生冲突,您可能需要使用于访问它的接口包含行为名称。喜欢:

obj.getBehaviorValue("movement", "speed")

obj.setBehaviorValue("movement", "speed", 4)
Run Code Online (Sandbox Code Playgroud)

这样,两种行为都可以定义自己的变量(称为速度)并且不会发生碰撞。这种类型的交叉行为 getter 和 setter 将允许在需要时进行通信。

我建议为此寻找像 Lua 或 Python 这样的脚本语言。