我有一个 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 语句可以吗?我的方法应该是什么?