游戏开发中的几个敌人动作

时间:2016-06-22 22:56:53

标签: java design-patterns libgdx

我正在使用LibGDX作为主库在Java中编写一个简单的射击游戏。我希望游戏中的任何敌人都可以执行任何类型的移动,无论其类型如何。当试图将AI与每个Enemy类的动作逻辑隔离开来时会出现问题。

一个更加图解的例子:

  1. Mov A:线性,从上到下。
  2. Mov B:追逐玩家角色
  3. Mov C:出现,射击并逃离。
  4. 敌人:

    1. 蜘蛛。执行Mov A
    2. 另一只蜘蛛。执行Mov B
    3. 总结一下:无论敌人如何,都可以分配动作。
    4. 最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

声明一个抽象类MoveType和一个抽象类Monster

提供Monster方法setPosition(int x, int y)。给MoveType一个包含Monster类型变量的字段。使MoveType具有抽象方法,用于根据当前位置,玩家位置等确定移动的方式和位置。Monster可以有一个名为move()的方法,该方法调用抽象方法,然后调用{ {1}}实施所选择的行动。

然后声明Monster.setPosition()的实现,例如MoveTypeMoveA等。那些应该使用自己的内部逻辑来确定如何移动。

确保您允许MoveB使用某种方法来设置Monster' Monster

此方法使您可以灵活地添加更多怪物或移动类型,而无需修改底层结构。您需要做的就是定义一个新的MoveType,实现移动位置的逻辑,并将新MoveType的实例传递给MoveType的实例。您甚至可以根据某些条件更改游戏中间Monster的移动类型(可能是当它与玩家足够接近时)。

下面未经测试的例子,但想法应该是可靠的:

Monster

-

public abstract class Monster {
 public int xPosition;
 public int yPosition;

 public MoveType move;

 public Monster(int x, int y, MoveType move) {
  xPosition = x;
  yPosition = y;
  this.move = move;
 }

 public void setPosition(int x, int y) {
  xPosition = x;
  yPosition = y;
 }

 public void move() {
  setPosition(move.determineXMove(), move.determineYMove());
 }
}

-

public abstract class MoveType {
 public Monster monster;

 public MoveType(Monster monster) {
  this.monster = monster;
 }

 public abstract void determineXMove();
 public abstract void determineYMove();
}

使用上面你会声明一个怪物,传递一个新的起始位置和public class MoveLeft extends MoveType() { @Override public void determineXMove() { return monster.xPosition - 1; } @Override public void determineYMove() { return monster.yPosition; } } 对象。然后你会在你的游戏循环中不断调用它的MoveLeft方法。

答案 1 :(得分:0)

使用https://github.com/libgdx/ashleyhttps://github.com/junkdog/artemis-odb等实体系统库。

然后您将创建系统:

  1. LinearTopBottomMovementSystem
  2. ChasePlayerMovementSystem
  3. ShowUpSystem
  4. ShootSystem(您可能还需要BulletMovementSystem
  5. FleeSystem
  6. 然后创建组件:

    1. LinearTopBottomMovementComponent
    2. ChasePlayerMovementComponent
    3. ShowUpComponent
    4. ShootComponent
    5. FleeComponent
    6. 创建敌人(实体)时,您创建:

      1. LinearTopBottomMovementComponent
      2. 的蜘蛛实体
      3. 另一个ChasePlayerMovementComponent
      4. 的蜘蛛实体
      5. ShowUpComponent
      6. 的蜘蛛实体
      7. 处理ShowUpComponent后(ShowUpSystem),删除此组件并添加ShootComponent
      8. 处理ShootComponent后(ShootSystem),删除此组件并添加FleeComponent
      9. 这允许您使用所有可能的组件组合创建敌人,并且您可以将多个组件添加到一个实体。

        如果你决定添加圈子运动和永久火力敌人。只需创建CircleMovementComponentPermanentFireComponent以及相应的系统。