原生 sln 生成
生成代码
- behaviac_types.h 需要包含到项目代码中,便于使用自动生成的类型和胶水代码
- internal/behaviac_agent_member_visitor.h 包含用于访问类的私有属性和方法的胶水代码
- internal/behaviac_agent_meta.h 和 internal/behaviac_agent_meta.cpp 包含用于注册类及其属性、方法、实例等信息的胶水代码
构建 c++ 运行库
- 下载源码
- 下载 cmake
- 下载 vs2019
- 用于 cmake 构建 vs2019 版本
- 使用 cmake 的 cmake_gui 生成
- 注意,通过
cmake --help
可以看到 2019 无法显示指定 win64,貌似默认就是 64 位了
- 注意 选项选择关闭, 则生成静态库
- 找到
lib_build
下的 behaviac.sln
,用 vs2019 打开
- 打开上面 cmake 生成后 lib_build 文件夹中的 ALL_BUILD.vcxproj
- 关闭警告报错(都配一下)
- 选择 libbehaviac
- 生成 lib 包 /或者对着项目右键生成
生成
- 如果是静态库,则会生成到 lib 文件夹中
- 如果是运行库,会生成到 bin 文件夹中!!!
helloWorld
实际文件夹
- 蓝色是 behaviac 生成的胶水代码
- 黄色是 behaviac 源码,也是 lib 库的头文件
- 紫色是上一节生成的静态库 lib
vs项目大纲
引入 inc
引入lib
代码
#include <iostream>
#include "exported/behaviac_generated/types/behaviac_types.h"
using namespace std;
FirstAgen* p_firstAgen = NULL;
/*
初始化加载目录和文件格式
*/
bool InitBehaviac();
/*
创建实例,加载指定的行为树,
*/
bool InitPlayer();
/*
执行行为树
*/
void UpdateLoop();
/*
对创建的 agent 实例进行销毁释放
*/
void CleanUpPlayer();
/*
* 清理整个工作区
*/
void CleanUpBehaviac();
int main()
{
cout << InitBehaviac() << endl;
cout << InitPlayer() << endl;
UpdateLoop();
CleanUpPlayer();
CleanUpBehaviac();
return 0;
}
bool InitBehaviac() {
cout << "init behaviac" << endl;
// 设置加载编辑器导出的行为树所在的目录。
behaviac::Workspace::GetInstance()->SetFilePath("./exported");
// 设置加载的行为树格式,这里用的是xml格式。
behaviac::Workspace::GetInstance()->SetFileFormat(behaviac::Workspace::EFF_xml);
return true;
}
bool InitPlayer() {
cout << "init player" << endl;
// 创建 Agent 子类的实例
p_firstAgen = behaviac::Agent::Create<FirstAgen>();
// 加载行为树,参数是行为树名字
bool b_ret = p_firstAgen->btload("FistBT");
// 指定当前准备执行的行为树
p_firstAgen->btsetcurrent("FistBT");
return b_ret;
}
void UpdateLoop() {
cout << "update loop" << endl;
int frames = 0;
behaviac::EBTStatus status = behaviac::BT_RUNNING;
while (status == behaviac::BT_RUNNING) {
cout << "frame" << ++frames << endl;
// btexec() 用于执行一次 Agent::btsetcurrent() 执行的行为树
// 也可以调用Workspace::Update()的方式来统一执行所有Agent实例的行为树,详见文章《运行时端的执行流程 https://www.behaviac.com/tutorial13_updateloop/》。
status = p_firstAgen->btexec();
cout << "curretn status: " << status << endl;
}
}
void CleanUpPlayer() {
cout << "clean up player" << endl;
behaviac::Agent::Destroy(p_firstAgen);
}
void CleanUpBehaviac() {
cout << "clean up behaviac" << endl;
behaviac::Workspace::GetInstance()->Cleanup();
}
行为树代码
void FirstAgen::SayHello()
{
///<<< BEGIN WRITING YOUR CODE SayHello
// 要写在里面哦
printf("FirstAgen: hello !!!!!!!!!!\n");
///<<< END WRITING YOUR CODE
}
输出
cmake 方式
cmake
cmake文档
cmake官方文档