转自http://www.aisharing.com/archives/530

行为树最后一个要讲的地方,是关于前提(Precondition),在第一部分里,我略微提到了一下,这次我们来仔细看看,再来看看关于前提的纯虚基类的定义:

 1: class BevNodePrecondition
 2: {
 3: public:
 4:     virtual bool ExternalCondition(const BevNodeInputParam& input) const = 0;
 5: };

每一个前提类,都需要实现这个判断的虚函数。我在《用类来表示逻辑运算–关于行为树前提的一种实现方式》提到,我们可以用类来表示逻辑运算,这样的好处是可以做到模块化,同样的判断条件可以复用,所以在库中,我也实现了这种逻辑的表达方式,定义了基本的逻辑运算类

 1: class BevNodePreconditionTRUE{};
 2: class BevNodePreconditionFALSE{};
 3: class BevNodePreconditionNOT{};
 4: class BevNodePreconditionAND{};
 5: class BevNodePreconditionOR{};
 6: class BevNodePreconditionXOR{};

从这些类的名字应该就可以明显的看出这些类的含义了,和逻辑操作符一样,有些类的构造函数需要两个参数,以此来表示二元的逻辑运算(AND,OR,XOR),有些只需要一个参数,以此来表示一元的逻辑运算(NOT)。前提类被用来附在行为树的节点上(每一个节点都可以附加),默认情况下,节点上是没有前提类的,也就是不存在“外在前提”,而只有“内在前提”,这和附了一个BevNodePreconditionTRUE(永远返回True)的“外在前提”的节点是等价的。

好了,行为树库的内容基本就是这些了。接下去我们来看看例子程序,介绍如何用库来创建行为树,例子的代码在BevTreeTest这个工程中,编译后可直接运行,这个例子分别演示了三个行为树,从简单到复杂,单击鼠标可以在这三个例子间切换。这个程序实现了这样一个功能,“在场景地图上,定时会产生一个目标点,智能体就会根据行为树的定义,用不同的行为模式移动到目标点”。

在这个程序中,我为智能体一共定义了4个行为:

 1: class NOD_Idle{};      //空闲,表现是颜色不停变化
 2: class NOD_Breathe{};   //呼吸,表现是大小规律性变化
 3: class NOD_MoveTo{};    //移动,平移到某目标点
 4: class NOD_FaceTo{};    //转向,转向到某方向

再定义了2个“外在前提”:

 1: class CON_HasReachedTarget{};    //是否到达目标点
 2: class CON_HasFacedToTarget{};    //是否朝向目标点

我就用第一个例子来说,第一例子的行为树图如下:

这是一个很简单的行为树,根节点是一个带优先级的选择节点,所以MoveTo比Idle的优先级高,MoveTo带有一个“外在前提”,“当没有到达目标点”时,会选在MoveTo的行为,反之,则选Idle的行为。

在代码中,可以这样来定义这棵行为树

 1: BevNode& ret =
 2:     BevNodeFactory::oCreatePrioritySelectorNode(NULL, "root");
 3:         BevNodeFactory::oCreateTeminalNode<NOD_MoveTo>(&ret, "move to")
 4:             .SetNodePrecondition(new BevNodePreconditionNOT(new CON_HasReachedTarget()));
 5:         BevNodeFactory::oCreateTeminalNode<NOD_Idle>(&ret, "idle")
 6:             .SetNodePrecondition(new BevNodePreconditionTRUE());
 7: m_BevTreeRoot = &ret;

我在库中定义了一些工厂方法,帮助创建相关的节点。值得注意的是,我在这里演示了用类表示逻辑的用法。我在定义行为树的时候,会用一些格式上的缩进,来表示相应的父子结构,这仅仅是为了视觉上比较明了。当然,以后可以改进行为树的定义接口,更可以用数据文件来定义行为树。

这样定义完毕后,我们就可以用行为树来决策我们的行为了,代码相当简单

 1: BevNodeInputParam input(&m_BevTreeInputData);
 2: BevNodeOutputParam output(&m_BevTreeOutputdata);
 3: if(m_BevTreeRoot->Evaluate(input))
 4: {
 5:     m_BevTreeRoot->Tick(input, output);
 6: }

在例子中,我尽量把行为树中要输出的变量写到BevNodeOutputParam结构中(而不是直接修改智能体的信息),这样做的好处是可以让行为树的输入和输出的接口相当清晰,做成黑盒,可以参考我在这里的讨论。

第二个例子演示了并行节点的用法,第三个例子演示了序列节点的用法,就不多说了,大家可以自行看代码。

所有的代码可以通过以下方式获得:

下载地址:

GoogleCode下载点(exe文件夹中已包含可执行文件)

也可用svn通过以下地址来得:

http://tsiu.googlecode.com/svn/branches/blogver/

编译方法:

用VS2005以上打开,选择Debug NoDx或者Release NoDx,编译后,运行BevTreeTest.

相关代码:

TAI_BevTree.h

TAI_BevTree.cpp

关于TsiU

TsiU是我一直在维护的一个自己用的小型的框架,我平时做的一些AI的sample,或者一些工具,都会基于这个框架,TsiU有一些基本的UI控件库,网络模块库,GDI绘图模块,D3D绘图模块等等,可以快速的做成一个小型的示例程序,很方便(具体可参考SampleApps里的例子程序),并且整个架构是用Object的方式来组织,非常容易理解和扩展。整个框架很轻量化,基本就是做了一些底层的基本的功能,这样我在平时做东西的时候,就不需要重新写底层了,把精力都放在高层的实现了。以后分享代码都会基于这个框架,大家也可以通过svn来随时update到我最新的改动。下图就是TsiU里的几个工程介绍,代码不多,大家想看的也可以自己看一下:)

转载于:https://blog.51cto.com/568464209/1732928

用800行代码做个行为树(Behavior Tree)的库(3)相关推荐

  1. c语言800行代码系统,用800行代码做个行为树(Behavior Tree)的库(1)

    最近一直在忙新项目的准备,甚少涉及AI的东西,所以博客也疏于更新.春节前,收到一个网友的邮件,说看了行为树的一些东西,但还是不知道如何去入手实现,我就乘着春节假期,动手写了一个简单的行为树的库,和大家 ...

  2. python3版本800行的代码_用800行代码做个行为树(Behavior Tree)的库(3)

    行为树最后一个要讲的地方,是关于前提(Precondition),在第一部分里,我略微提到了一下,这次我们来仔细看看,再来看看关于前提的纯虚基类的定义: 1: class BevNodePrecond ...

  3. 用800行代码做个行为树(Behavior Tree)的库(2

    上一次说到了节点的基类,它描述了在行为树上一个节点的基本结构.我们知道,在行为树上有两大类的节点,一种我称之为"控制节点",像"选择节点","并行节点 ...

  4. 初次玩pyecharts:30行代码做一个可视化广东省各地天气温度排行图

    初次玩pyecharts:30行代码做一个可视化广东省各地天气温度排行图 开篇点题,直接上效果图 开篇再点题,直接上源码 import re import requests from pyechart ...

  5. 使用行为树(Behavior Tree)实现游戏AI

    注意:本文版权归Csdn AKara所有,此处纯粹转载,如有再转,请严格按如下方式显示标明原创作者及出处,以示尊重!! 关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上 ...

  6. 使用行为树(Behavior Tree)实现网游奖励掉落系统

    原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统 by AKara 2 ...

  7. 行为树 Behavior Tree 原理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/LIQIANGEASTSUN/arti ...

  8. 行为树 Behavior Tree 原理 一

    行为树 Behavior Tree 原理 一 行为树 结构图如下,一棵倒置的树 行为树采用节点描述行为逻辑,主要节点类型有: 组合节点:选择节点.顺序节点.随机选择节点.随机顺序节点.随机权重节点.并 ...

  9. 用30行代码做一个微信智障机器人

    起因是某天早上看到这样一条朋友圈: 微信啥时候还有会员了?可怕,花里胡哨,这是要往QQ的方向发展吗.还是 Telegram 比较存粹. 连IS恐怖组织都在使用,最安全的即时通讯软件--Telegram ...

最新文章

  1. 【Python学习系列二】Python默认编码和Eclipse环境的冲突问题
  2. 局部线性嵌入(LLE)算法matlab可运行
  3. java线程----生产者和消费者问题
  4. INITRANS和MAXTRANS参数的作用
  5. npm 全局安装node module并查看安装路径
  6. 华为:行业危机时,只做一件事:抢人!
  7. Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
  8. AWVS14.1.2下载安装教程(2021.3.6版本)
  9. matlab画简谐振动图,基于MATLAB的简谐振动合成图形的动态演示.pdf
  10. local variable ‘count‘ referenced before assignment
  11. 苹果app退款_??充值消费退款
  12. 我的世界超能物质纳米机器人_超能物质复制物品教程(附图) - [MO]超能物质 (Matter Overdrive) - MC百科|最大的Minecraft中文MOD百科...
  13. Unity鼠标拖拽旋转拉远拉近场景
  14. webpack调用vue中报错, [WDS] Disconnected!解决方法
  15. Ubports安装和使用gedit和ros等记录(仅供参考)
  16. git 创建远程新分支
  17. 紧随时代的步伐--Java8之Lambda表达式的使用
  18. 天猫HTMl静态页面
  19. 富文本编辑器三种不同图片上传功能
  20. 基于HTML旅游网站设计与实现 途游网站制作 学生DW静态旅游网页设计 html静态旅游风景区网页设计制作 web前端课程设计 web前端课程设计代码 web课程设计

热门文章

  1. Word 2007 如何自动生成目录以及设置正文第一页?
  2. 真实、可量化的密码强度以及如何衡量密码强度
  3. Java 14 GA 版本正式发布
  4. java卡写入_写入SD卡的权限
  5. bootstrap 合并单元格之mergeCells属性合并
  6. 如何将计算机硬盘导出,win7系统电脑下硬盘导入与导出数据的一些注意事项
  7. 非常详细 !!!支付宝支付功能开发配置Demo演示
  8. mysql正则替换_MySQL中使用replace、regexp进行正则表达式替换的用法分析
  9. matlab三斜晶系,高分子与计算机模拟
  10. 网易智企跃入元宇宙,想成为To B的“头号玩家”