原生 sln 生成

生成代码

  1. behaviac_types.h 需要包含到项目代码中,便于使用自动生成的类型和胶水代码
    • 项目只要包含这个就可以了
  1. internal/behaviac_agent_member_visitor.h 包含用于访问类的私有属性和方法的胶水代码
  2. internal/behaviac_agent_meta.h 和 internal/behaviac_agent_meta.cpp 包含用于注册类及其属性、方法、实例等信息的胶水代码

构建 c++ 运行库

  1. 下载源码
  2. 下载 cmake
  3. 下载 vs2019
    1. 用于 cmake 构建 vs2019 版本
  1. 使用 cmake 的 cmake_gui 生成
    image.png
    • 注意,通过 cmake --help 可以看到 2019 无法显示指定 win64,貌似默认就是 64 位了
  1. 注意 image.png 选项选择关闭, 则生成静态库
  2. 找到 lib_build 下的 behaviac.sln,用 vs2019 打开
  • 打开上面 cmake 生成后 lib_build 文件夹中的 ALL_BUILD.vcxproj
  • 关闭警告报错(都配一下)
    image.png
  • 选择 libbehaviac
    image.png
  1. 生成 lib 包 /或者对着项目右键生成
    image.png

生成

  • 如果是静态库,则会生成到 lib 文件夹中
  • 如果是运行库,会生成到 bin 文件夹中!!!

helloWorld

实际文件夹

image.png

  • 蓝色是 behaviac 生成的胶水代码
  • 黄色是 behaviac 源码,也是 lib 库的头文件
  • 紫色是上一节生成的静态库 lib

vs项目大纲

image.png

引入 inc

image.png

  • 注意写相对路径

引入lib

image.png

  • 注意写相对路径

代码

  1. #include <iostream>
  2. #include "exported/behaviac_generated/types/behaviac_types.h"
  3. using namespace std;
  4. FirstAgen* p_firstAgen = NULL;
  5. /*
  6. 初始化加载目录和文件格式
  7. */
  8. bool InitBehaviac();
  9. /*
  10. 创建实例,加载指定的行为树,
  11. */
  12. bool InitPlayer();
  13. /*
  14. 执行行为树
  15. */
  16. void UpdateLoop();
  17. /*
  18. 对创建的 agent 实例进行销毁释放
  19. */
  20. void CleanUpPlayer();
  21. /*
  22. * 清理整个工作区
  23. */
  24. void CleanUpBehaviac();
  25. int main()
  26. {
  27. cout << InitBehaviac() << endl;
  28. cout << InitPlayer() << endl;
  29. UpdateLoop();
  30. CleanUpPlayer();
  31. CleanUpBehaviac();
  32. return 0;
  33. }
  34. bool InitBehaviac() {
  35. cout << "init behaviac" << endl;
  36. // 设置加载编辑器导出的行为树所在的目录。
  37. behaviac::Workspace::GetInstance()->SetFilePath("./exported");
  38. // 设置加载的行为树格式,这里用的是xml格式。
  39. behaviac::Workspace::GetInstance()->SetFileFormat(behaviac::Workspace::EFF_xml);
  40. return true;
  41. }
  42. bool InitPlayer() {
  43. cout << "init player" << endl;
  44. // 创建 Agent 子类的实例
  45. p_firstAgen = behaviac::Agent::Create<FirstAgen>();
  46. // 加载行为树,参数是行为树名字
  47. bool b_ret = p_firstAgen->btload("FistBT");
  48. // 指定当前准备执行的行为树
  49. p_firstAgen->btsetcurrent("FistBT");
  50. return b_ret;
  51. }
  52. void UpdateLoop() {
  53. cout << "update loop" << endl;
  54. int frames = 0;
  55. behaviac::EBTStatus status = behaviac::BT_RUNNING;
  56. while (status == behaviac::BT_RUNNING) {
  57. cout << "frame" << ++frames << endl;
  58. // btexec() 用于执行一次 Agent::btsetcurrent() 执行的行为树
  59. // 也可以调用Workspace::Update()的方式来统一执行所有Agent实例的行为树,详见文章《运行时端的执行流程 https://www.behaviac.com/tutorial13_updateloop/》。
  60. status = p_firstAgen->btexec();
  61. cout << "curretn status: " << status << endl;
  62. }
  63. }
  64. void CleanUpPlayer() {
  65. cout << "clean up player" << endl;
  66. behaviac::Agent::Destroy(p_firstAgen);
  67. }
  68. void CleanUpBehaviac() {
  69. cout << "clean up behaviac" << endl;
  70. behaviac::Workspace::GetInstance()->Cleanup();
  71. }

行为树代码
  • FirstAgen.cpp
  1. void FirstAgen::SayHello()
  2. {
  3. ///<<< BEGIN WRITING YOUR CODE SayHello
  4. // 要写在里面哦
  5. printf("FirstAgen: hello !!!!!!!!!!\n");
  6. ///<<< END WRITING YOUR CODE
  7. }

输出

image.png

cmake 方式

  • todo

cmake

cmake文档
cmake官方文档