AI系统学习笔记
AbstractAi
所有AI都继承于AbstractAi
,他拥有一个AI所必须的状态迁移器,基础状态处理器。
public abstract class AbstractAi {
// 状态迁移器
private IStateConverter stateConverter;
// 基础状态处理器
private AbstractBaseStateHandler baseStateHandler;
// AI事件处理器集合
private Map<AiEvent, AbstractEventHandler> eventHandler = new HashMap<>();
// AI状态处理器集合
private Map<AIState, AbstractStateHandler> stateHandlers = new HashMap<>();
protected Npc owner;
protected AIState aiState = AIState.NONE;
// 执行帧数,用于控制各个状态处理器的执行频率
private long tickCount;
// AI配置信息
private AiResource aiResource;
private SkillSelector skillSelector;
// Npc外显状态,分为“外显激活”和“外显未激活”两种。
// 大部分的NP都是“外显激活”状态,只有个别特殊怪会有“外显未激活”状态,如封印僧侣、食人花等。
private NpcShowStatus npcShowStatus = NpcShowStatus.SHOW_ACTIVED;
// 延迟处理AI事件
// 从AI线程以外的线程抛出的事件应该先添加到AI线程中,然后延时处理
// owner of this AI
public Npc getOwner() {
return ownwer;
}
// 装配事件处理器
// 装配状态处理器
// 心跳
private void tick() {
this.tickCount++;
// 处理被动技能
handlerPsvSkill();
// 处理基础行为
if(baseStateHandler != null) {
baseStateHandler.handleState(this);
}
// 判断状态迁移
if(stateConverter == null) {
throw new IllegalStateException(getClass().getSimpleName()+" 缺少状态迁移器,AI宿主:"+owner.getName());
}
stateConverter.concerState(this);
// 处理具体状态
if(!owner.isActing()) {
AbstractStateHandler stateHandler = stateHandlers.get(aiState);
if(stateHandler == null) {
throw new IllegalStateException(getClass().getSimpleName() + "缺少相应的状态处理器,AiState : " +aiState + ",AI宿主:"+ owner.getName()));
}
if(this.tickCount % stateHandler.getFrequency(this) == 0) {
stateHandler.handlerState(this);
}
}
}
// 开启心跳
public void schedule() {
if(!isScheduled()) {
this.tickCount = 0;
this.tick.trySchedule();
}
}
}