本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2016/06/11/libgdx-ai-fsm/
LIbgdx旗下的gdx-ai库提供了大量使用的AI算法,其中包括了最常见的有限状态机FSM。
gdx-ai是一个普通的java库,并不存在平台相关依赖,所以直接在core中引入就可。
dependencies {
compile "com.badlogicgames.gdx:gdx-ai:1.7.0"
}
StateMachine是有限状态机的接口,对应的实现目前有两个DefaultStateMachine和StackStateMachine。
StackStateMachine以栈的形式保存状态,所以可以提供了方法获取上一个状态,一般使用DefaultStateMachine就行了。
FSM的例子很多,我们直接来一个简单的。
首先主体对象是人,而人只有两个状态,一个走路,一个打伞。
状态切换的条件是时间,也就是假定下雨的时间符合一定的条件。
首先创建一个Person类
public class Person extends Image {
private TextureRegion walk;
private TextureRegion rain;
private StateMachine<Person, PersonState> stateMachine;
private float time;
public Person(final TextureRegion walk, final TextureRegion rain) {
super(walk);
this.walk = walk;
this.rain = rain;
stateMachine = new DefaultStateMachine<Person, PersonState>(this, PersonState.WALK);
}
public void showRain() {
setDrawable(new TextureRegionDrawable(rain));
setSize(getPrefWidth(), getPrefHeight());
}
public void showWalk() {
setDrawable(new TextureRegionDrawable(walk));
setSize(getPrefWidth(), getPrefHeight());
}
public void update(float delta) {
time += delta;
stateMachine.update();
}
}
当初始化时默认状态是没有下雨了,而界面的表现就是显示不同的图片


而time就是总共经历的时间
在最关键状态处理逻辑,包括进入,更新,退出,接受消息,是放在对应的State中的。这里我们不考虑接受消息的情况,所以永远返回false。
public enum PersonState implements State<Person> {
WALK {
@Override
public void enter(Person entity) {
entity.showWalk();
}
@Override
public void update(Person entity) {
float v = entity.getTime() % 10;
if (v >= 6 || v <= 4) {
entity.getStateMachine().changeState(PersonState.RUN);
}
}
@Override
public void exit(Person entity) {
}
@Override
public boolean onMessage(Person entity, Telegram telegram) {
return false;
}
},
RUN {
@Override
public void enter(Person entity) {
entity.showRain();
}
@Override
public void update(Person entity) {
float v = entity.getTime() % 10;
if (v < 6 && v > 4) {
entity.getStateMachine().changeState(PersonState.WALK);
}
}
@Override
public void exit(Person entity) {
}
@Override
public boolean onMessage(Person entity, Telegram telegram) {
return false;
}
}
}
当在update中切换状态时,会自动触发对应的进入(enter)事件,所以也不需要额外的处理。
切换状态时的对应代码实现
@Override
public void changeState (S newState) {
// Keep a record of the previous state
previousState = currentState;
// Call the exit method of the existing state
if (currentState != null) currentState.exit(owner);
// Change state to the new state
currentState = newState;
// Call the entry method of the new state
if (currentState != null) currentState.enter(owner);
}
参考资料:
https://github.com/libgdx/gdx-ai/wiki/State-Machine
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2016/06/11/libgdx-ai-fsm/