当前位置: 首页 > news >正文

教程8:结构体的添加和使用-–-behaviac

原文

本文档描述的是3.6及以后版本,对于3.5及以前的老版本请参考分类“3.5”。

对于结构体类型的使用,包括新增全新的结构体和扩展使用已有的结构体。对于新增的结构体,又包括编辑器是否自动生成该结构体的代码。

实际上,我们将新增结构体,又不自动生成该结构体代码的情况,认为跟扩展使用已有的结构体是一致的,即都是在程序端已经有了该结构体的定义代码(要么手工编写,要么第三方代码已经包含了该结构体的定义),不用再让编辑器自动生成。

进而,后文将只通过**“生成代码”“不生成代码”**来区分上面所说的各种使用情况,但这里需要注意的是,生成或不生成代码,只是针对结构体本身的定义而言,而结构体相关的“胶水”代码都是会自动生成的,并且必须要整合到自己的项目中一起编译构建。

1. 如果是“生成代码”的情况,则忽略这一步说明。否则,如果是“不生成代码”的情况,这里假定程序端已经有了结构体类型文件FirstStruct.h,该文件中包含了结构体“FirstStruct”的定义,如下代码所示:

structFirstStruct{ints1;floats2;};

2. 在类型信息浏览器中新增跟程序端同名的结构体类型“FirstStruct”,并且根据自己的需要,来决定是否勾选“生成代码”选项(如果只是扩展使用已有的结构体,则不需要勾选),如下图所示:

3. 上图中的“引用类型”选项,一般不用勾选,表示在行为树编辑器中可以为该结构体配置其成员属性,并且在该结构体的两个实例做比较运算时,会比较所有的成员属性。否则,如果勾选了“引用类型”选项,则表示该结构体在行为树中使用时是作为引用类型来使用,在该结构体的两个实例做比较运算时,只会比较两个实例的引用(指针),而不比较其内容(成员属性)。

4. 为结构体“FirstStruct”添加成员属性s1和s2,这跟程序端的定义保持一致,如下图所示:

5. 对于C++版的运行时库,如果是“生成代码”的情况,则忽略这一步操作。否则,如果是“不生成代码”的情况,则说明程序端已经有了包含该结构体类型的头文件。点击上图右上方的“设置头文件”按钮,弹出“C++导出设置”窗口,并添加已有的结构体头文件FirstStruct.h,如下图所示:

6. 点击类型信息浏览器右下方的“应用”按钮,这样会在“代码生成位置”中生成该结构体的定义(如果上面勾选了“生成代码”选项)及相关的“胶水”代码behaviac_customized_types.h等文件,如下代码所示:

BEHAVIAC_EXTEND_EXISTING_TYPE_EX(FirstStruct,false);BEHAVIAC_DECLARE_TYPE_VECTOR_HANDLER(FirstStruct);// 如下结构体的定义代码,会根据是否勾选了上面所说的“生成代码”选项来决定是否生成structFirstStruct{ints1;floats2;};// 如下代码,不管是否勾选了“生成代码”选项,都会自动生成BEHAVIAC_EXTEND_EXISTING_TYPE_EX(FirstStruct,false);BEHAVIAC_DECLARE_TYPE_VECTOR_HANDLER(FirstStruct);template<typenameSWAPPER>inlinevoidSwapByteImplement(FirstStruct&v){SwapByteImplement<SWAPPER>(v.s1);SwapByteImplement<SWAPPER>(v.s2);}namespacebehaviac{namespacePrivateDetails{template<>inlineboolEqual(constFirstStruct&lhs,constFirstStruct&rhs){returnEqual(lhs.s1,rhs.s1)&&Equal(lhs.s2,rhs.s2);}}}

7. 为FirstAgent类新增成员属性p1,其类型是结构体FirstStruct,如下图所示:

8. 点击类型信息浏览器右下方的“应用”按钮,将“代码生成位置”中behaviac_generated/types目录下所有生成的代码文件,添加到自己的项目中一起编译构建。

9. 新增行为树“StrcutBT”,并使用成员属性p1来赋值和做比较运算,如下图所示:

10. 执行该行为树,得到如下执行结果:

本教程相关的工作区和代码工程详见源码包的目录tutorials/tutorial_8。

http://www.jsqmd.com/news/88898/

相关文章:

  • 蓄电池与超级电容器混合储能并网的Simulink仿真探索
  • macOS 的两款好用的免费截图软件: shottr 和 snipaste
  • 教程9:枚举的添加和使用-–-behaviac
  • QSharedMemory 变量在对象析构的时候要怎么处理
  • TikTok达人合作订单太繁琐?影刀RPA一键智能处理,效率飙升10倍![特殊字符]
  • 投机推理原理及设计
  • 前端保存用户登录信息 深入全面讲解
  • 影刀RPA颠覆传统!TikTok售后工单智能处理,效率提升500%[特殊字符]
  • 【开题答辩全过程】以 基于PHP的乐高学习网站管理系统的设计实现为例,包含答辩的问题和答案
  • 【Java毕设全套源码+文档】基于springboot的高校大学生心理咨询管理系统设计与实现(丰富项目+远程调试+讲解+定制)
  • 异步SAR Simulink模型及其在MATLAB仿真中的应用
  • 【开题答辩全过程】以 基于Node.js的医院预约挂号系统为例,包含答辩的问题和答案
  • vue基于Spring Boot框架的在线电影票购买系统的设计与实现_8xxt52nn
  • 学完这个C++内存池案例,你对内存管理的理解将超越大部份人
  • Cplusplus生成代码大小的说明-–-behaviac
  • 手把手拆解三菱PLC印字机实战项目
  • 【免费领源码】Python/Mysql数据库+53824中国传统服装微信小程序的设计与实现+ 计算机毕业设计项目推荐上万套实战教程JAVA、PHP,node.js,C++、python、大屏数据可视化
  • 开发功能开关-–-behaviac
  • 三菱PLC组装机学习笔记
  • Go 语言结构体
  • 当卷积网络遇上双向记忆:玩转时间序列预测新姿势
  • 【开题答辩全过程】以 高校篮球社团管理系统 为例,包含答辩的问题和答案
  • JavaScript闭包终极指南:从原理到实战(2025版)
  • 【开题答辩全过程】以 基于PHP的公司员工管理系统为例,包含答辩的问题和答案
  • 第八周学习
  • Week 29: 深度学习补遗:MoE的稳定性机制与路由策略实现
  • 有关C语言中自加和自减与计算机底层硬件的关糸
  • Arbess从初级到进阶(3) - 利用Arbess+GitLab+SonarQube搭建Java计划自动化部署
  • 告别机房管理噩梦,首码磁控U位系统来“救场”
  • 课程设计(自主选题)