0

我有一个 android 游戏,它有许多不同类型的敌人,它们都是同一类(这样我就可以有一个对象池)。当这些敌人被构建时,它们在运行时会被赋予各种不同的属性,包括遵循哪种行为算法。目前,它看起来像这样:

public MoveableEntity build(float positionX, float positionY, MoveableEntityType type,
        int moveLogic, MoveableEntityType weaponType,
        int firePattern, int fireLogic) {

            //Take all the passed in arguments and build an entity

    }

现在在游戏更新循环中,每个实体都会经过几个管理器,这些管理器检查实体正在运行哪种类型的逻辑,并指示其行为:

public void updateEntity(MoveableEntity e) {
    switch (e.getiLogic()) {

    case STRAIGHT_LINE_MOVEMENT:
        straightLineMovement(e);
        break;
    case RANDOM_MOVING_LEFT:
        randomMovingLeft(e);
        break;
    case ADVANCE_THEN_RETREAT:
        advanceThenRetreat(e);
        break;
    case RUSH_THEN_RETREAT:
        rushThenRetreat(e);
        break;
                   //lots of logic types
            }

这种模式在整个游戏中变得相当普遍(移动逻辑,选择如何/何时攻击等)。我考虑过使用类似策略模式的东西,所以我可以这样说:

public MoveableEntity build(float positionX, float positionY, MoveableEntityType type,
    MoveLogic moveLogic...) {

    this.moveLogic = moveLogic;
        //Take all the passed in arguments and build an entity

}

public void update() {
    //do some updating

   //execute assigned AI
   moveLogic.execute(this);

   //other stuff
  }

这很好,但我最终会为实体使用的所有不同类型的 AI 组件创建大量额外的类。基本上我的问题归结为:有没有办法在这种情况下实现面向对象友好的解决方案,不需要我创建/销毁许多新对象(因此可能会损害性能)?这种情况下的几个 switch 语句可以吗?我的方法应该是什么?

4

4 回答 4

0

您可以将单例模式用于 MoveLogic 类,因此不要使用

this.moveLogic = new MoveLogic();

您可以使用:

this.moveLogic = MoveLogic.getInstance();

因此只为每个 MoveLogic 类分配一个 MoveLogic 对象。

于 2013-07-29T08:20:47.960 回答
0

您应该将具有相似行为的敌人分组。

  1. 假设您有一个laser_alien 敌人类型,它具有某种类型的运动(例如,一些以螺旋顺序移动,一些锯齿形等)并沿途投掷激光子弹。

  2. 现在你有另一种类型的敌人,其专长是携带某种磁铁,将玩家拉近他们,这样玩家就会失去健康。这种类型的敌人说只能在一个方向上移动,从左到右或反向。

分离这两种类型的敌人,然后在您的游戏世界中创建这些敌人的实例。这样,您可以轻松地维护不同的敌人类别。假设您现在需要在上面的第一个点为敌人添加另一种类型的移动,在这种情况下您不必触摸上面的第 2 个。如果你有这么多的变种,你将留下一个庞大的敌人类别,最终将难以维持。我会告诉您以正确的 OOP 方式实现所有内容,但这会影响您的游戏性能。

并且请在你的敌人类中有相应的更新方法。不要在您的游戏世界级中编写更新代码。在游戏世界中,更新方法应该很简单——

for(LaserEnemy lEnemy : laserEnemies){
   lEnemy.update(deltaTime);
}
于 2013-07-29T08:15:53.493 回答
0

我会改用模板设计模式。通过这样做,您可以在超类中拥有通用代码,并在子类中实现差异。

此外,我认为创建很多类比一堆意大利面条代码要好得多。从长远来看,它将变得难以管理且无法调试。只需创建一个新文件夹并将所有 AI 组件放入其中。

于 2013-07-29T08:16:11.427 回答
0

为了防止创建大量额外的类,您可以创建一个移动逻辑策略的工厂类

public class MoveLogicFactory{

    public static MoveLogic createStraightLineMovementLogic(){
        //return a an anonymous inner class of type MoveLogic
        return new MoveLogic(){
            //apply your codes for this specific move logic
        }
    }

    public static MoveLogic createRandomMovingLeftLogic(){
        //... do the same as the first method
    }

    public static MoveLogic createAdvanceThenRetreatLogic(){
        //... do the same as the first method
    }

    public static MoveLogic createRushThenRetreatLogic(){
        //... do the same as the first method
    }
}
于 2013-07-29T08:31:31.407 回答