我正在使用LibGDX作为主库在Java中编写一个简单的射击游戏。我希望游戏中的任何敌人都可以执行任何类型的移动,无论其类型如何。当试图将AI与每个Enemy类的动作逻辑隔离开来时会出现问题。
一个更加图解的例子:
敌人:
最好的方法是什么?
答案 0 :(得分:0)
声明一个抽象类MoveType
和一个抽象类Monster
。
提供Monster
方法setPosition(int x, int y)
。给MoveType
一个包含Monster
类型变量的字段。使MoveType
具有抽象方法,用于根据当前位置,玩家位置等确定移动的方式和位置。Monster
可以有一个名为move()
的方法,该方法调用抽象方法,然后调用{ {1}}实施所选择的行动。
然后声明Monster.setPosition()
的实现,例如MoveType
,MoveA
等。那些应该使用自己的内部逻辑来确定如何移动。
确保您允许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/ashley或https://github.com/junkdog/artemis-odb等实体系统库。
然后您将创建系统:
LinearTopBottomMovementSystem
ChasePlayerMovementSystem
ShowUpSystem
ShootSystem
(您可能还需要BulletMovementSystem
)FleeSystem
然后创建组件:
LinearTopBottomMovementComponent
ChasePlayerMovementComponent
ShowUpComponent
ShootComponent
FleeComponent
创建敌人(实体)时,您创建:
LinearTopBottomMovementComponent
ChasePlayerMovementComponent
ShowUpComponent
ShowUpComponent
后(ShowUpSystem
),删除此组件并添加ShootComponent
ShootComponent
后(ShootSystem
),删除此组件并添加FleeComponent
这允许您使用所有可能的组件组合创建敌人,并且您可以将多个组件添加到一个实体。
如果你决定添加圈子运动和永久火力敌人。只需创建CircleMovementComponent
和PermanentFireComponent
以及相应的系统。