我有一个安卓游戏,它有许多不同类型的敌人都是同一个类(所以我可以有一个单独的对象池)。当构造这些敌人时,它们在运行时被赋予各种不同的属性,包括遵循哪种行为算法。目前,它看起来像这样:
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语句可以吗?我的方法应该是什么?
答案 0 :(得分:0)
你应该对具有相似行为的敌人进行分组。
假设你有一个激光类型的敌人类型,它有某种类型的移动(例如一些螺旋顺序移动,一些曲折等)并沿途抛出激光子弹。
现在你有另一种类型的敌人,他们的专长是携带某种类型的磁铁,让玩家更接近他们,这样玩家就会失去健康。这种类型的敌人说只能从一个方向向左或向右移动。
分离这两种类型的敌人,然后在游戏世界中创建这些敌人的实例。这样您就可以轻松维护不同的敌人类别。假设您现在需要在上面的第一点添加另一种类型的移动,在这种情况下,您不必触及上面的数字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
}
}