Java游戏服务器开发之行为树(二)
昨天将一些基础的骨架搭建完成,现在将剩余的部分完善,包括装饰器和并行器。基于事件的行为树没有研究透,应该会在下一篇之中书写。
IDecorator,装饰器,主要是对子节点进行修饰,比如可以做到重复多次子节点。
IParallel,并行器,主要是指多个指令可以同时触发。
下面2个就是具体的实现
public class Repeat extends BaseDecorator {
private int limited = 3;
private volatile int count = 0;
@Override
public EStatus update() {
while (true) {
child.tick();
switch (child.getStatus()) {
case Running:
return EStatus.Success;
case Failure:
return EStatus.Failure;
default:
break;
}
if (++count > limited)
return EStatus.Success;
child.reset();
}
}
@Override
public void onInitialize() {
count = 0;
}
@Override
public void addChild(IBehaviour child) {
super.addChild(child);
}
}
主要看update中的代码,就是重复执行三次子节点。
再看看并行器
public class ParallelImpl extends BaseComposite implements IParallel {
EPolicy successPolocy;
EPolicy failPolocy;
public ParallelImpl(EPolicy successPolocy, EPolicy failPolocy) {
this.successPolocy = successPolocy;
this.failPolocy = failPolocy;
}
@Override
public EStatus update() {
int successCount = 0, failureCount = 0;
int childrenSize = getChildren().size();
for (IBehaviour iBehaviour : getChildren()) {
//如果行为已经终止则不再执行该行为
if (!(iBehaviour.getStatus().equals(EStatus.Success) || iBehaviour.getStatus().equals(EStatus.Failure)))
iBehaviour.tick();
if (iBehaviour.getStatus().equals(EStatus.Success)) {
++successCount;
if (successPolocy.equals(EPolicy.RequireOne)) {
iBehaviour.reset();
return EStatus.Success;
}
}
if (iBehaviour.getStatus().equals(EStatus.Failure)) {
++failureCount;
if (failPolocy.equals(EPolicy.RequireOne)) {
iBehaviour.reset();
return EStatus.Failure;
}
}
}
if (failPolocy.equals(EPolicy.RequireAll) && failureCount == childrenSize) {
for (IBehaviour iBehaviour : getChildren()) {
iBehaviour.reset();
}
return EStatus.Failure;
}
if (successPolocy.equals(EPolicy.RequireAll) && successCount == childrenSize) {
for (IBehaviour iBehaviour : getChildren()) {
iBehaviour.reset();
}
return EStatus.Success;
}
return EStatus.Running;
}
@Override
public void onTerminate(EStatus Status) {
for (IBehaviour iBehaviour : getChildren()) {
if(iBehaviour.getStatus().equals(EStatus.Running)){
iBehaviour.abort();
}
iBehaviour.reset();
}
}
}
这个并行器传入2个参数,一个是成功返回条件,和失败返回条件,
nice
上面的代码在码云上 https://gitee.com/lizhaoandroid/BehaviorTree,定格分支为release1.2上
可以加qq群一起学习讨论Java游戏服务器开发的相关知识 676231524