没有分配新对象的策略模式

时间:2013-07-29 07:58:55

标签: java

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

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组件创建大量的额外类。基本上我的问题归结为:在这种情况下是否有办法实现OO友好解决方案,不需要我创建/销毁大量新对象(从而可能会损害性能)?这个场景中有几个switch语句可以吗?我的方法应该是什么?

4 个答案:

答案 0 :(得分:0)

你应该对具有相似行为的敌人进行分组。

  1. 假设你有一个激光类型的敌人类型,它有某种类型的移动(例如一些螺旋顺序移动,一些曲折等)并沿途抛出激光子弹。

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

  3. 分离这两种类型的敌人,然后在游戏世界中创建这些敌人的实例。这样您就可以轻松维护不同的敌人类别。假设您现在需要在上面的第一点添加另一种类型的移动,在这种情况下,您不必触及上面的数字2。如果你有这么多的变数,你将会留下一个巨大的敌人阶级,最终将是一个痛苦的维持。我会告诉你以适当的OOP方式实现一切,但它会影响你的游戏性能。

    请在你的敌人课程中有相应的更新方法。不要在游戏世界类中编写更新代码。在游戏世界中,更新方法应该像 -

    一样简单
    for(LaserEnemy lEnemy : laserEnemies){
       lEnemy.update(deltaTime);
    }
    

答案 1 :(得分:0)

我会使用模板设计模式。通过这样做,您可以在超类中使用公共代码,并只实现子类中的差异。

另外我认为创建很多类比使用意大利面条代码更好。从长远来看,它将变得难以管理并且无法进行调试。只需创建一个新文件夹并将所有AI组件放在那里。

答案 2 :(得分:0)

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

this.moveLogic = new MoveLogic();

您可以使用:

this.moveLogic = MoveLogic.getInstance();

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

答案 3 :(得分:0)

为了防止创建大量额外的类,您可以创建factory class移动逻辑策略。

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