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