0

我对如何处理我的游戏/模拟框架的类结构有疑问。请注意,我这样做主要是为了自己的乐趣,我知道已经有很多好的解决方案了 :)

除其他外,框架的结构具有Scene包含Actors 的 s。Scenes 和s都Actor可以以许多不同的方式表现,WRT 内部工作方式的某些方面。我已经使用多重继承实现了这样的行为,如下所示:

class ActorBase : public Object { ... }; 
class Actor : virtual public ActorBase { ... };
class CollisionBehavior : virtual public ActorBase { ... }; 
class BoundingBoxCollisionBehavior : public CollisionBehavior { ... };
class MyActor : public Actor, public BoundingBoxCollisionBehavior { ... };

这样,使用虚拟继承,我可以将actor的实现与actor做什么(或它如何做)的实现分开。Actor和类都...Behavior需要访问公共基类来实现它们,但事物被整齐地划分,我可以通过简单地替换它继承ActorBase的类来轻松更改对象的行为。Behavior

但这有其局限性:由于每个行为都遵循其自己的内部规则,并且一个对象可以从单个对象继承Behavior(或者由于模棱两可的函数调用等而彻底崩溃),我永远不能让两个具有不同行为的参与者相互交互. 另外,由于我将 V8 Javascript 引擎集成到框架中,我必须为Actor(or Scene) 的每个可能组合及其可能的行为创建包装的子类,并以混合方式从 JS 实例化这些对象会导致再次崩溃,因为两个行为不同的对象不能相互交互(至少不是所有的东西)。

我认为另一种解决方案是放弃这种多重继承结构,转而采用这样的方式:需要Behaviors 的每个对象都有许多数组,每个Behavior组一个数组(如碰撞行为、移动行为等),带有一个...Behavior每个可能的行为的对象。我可以给一个对象一个默认行为,如果需要它(与具有不同默认行为的对象发生交互),我可以将这种行为添加到一个(或两个)对象,以便它们可以相互交互 - 那里需要某种转换策略,但这不是问题。这意味着有一个循环引用(对象实例引用行为实例,行为实例引用它包含的对象),以便行为能够访问它需要做自己的事情的基本属性。子类Behavior也需要friendActor类,以访问受保护和/或私有成员。我不是很喜欢这条路,我认为可能有一种更优雅的方法来解决这个问题,我只是还没有想到一个。

想法?:)

额外问题:我应该拼写 Behavior 还是 BehavioUr?不是母语人士!

编辑:解决了奖金问题-取决于或您在互联网上的感觉!:)

编辑 2:为清楚起见,从更改BehaviorCollisionBehavior(请参阅下面的答案)

4

1 回答 1

1

恐怕你在这里混合了东西。正如您所指出的,有许多不同种类的行为1

  • 行走行为
  • 说话行为
  • 战斗行为
  • ...

当然,与 aWalkingBehavior进行比较FightingBehavior是没有意义的,所以让它们共享一个基类也是没有意义的。

因此,我认为您应该只使用 Actors 并提供方法来检索这些行为:

class Actor {
public:
    virtual WalkingBehavior const& walkingBehavior() const {
        return DefaultWalkingBehavior;
    }

    virtual FightingBehavior const& fightingBehavior() const {
        return DefaultFightingBehavior;
    }

    // ...
}; // class Actor

默认行为的定义方式使其可以与其类的更常规行为交互。然后,每个特定的接口例如FightingBehavior应该提供必要的方法来理解这种行为。

请注意,这种编码信息的方法非常通用:您可以混合在编译时确定的行为和在运行时确定的行为(并且可能在运行时演变),而不会对客户端产生任何影响。

1就我个人而言,我只是按照我的内置浏览器拼写检查器进行操作。

于 2013-06-18T10:49:27.857 回答