From e9d2d011f1df5fd545dd61e94901cf53ad2332d8 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Wed, 25 Jun 2025 22:34:26 +0800 Subject: [PATCH] update --- ComponentBasic/BehaviorPerform.cpp | 40 ++++++ ComponentBasic/BehaviorPerform.h | 118 ++++++++++++++++++ ComponentBasic/ComponentBasic.vcxproj | 6 +- ComponentBasic/ComponentBasic.vcxproj.filters | 10 +- ...leComponent.cpp => ComponentsInfoPull.cpp} | 2 +- ...isibleComponent.h => ComponentsInfoPull.h} | 0 SimsBasic/simsbasic.h | 20 ++- SimsWorld/BehaviorEditor.cpp | 1 + SimsWorld/BehaviorEditor.h | 12 ++ SimsWorld/SimsWorld.vcxproj | 4 + SimsWorld/SimsWorld.vcxproj.filters | 8 ++ 11 files changed, 211 insertions(+), 10 deletions(-) create mode 100644 ComponentBasic/BehaviorPerform.cpp create mode 100644 ComponentBasic/BehaviorPerform.h rename ComponentBasic/{InvisibleComponent.cpp => ComponentsInfoPull.cpp} (98%) rename ComponentBasic/{InvisibleComponent.h => ComponentsInfoPull.h} (100%) create mode 100644 SimsWorld/BehaviorEditor.cpp create mode 100644 SimsWorld/BehaviorEditor.h diff --git a/ComponentBasic/BehaviorPerform.cpp b/ComponentBasic/BehaviorPerform.cpp new file mode 100644 index 0000000..0fcb8db --- /dev/null +++ b/ComponentBasic/BehaviorPerform.cpp @@ -0,0 +1,40 @@ +#include "BehaviorPerform.h" + + +void BehaviorPerformPlugin::recoveryFrom(const QJsonObject& obj) +{ +} + +void BehaviorPerformPlugin::saveTo(QJsonObject& obj) const +{ +} + +std::shared_ptr BehaviorPerformPlugin::defaultNew() const +{ + return std::make_shared(); +} + +void BehaviorPerformPlugin::bindEntity(std::weak_ptr host) +{ + this->_bind_entity = host; +} + +QString BehaviorPerformPlugin::name() const +{ + return NAME(BehaviorPerformPlugin); +} + +void MapHost::setVariable(const QString& key, std::shared_ptr ins) +{ + if (_variable_map.contains(key) && _variable_map[key]->topicString() != ins->typeName()) + throw new UniException("不同数据类型数据绑定同一个名称!"); + _variable_map[key] = ins; +} + +std::shared_ptr MapHost::getVariable(const QString& key) const +{ + if(!_variable_map.contains(key)) + return nullptr; + + return _variable_map[key]; +} diff --git a/ComponentBasic/BehaviorPerform.h b/ComponentBasic/BehaviorPerform.h new file mode 100644 index 0000000..aeb2fa9 --- /dev/null +++ b/ComponentBasic/BehaviorPerform.h @@ -0,0 +1,118 @@ +#pragma once + +#include "componentbasic.h" +#include + +/// +/// 行为树实例化节点 +/// +class COMPONENTBASIC_EXPORT MapHost : public Serializable { +private: + /// + /// {Topic,init-value} + /// + QHash> _variable_types; + /// + /// 变量表 + /// + QHash> _variable_map; + +public: + virtual ~MapHost() = default; + /// + /// 注册数据类型 + /// + /// + virtual void registData(std::shared_ptr init) = 0; + /// + /// 设置变量,如果类型错误会抛出UniException异常 + /// 节点初始化时会按照配置注册默认值变量 + /// + virtual void setVariable(const QString& key, std::shared_ptr ins); + /// + /// 获取指定名称的数据变量 + /// + /// + /// 如果不存在指定名称数据,返回nullptr,类型不确定 + virtual std::shared_ptr getVariable(const QString& key) const; +}; + +/// +/// 所有逻辑节点的基类 +/// +class LogicalNode : public Serializable { +public: + virtual ~LogicalNode() = default; + + /// + /// 设置节点id + /// + /// + virtual void setID(int unique_id) = 0; + /// + /// 提取节点id + /// + /// + virtual int getID() const = 0; + /// + /// 获取节点名称 + /// + /// + virtual QString name() const = 0; + + /// + /// 获取子节点列表 + /// + /// + virtual QList> children() const = 0; + + /// + /// 声明输入变量的内部标识和数据接口 + /// + /// map{name, type} + virtual QHash> inputDeclares() const = 0; + /// + /// 声明输出变量的内部标识和数据接口 + /// + /// map{name, type} + virtual QHash> outputDeclares() const = 0; +}; + +/// +/// 自定义行为树节点实例 +/// +class COMPONENTBASIC_EXPORT BehaviorMapNode : public MapHost, public LogicalNode { +public: + /// + /// 重置行为树数据文件 + /// + /// + virtual void setBehaviorMap(const QString &path){} + /// + /// 设置行为树节点名称 + /// + /// + virtual void resetName(const QString &val){} +}; + +/// +/// 行为树组件 +/// +class COMPONENTBASIC_EXPORT BehaviorPerformPlugin : public ProcList< + WsRespond +>{ +private: + std::weak_ptr _bind_entity; + +public: + // 通过 ProcList 继承 + void execute(std::shared_ptr map, std::shared_ptr in, QList>& out) override; + + void recoveryFrom(const QJsonObject& obj) override; + void saveTo(QJsonObject& obj) const override; + + std::shared_ptr defaultNew() const override; + void bindEntity(std::weak_ptr host) override; + QString name() const override; +}; + diff --git a/ComponentBasic/ComponentBasic.vcxproj b/ComponentBasic/ComponentBasic.vcxproj index 8e51e01..ecd4d11 100644 --- a/ComponentBasic/ComponentBasic.vcxproj +++ b/ComponentBasic/ComponentBasic.vcxproj @@ -101,16 +101,18 @@ + - + + - + diff --git a/ComponentBasic/ComponentBasic.vcxproj.filters b/ComponentBasic/ComponentBasic.vcxproj.filters index f85e342..ee8baa6 100644 --- a/ComponentBasic/ComponentBasic.vcxproj.filters +++ b/ComponentBasic/ComponentBasic.vcxproj.filters @@ -35,12 +35,15 @@ Header Files - + Header Files Header Files + + Header Files + @@ -55,12 +58,15 @@ Source Files - + Source Files Source Files + + Source Files + diff --git a/ComponentBasic/InvisibleComponent.cpp b/ComponentBasic/ComponentsInfoPull.cpp similarity index 98% rename from ComponentBasic/InvisibleComponent.cpp rename to ComponentBasic/ComponentsInfoPull.cpp index 6b126c3..045957e 100644 --- a/ComponentBasic/InvisibleComponent.cpp +++ b/ComponentBasic/ComponentsInfoPull.cpp @@ -1,4 +1,4 @@ -#include "InvisibleComponent.h" +#include "ComponentsInfoPull.h" ComponentsInfoPull::ComponentsInfoPull() {} diff --git a/ComponentBasic/InvisibleComponent.h b/ComponentBasic/ComponentsInfoPull.h similarity index 100% rename from ComponentBasic/InvisibleComponent.h rename to ComponentBasic/ComponentsInfoPull.h diff --git a/SimsBasic/simsbasic.h b/SimsBasic/simsbasic.h index f85ffc0..14042dd 100644 --- a/SimsBasic/simsbasic.h +++ b/SimsBasic/simsbasic.h @@ -37,18 +37,28 @@ public: virtual QString content() const noexcept; }; -/// -/// 通用消息基类 -/// -class WsMessage : public Serializable { +class TopicData { public: - virtual ~WsMessage() = default; + virtual ~TopicData() = default; /// /// 获取消息类型字符串 /// /// 消息类型 virtual QString topicString() const = 0; /// + /// 提取包含默认值的实例 + /// + /// + virtual std::shared_ptr newDefault() const = 0; +}; + +/// +/// 通用消息基类 +/// +class WsMessage : public Serializable, public TopicData { +public: + virtual ~WsMessage() = default; + /// /// 目标实体ID /// /// ID diff --git a/SimsWorld/BehaviorEditor.cpp b/SimsWorld/BehaviorEditor.cpp new file mode 100644 index 0000000..f401e94 --- /dev/null +++ b/SimsWorld/BehaviorEditor.cpp @@ -0,0 +1 @@ +#include "BehaviorEditor.h" diff --git a/SimsWorld/BehaviorEditor.h b/SimsWorld/BehaviorEditor.h new file mode 100644 index 0000000..f50f22b --- /dev/null +++ b/SimsWorld/BehaviorEditor.h @@ -0,0 +1,12 @@ +#pragma once +#include +#include "BehaviorPerform.h" + +class BehaviorEditor : public QMainWindow +{ +public: + BehaviorEditor(std::shared_ptr map_ins, QWidget *parent = nullptr); + + +}; + diff --git a/SimsWorld/SimsWorld.vcxproj b/SimsWorld/SimsWorld.vcxproj index 93d0894..e5a08cf 100644 --- a/SimsWorld/SimsWorld.vcxproj +++ b/SimsWorld/SimsWorld.vcxproj @@ -99,6 +99,7 @@ + @@ -115,6 +116,9 @@ + + + diff --git a/SimsWorld/SimsWorld.vcxproj.filters b/SimsWorld/SimsWorld.vcxproj.filters index d157e34..cfb0841 100644 --- a/SimsWorld/SimsWorld.vcxproj.filters +++ b/SimsWorld/SimsWorld.vcxproj.filters @@ -52,6 +52,9 @@ Source Files + + Source Files + @@ -61,4 +64,9 @@ Header Files + + + Header Files + + \ No newline at end of file