【问题标题】:On using mixins in a CoffeeScript game engine关于在 CoffeeScript 游戏引擎中使用 mixin
【发布时间】:2012-01-28 22:57:53
【问题描述】:

我正在为 Html5 画布开发 CoffeeScript 游戏引擎。在我检查了一个非常简洁的 CoffeeScript implementation 之后,我想出了使用 mixins 的“酷”想法。我认为,通过开发一组基于 mixin 的组件来减少游戏对象通常提供的各种对象层次结构可能是一个非常酷的想法,每个组件都有非常特定的功能。然后,在开发实际游戏时,可以通过基本上从一个组件开始并将其与一堆其他组件混合来即时构建独特的游戏对象。这减少了层次结构并允许频繁更改。

然后我想到了可能出现的冲突,例如让一些组件定义具有相同签名的方法。现在,我没有以前那么兴奋了。

我该怎么办?这是一个好方法吗?我仍然喜欢它,尤其是因为 JS 的底层原型机制,它允许以如此简单的方式即时组合内容。

【问题讨论】:

    标签: javascript coffeescript mixins


    【解决方案1】:

    您说的是entity component system。有一对用JS写的;最受欢迎的是Crafty,很大但值得一看。我最近在 CoffeeScript 中写了一个(只是为了好玩;可能永远不会发布它)。

    关于碰撞的几点说明:

    首先,问题可能比你想象的更严重:如果两个方法具有相同的名称,就会发生冲突; JS 不区分函数签名。它也可能不是那么糟糕:为什么不创建一个命名空间约定,其中每个行为(含义方法)都以其所属的组件命名,例如burnable_burn

    但退一步说,mixin 并不是构建它的唯一方法——行为(即组件可以做的事情)根本不必是方法。我提出的激励问题是,你如何触发行为?例如,您可能会这样做:

    if entity.hasComponent "burnable" #hasComponent provided by your framework
      entity.burn()
    

    但这对我来说听起来不对;它在您的游戏中发生的事情和您拥有的组件之间产生了一种奇怪的耦合,并且检查您的实体是否实现了相关组件是很尴尬的。相反,我希望行为是 events 上的 listeners

    entity.send("applySeriousHeat") #triggers whatever behaviors are there
    

    然后让你的组件做它需要做的任何事情。因此,当您将组件添加到实体时,它会为事件注册侦听器。也许它看起来像(只是草图):

    register: (entity) -> #called when you add a component to an entity
      entity.listen "applySeriousHeat", -> #thing I do when this event is sent to me
        #do burnination here
    

    为了把这一点带回家,如果你这样做,你就不会关心碰撞,因为你的行为没有名字。事实上,你想要“碰撞”;您希望能够让多个组件响应同一事件。也许它会同时燃烧和融化?

    在实践中,我同时使用了这两种设置。我在组件的函数中混合了entity.addComponent,因为偶尔将行为作为方法调用很方便。但大多数情况下,组件声明了调用这些方法的侦听器,这有助于解耦并减少必须使用范围名称的尴尬,因为在大多数情况下我不直接调用它们。

    【讨论】:

    • NP :) 如果它回答了您的问题,请记住选中该框。
    • 是的,我感谢您,因为您的回答非常彻底,我很感激。不过,就目前而言,我想我会坚持使用类似 Crafty 的 getComponent("") 模型。感谢您向我推荐这个不错的框架。
    • Crafty 上很酷的发现,似乎是一个不错的快速引导工具集。
    • 你让我发现了entity component paradigm,而我正在寻找一种方法来避免奇怪的javascript对象编程语法。我不仅解决了简化语言的问题,而且发现了编写游戏的另一个视角。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    相关资源
    最近更新 更多