# cvp **Repository Path**: infdust/cvp ## Basic Information - **Project Name**: cvp - **Description**: cvp vs. (plants vs. zombies) - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 2 - **Created**: 2021-04-29 - **Last Updated**: 2025-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # cvp gitee:gitee.com/infdust/cvp\ qq群: 530737441 # 介绍————to 用户 cvp vs. (plants vs. zombies)\ pvz的mod加载器\ 涉及文件:启动器.exe 加载器.dll 插件.cvp ## 用法 1. 游戏本体(PlantsVsZombies.exe)应使用1.0.0.1051英文原版,其他版本无法兼容并且不会被识别 2. 启动器(.exe)应置于 英文原版pvz同一目录下,启动后会在同目录下搜索加载器并运行加载器 3. 加载器(.dll)应置于 英文原版pvz同一目录下,运行时会将当前目录下所有插件全部装载并启动pvz 4. 插件(.cvp)应置于 英文原版pvz同一目录下,可根据需要任意安装,原则上各插件之间不会产生冲突,但在不同插件同时进行相互矛盾的行为时可能产生难以预料的结果 5. 将各文件添加进正确目录后,运行启动器即可 # 介绍————to 插件开发者 cvp vs. (plants vs. zombies)\ pvz的一套API,对外暴露其类、成员、方法及运行逻辑\ 使用cvp编写插件模块,被主模块加载的插件模块可用于实现各种功能\ 涉及文件:template.h main.cpp ## 接口 ### Functor接口 - #### Cvp::Functor 函数类,允许模块使用算子对函数进行操作以改变程序运行逻辑 - 使用算子作用于Functor以改变其执行逻辑: ``` Functor& operator+=(std::function); ``` - 在算子中用以指代原Functor本身: ``` static retT Recur(argT...); ``` - 例: ``` Functor Attack;//植物攻击函数 Attack += [](Plant* p)->void{//施加算子 if(p->type == PEASHOOTER){//如果植物种类为豌豆射手 return Attack.Recur(p);//调用原函数本身 } else if(p->type == SNOWPEA){//寒冰射手 Attack.Recur(p); Attack.Recur(p);//攻击两次 return; } else { return;//不攻击 } }; ``` - #### Functor& Cvp::DrawHook() 绘制函数,可使用算子 - #### Functor& Cvp::KeyHook() 按键函数,可使用算子 - #### Functor& Cvp::UpdateHook() 刷新函数,可使用算子 - #### Functor& Cvp::MainLoopHook() 程序进入主循环时调用一次,可使用算子 - #### Functor& Cvp::WindProcook() 消息函数,可使用算子 ### Geo接口 - #### 色彩 使用ARGB格式 - 生成色彩: ``` DWORD UI::Geo::ARGB(DWORD r, DWORD g, DWORD b, DWORD a); ``` - 混合色彩,rate为color1的权重,取\[0, 1\]: ``` DWORD UI::Geo::Mix(DWORD color1, DWORD color2, float rate); ``` - 削弱/加强亮度/不透明度/饱和度,rate为作用强度,取\[0, 1\]: ``` DWORD UI::Geo::Dark(DWORD color, float rate); DWORD UI::Geo::Light(DWORD color, float rate); DWORD UI::Geo::Transp(DWORD color, float rate); DWORD UI::Geo::Opaque(DWORD color, float rate); DWORD UI::Geo::Dirty(DWORD color, float rate); DWORD UI::Geo::Pure(DWORD color, float rate); ``` - #### Ui::Geo 几何图形渲染类 - 根据给出的坐标序列绘制折线: ``` static void Geo::DrawLine(DWORD color, Point[] point, int pointNum); static void Geo::DrawLine(DWORD color, std::initializer_list> point); ``` - 根据给出的参数绘制空心/实心三角形: ``` static void Geo::DrawTriangle(DWORD color, Point mid, float height, float width, float rotate); static void Geo::DrawFullTriangle(DWORD color, Point mid, float height, float width, float rotate); static void Geo::DrawTriangle(DWORD color, Point point1, Point point2, Point point3); static void Geo::DrawFullTriangle(DWORD color, Point point1, Point point2, Point point3); ``` - 根据给出的参数绘制空心/实心圆角矩形: ``` static void Geo::DrawRect(DWORD color, Rect rect, float roundR); static void Geo::DrawFullRect(DWORD color, Rect rect, float roundR); ``` - 根据给出的参数绘制空心/实心圆: ``` static void Geo::DrawCircle(DWORD color, Point mid, float radius); static void Geo::DrawFullCircle(DWORD color, Point mid, float radius); ``` - 根据给出的参数绘制空心/实心正多边形: ``` static void Geo::DrawPolygon(DWORD color, int edgeNum, Point mid, float radius, float rotate); static void Geo::DrawFullPolygon(DWORD color, int edgeNum, Point mid, float radius, float rotate); ``` - 根据给出的参数绘制空心/实心任意多边形: ``` static void Geo::DrawPolygon(DWORD color, Point[] point, int edgeNum); static void Geo::DrawFullPolygon(DWORD color, Point[] point, int edgeNum); static void Geo::DrawPolygon(DWORD color, std::initializer_list> point); static void Geo::DrawFullPolygon(DWORD color, std::initializer_list> point); ``` - #### Ui::Geo::Vertex 几何顶点类 - 构造顶点: ``` Ui::Geo::Vertex(int x, int y, DWORD color); Ui::Geo::Vertex(float x, float y, DWORD color); ``` - 根据给出的顶点序列进行绘制: ``` static void Ui::Geo::funcName(Ui::Geo::Vertex[] vertex, int num); static void Ui::Geo::funcName(std::vector vertex); static void Ui::Geo::funcName(std::array vertex); static void Ui::Geo::funcName(std::initializer_list vertex); ``` - 根据给出的色彩及坐标序列进行绘制: ``` static void Ui::Geo::funcName(DWORD color, Point[] vertex, int num); static void Ui::Geo::funcName(DWORD color, std::vector> vertex); static void Ui::Geo::funcName(DWORD color, std::array, len> vertex); static void Ui::Geo::funcName(DWORD color, std::initializer_list> vertex); ``` - 根据给出的坐标序列及色彩函数进行绘制: ``` static void Ui::Geo::funcName(std::function color, Point[] vertex, int num); static void Ui::Geo::funcName(std::function color, std::vector> vertex); static void Ui::Geo::funcName(std::function color, std::array, len> vertex); static void Ui::Geo::funcName(std::function color, std::initializer_list> vertex); ``` 可选的funcName包括: - 绘制点序列: ``` Ui::Geo::PointList(...); ``` - 绘制线段序列,使用的顶点序列为:{0, 1}, {2, 3}, {4, 5}, ...: ``` Ui::Geo::LineList(...); ``` - 绘制连续折线,使用的顶点序列为:{0, 1}, {1, 2}, {2, 3}, ...: ``` Ui::Geo::LineTrip(...); ``` - 绘制三角形序列,使用的顶点序列为:{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, ...: ``` Ui::Geo::TriangleList(...); ``` - 绘制连续三角形,使用的顶点序列为:{0, 1, 2}, {1, 2, 3}, {2, 3, 4}, ...: ``` Ui::Geo::TriangleTrip(...); ``` - 绘制连续三角形,使用的顶点序列为:{0, 1, 2}, {0, 2, 3}, {0, 3, 4}, ...: ``` Ui::Geo::TriangleFan(...); ``` ### SharedImage接口 - #### Ui::SharedImage 使用引用计数的图像类 - 构造空图像、使用ARGB像素序列构造图像、使用Pvz::DDImage对象构造图像: ``` Ui::SharedImage(); Ui::SharedImage(int w, int h, DWORD* bits); Ui::SharedImage(Pvz::DDImage* img); ``` - 复制自身,但使用独立的引用计数: ``` Ui::SharedImage Ui::SharedImage::MakeBranch(); ``` - 将自身使用的引用计数器独立: ``` Ui::SharedImage& Ui::SharedImage::Branch(); ``` - 获取内部包装的Pvz::DDImage对象: ``` Pvz::DDImage* Ui::SharedImage::Image(); Pvz::DDImage* Ui::SharedImage::operator->(); Pvz::DDImage& Ui::SharedImage::operator*(); Ui::SharedImage::operator Pvz::DDImage*(); ``` - 绘制: ``` void Ui::SharedImage::Draw(DWORD theColor, Rect theSrcRect, Matrix3 theTransform, bool mix, Rect theDestRect); ``` - 通过路径构造/向路径写入图片,支持jpg/png/bmp格式: ``` Ui::SharedImage(std::string path); bool Ui::SharedImage::Write(std::string path); ``` - 截屏: ``` static Ui::SharedImage Ui::SharedImage::TakeScreenShot(); ``` - 从剪贴板获取/向剪贴板保持图片: ``` static Ui::SharedImage Ui::SharedImage::GetClipBoard(); void Ui::SharedImage::SetClipBoard(); ``` - #### Pvz::DDImage pvz内部的图像类: - 绘制 ``` void Pvz::DDImage::Draw(DWORD color, Rect srcRect, Matrix3 transform, bool mix, Rect destRect); ``` - pvz内部资源文件: ``` Pvz::DDImage* Pvz::IMAGE_xxx; ``` - 例: ``` Pvz::DDImage* Pvz::IMAGE_PVZ_LOGO; ``` ### Font接口 - #### Ui::Font 字体类 - 创建字体: ``` Ui::Font(char* name, int pointSize, int gap, int script, int weight, bool italics, bool underline, bool deviceCaps); ``` - 生成文字对应的图像: ``` Ui::SharedImage Ui::Font::MakeImage(wchar_t chr); Ui::SharedImage Ui::Font::MakeImage(std::string_view str, int w); Ui::SharedImage Ui::Font::MakeImage(std::wstring_view str, int w); ``` - 绘制文字: ``` void Ui::Font::DrawString(int x, int y, std::string_view str, DWORD color, int w, int h); void Ui::Font::DrawString(int x, int y, std::wstring_view str, DWORD color, int w, int h); ``` - 绘制ascii文字,可略微提升性能: ``` void Ui::Font::DrawStringA(int x, int y, std::string_view str, DWORD color, int w, int h); ``` - 获取文字绘制所需空间参数: ``` int Ui::Font::GetStringWidth(std::string_view str); int Ui::Font::GetStringWidth(std::wstring_view str); int Ui::Font::GetStringLine(std::string_view str, int w); int Ui::Font::GetStringLine(std::wstring_view str, int w); int Ui::Font::GetStringHeight(std::string_view str, int w); int Ui::Font::GetStringHeight(std::wstring_view str, int w); ``` - #### Ui::Font& Ui::GlobalFont() 获取全局字体,可对其赋值以改变全局字体 ### Style接口 - #### Ui::Style 控件风格类: ``` struct Style { DWORD BaseColor;//背景色彩 DWORD LineColor;//线条色彩 DWORD LightColor;//淡化背景色彩 DWORD LightLineColor;//淡化线条色彩 DWORD SelectColor;//焦点背景色彩 DWORD SelectLineColor;//焦点线条色彩 float MixRate;//混合比,在混合产生衍生色彩时原色的权重,取值[0, 1] }; ``` - #### Ui::Style& Ui::GlobalStyle() 获取全局控件风格,可对其赋值以改变全局控件风格 ### Command接口 - #### Cvp::UPCommand 命令类 - 创建命令树: ``` Cvp::UPCommand Ui::MakeCmd(std::string_view command); Cvp::UPCommand Ui::MakeCmd(std::string_view command, argT...);//创建后使用operator()依次调用所有额外参数 ``` - 为命令树设置激活条件,不设则始终激活: ``` Cvp::UPCommand Cvp::UPCommand::operator()(std::function); ``` - 为命令树设置执行操作,不设则该命令仅作为分支使用: ``` Cvp::UPCommand Cvp::UPCommand::operator()(std::function); Cvp::UPCommand Cvp::UPCommand::operator()(std::function); ``` - 为命令树设置子树,不设则该命令仅作为执行命令使用: ``` Cvp::UPCommand Cvp::UPCommand::operator()(std::initializer_list); Cvp::UPCommand Cvp::UPCommand::operator()(UPCommand); ``` - 依次使用多个参数调用operator(): ``` Cvp::UPCommand Cvp::UPCommand::operator()(argT...); ``` - 添加全局命令: ``` static void Ui::WidgetManager::SetCmd(std::initializer_list); ``` 注意:以上任何方法对UPCommand对象都是破坏性的,包括拷贝,不要对this对象和传入对象进行任何假设,只有返回值仍然将是合法的、符合预期的UPCommand对象 - 调用全局命令: ``` string Ui::CallCmd(string_view cmd);//仅支持ascii,非打印字符会被剔除 ``` - 例: ``` Ui::WidgetManager::SetCmd({ Ui::MakeCmd(u8"system")//顶级命令 ([]()->bool{ return Pvz::gGameApp; })//激活条件 (//子命令 Ui::MakeCmd(u8"TakeScreenShot")//二级命令 ([](string_view path)->string{ return Ui::SharedImage::TakeScreenShot().Write(path) ? u8"succeed" : u8"failed"; })//执行操作 , Ui::MakeCmd(u8"ShutDown")//二级命令 ([](){ *(char*)0x0ul=u8'!'; })//执行操作 ), }); Ui::CallCmd(u8"system TakeScreenShot C:\\");//截图并保存至C盘 ``` ### Widget接口 - #### Ui::WidgetBase cvp控件公共基类 - 移动控件,零点为父窗体的左上角: ``` void Ui::WidgetBase::Move(int dx, int dy); void Ui::WidgetBase::MoveTo(int x, int y); ``` - 设置父/子窗体,只需从一个方向调用即可: ``` void Ui::WidgetBase::SetParent(Ui::WidgetBase*); int Ui::WidgetBase::AddChildren(std::initializer_list); ``` - 设置/获取控件状态: ``` void Ui::WidgetBase::SetInvisible(bool); void Ui::WidgetBase::SetInactive(bool); void Ui::WidgetBase::SetClosed(); void Ui::WidgetBase::SetFocus(bool); bool Ui::WidgetBase::GetInvisible()const; bool Ui::WidgetBase::GetInactive()const; bool Ui::WidgetBase::GetClosed()const; bool Ui::WidgetBase::GetFocus()const; ``` - 获取控件空间参数: ``` int Ui::WidgetBase::GetX()const; int Ui::WidgetBase::GetY()const; int Ui::WidgetBase::GetW()const; int Ui::WidgetBase::GetH()const; ``` - 获取父/子窗体: ``` WidgetBase* Ui::WidgetBase::GetParent()const; std::vector& Ui::WidgetBase::GetChildren()const; ``` - 是否被鼠标悬浮/被按下: ``` bool Ui::WidgetBase::GetOver()const; bool Ui::WidgetBase::GetDown()const; ``` - 弹出模态窗口,实际由父窗口执行: ``` void Ui::WidgetBase::DoModal(Ui::Widget*); ``` - #### Ui::Widget Ui::WidgetBase的派生类,窗口类,窗体调度的基本单位, - 弹出模态窗口: ``` void Ui::WidgetBase::DoModal(Ui::Widget*); ``` - 获取模态窗口: ``` Ui::Widget* Ui::WidgetBase::GetModal(); ``` - 加入窗口管理器,建议使用Title对象完成此步骤: ``` void Ui::Widget::AttachManager(); ``` - 加入控制页,不建议使用Title对象完成此步骤: ``` void Ui::Widget::AttachTab(std::string_view label); ``` - #### Ui::Invisible Ui::Widget的派生类,Ui::WidgetBase到Ui::Widget的适配器,创建完全透明的窗口以容纳控件 - 构造透明窗口: ``` Ui::Invisible(Ui::WidgetBase*); ``` - #### Ui::WidgetManager 窗口管理器 - 创建基础窗口: ``` static Ui::Widget* Ui::WidgetManager::MakeWidget(Rect rect, std::initializer_list children); ``` - 创建标准尺寸的窗口,用于控制页: ``` static Ui::Widget* Ui::WidgetManager::MakeTabPage(std::initializer_list children); ``` - 创建窗口,附加可拖动且带有关闭按钮的标题栏: ``` static Ui::Widget* Ui::WidgetManager::MakeTitle(std::string_view title, Ui::Widget* body, SharedImage icon); ``` - 创建标签: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeLabel(Rect rect, std::string_view label); ``` - 创建文字输出: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeOutput(Rect rect, std::string str); static Ui::WidgetBase* Ui::WidgetManager::MakeOutput(Rect rect, std::wstring str); ``` - 创建按钮: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeButton(Rect rect, std::function func, std::string_view label); ``` - 创建按键选择器: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeKeySelector(Point pos, std::function func, Cvp::KeyCode _default); static Ui::WidgetBase* Ui::WidgetManager::MakeKeySelector(Point pos, Cvp::KeyCode& link); ``` - 创建输入: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeInput(Rect rect, std::function func, std::string_view _default); static Ui::WidgetBase* Ui::WidgetManager::MakeInput(Rect rect, std::function func, int _default); static Ui::WidgetBase* Ui::WidgetManager::MakeInput(Rect rect, std::function func, float _default); static Ui::WidgetBase* Ui::WidgetManager::MakeInput(Rect rect, std::string& link); static Ui::WidgetBase* Ui::WidgetManager::MakeInput(Rect rect, int& link); static Ui::WidgetBase* Ui::WidgetManager::MakeInput(Rect rect, float& link); ``` - 创建水平/垂直滑动条: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_H(Rect rect, std::function func, int gap, float Min, float Max, float _default); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_H(Rect rect, std::function func, int gap, float Min, float Max); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_H(Rect rect, std::function func, int gap, float Max); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_H(Rect rect, float& link, int gap, float Min, float Max); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_H(Rect rect, float& link, int gap, float Max); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_V(Rect rect, std::function& func, int gap, float Min, float Max, float _default); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_V(Rect rect, std::function func, int gap, float Min, float Max); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_V(Rect rect, std::function func, int gap, float Max); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_V(Rect rect, float& link, int gap, float Min, float Max); static Ui::WidgetBase* Ui::WidgetManager::MakeSlider_V(Rect rect, float& link, int gap, float Max); ``` - 创建复选框: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeCheck(Rect rect, std::function func, std::string_view label, bool _default); static Ui::WidgetBase* Ui::WidgetManager::MakeCheck(Rect rect, bool& link, std::string_view label); ``` - 创建单选框组: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeRadio(Rect rect, std::initializer_list> children, std::function func, int _default, std::string_view label); static Ui::WidgetBase* Ui::WidgetManager::MakeRadio(Rect rect, std::initializer_list, std::string_view>> children, int _default, std::string_view label); static Ui::WidgetBase* Ui::WidgetManager::MakeRadio(Rect rect, std::initializer_list> children, int& link, int _default, std::string_view label); static Ui::WidgetBase* Ui::WidgetManager::MakeRadio(Rect rect, std::initializer_list> children, int _default, std::string_view label); ``` - 创建下拉框: ``` static Ui::WidgetBase* Ui::WidgetManager::MakeComboList(Rect rect, std::initializer_list elements, std::function func, int _default); static Ui::WidgetBase* Ui::WidgetManager::MakeComboList(Rect rect, std::initializer_list>> elements, int _default); static Ui::WidgetBase* Ui::WidgetManager::MakeComboList(Rect rect, std::initializer_list elements, int& link, int _default); static Ui::WidgetBase* Ui::WidgetManager::MakeComboList(Rect rect, std::initializer_list> elements, int _default); ``` - 添加窗口: ``` static void Ui::WidgetManager::AddWidget(Ui::Widget* widget); ``` - 设置/取消某一窗口的焦点: ``` static void Ui::WidgetManager::FocusWidget(Ui::WidgetBase* widget); static void Ui::WidgetManager::ReleaseWidget(Ui::WidgetBase* widget); ``` - 添加控制页: ``` static void Ui::WidgetManager::SetTab(std::initializer_list> page); ``` - 添加命令: ``` static void Ui::WidgetManager::SetCmd(std::initializer_list cmd); ``` - 获取按键状态: ``` static bool Ui::WidgetManager::Shift(); static bool Ui::WidgetManager::Ctrl(); static bool Ui::WidgetManager::Alt(); ``` ## DeriveManager数据库(部分启用) ### TypeInteface接口 - #### Cvp::TypeTrait\ - 数据库元信息: ``` struct Cvp::TypeTrait { using type = typename T::Type;//记录多态类型索引,特例化时需包含ENM_BEGIN表示希望预留区域的大小 enum class prop :DWORD {//记录类属性偏移 CONSTRUCT = sizeof(Cvp::Functor) * 0, DESTRUCT = sizeof(Cvp::Functor) * 1, SERIALIZE = sizeof(Cvp::Functor) * 2, DESERIALIZE = sizeof(Cvp::Functor) * 3, PROP_BEGIN = sizeof(Cvp::Functor) * 4 }; }; ``` - #### Cvp::TypeInterface\ 类型属性数据库类型池接口,存储、控制及交互跨模块动态类型信息 - 构造接口,除name外参数可选,使用_default参数时需特例化Cvp::TypeTrait: ``` Cvp::TypeInterface(string name, std::function datainit, DeriveType _default); ``` 注意:若传入参数仅包含name且可以接受接口构造失败,则允许构造局部接口对象,否则接口必须构造为全局对象 - 内置类型,用于记录类型索引、属性偏移,不推荐显式使用: ``` using Cvp::TypeInterface::DeriveType = Cvp::TypeTrait::type; using Cvp::TypeInterface::PropType = Cvp::TypeTrait::prop; ``` - 获取内置类型索引,不推荐使用: ``` Cvp::TypeInterface::DeriveType Type()const; ``` - 设置类型属性信息,数据库构建者可于构造函数datainit参数内调用,修改者可于Pvz::MainLoopHook接口内调用: ``` fieldT& Cvp::TypeInterface::Set(Cvp::PropInterface, ...)const; ``` - 获取类型属性信息: ``` fieldT& Cvp::TypeInterface::operator[](Cvp::PropInterface)const; fieldT& Cvp::TypeInterface::Get(Cvp::PropInterface)const; ``` ### PropInteface接口 - #### Cvp::PropInteface\ 类型属性数据库属性池接口,存储、控制及交互跨模块动态类型属性信息 - 构造接口,除name外参数可选: ``` Cvp::PropInterface(string name, std::function*)> datainit); ``` 注意:接口必须构造为全局对象 - 内置类型,用于记录类型索引、属性偏移,不推荐显式使用: ``` using Cvp::PropInterface::DeriveType = Cvp::TypeTrait::type; using Cvp::PropInterface::PropType = Cvp::TypeTrait::prop; ``` - 获取内置属性偏移,不推荐使用: ``` Cvp::PropInterface::PropType Prop()const; ``` - 设置类型属性信息,数据库构建者可于构造函数datainit参数内调用,修改者可于Pvz::MainLoopHook接口内调用: ``` fieldT& Cvp::PropInterface::Set(Cvp::PropInterface::DeriveType, ...)const; fieldT& Cvp::PropInterface::Set(Cvp::TypeInterface, ...)const; void Cvp::PropInterface::SetAll(...)const; fieldT& Cvp::PropInterface::SetDefault(...)const; ``` - 获取类型属性信息: ``` fieldT& Cvp::PropInterface::operator[](Cvp::PropInterface::DeriveType)const; fieldT& Cvp::PropInterface::operator[](Cvp::TypeInterface)const; fieldT& Cvp::PropInterface::Get(Cvp::PropInterface::DeriveType)const; fieldT& Cvp::PropInterface::Get(Cvp::TypeInterface)const; ``` - 类型属性迭代器: ``` Cvp::PropInterface::iterator Cvp::PropInterface::begin()const; Cvp::PropInterface::iterator Cvp::PropInterface::end()const; ``` ## ObjectManager数据库(未启用) ### ObjectInteface接口 - #### Cvp::TypeTrait\ - 数据库元信息: ``` struct Cvp::TypeTrait { enum class pool :DWORD { DEFAULT, POOL_BEGIN };//记录对象池索引,特例化时需包含POOL_BEGIN表示希望预留区域的大小 enum class member :DWORD;//记录对象成员偏移 }; ``` - #### Cvp::ObjectInteface\ 对象成员数据库对象池接口,存储、控制及交互跨模块多态对象信息 - 构造接口,除name外参数可选,使用_default参数时需特例化Cvp::TypeTrait: ``` Cvp::ObjectInterface(string name, PoolType _default); ``` 注意:接口必须构造为全局对象 - 内置类型,用于记录类型索引、属性偏移、对象池索引、成员偏移,不推荐显式使用: ``` using Cvp::ObjectInterface::DeriveType = Cvp::TypeTrait::type; using Cvp::ObjectInterface::PropType = Cvp::TypeTrait::prop; using Cvp::ObjectInterface::PoolType = Cvp::TypeTrait::pool; using Cvp::ObjectInterface::MemberType = Cvp::TypeTrait::member; ``` - 内置类型,用于表示对象所占内存空间: ``` Cvp::ObjectInterface::Object; ``` - 内置类型,用于表示对象本身: ``` Cvp::ObjectInterface::ID; ``` - 获取内置对象池索引,不推荐使用: ``` Cvp::ObjectInterface::PoolType Cvp::ObjectInterface::Pool()const; ``` - 从对象池中申请内存: ``` Cvp::ObjectInterface::Object& Cvp::ObjectInterface::Alloc(Cvp::ObjectInterface::DeriveType); Cvp::ObjectInterface::Object& Cvp::ObjectInterface::Alloc(Cvp::TypeInterface); ``` - 释放对象池内存单元: ``` void Cvp::ObjectInterface::Free(Cvp::ObjectInterface::Object&&); void Cvp::ObjectInterface::Free(Cvp::ObjectInterface::ID); ``` - 在指定内存单元构造对象: ``` static Cvp::ObjectInterface::Object& Cvp::ObjectInterface::Construct(Cvp::ObjectInterface::Object&); void Cvp::ObjectInterface::Construct(Cvp::ObjectInterface::ID); ``` - 析构对象: ``` static void Cvp::ObjectInterface::Destruct(Cvp::ObjectInterface::Object&); void Cvp::ObjectInterface::Destruct(Cvp::ObjectInterface::ID); ``` - 从对象池申请内存并构造对象: ``` Cvp::ObjectInterface::Object& Cvp::ObjectInterface::New(Cvp::ObjectInterface::DeriveType); Cvp::ObjectInterface::Object& Cvp::ObjectInterface::New(Cvp::ObjectInterface::TypeInterface); ``` - 析构对象并释放内存: ``` static void Cvp::ObjectInterface::Delete(Cvp::ObjectInterface::Object&&); void Cvp::ObjectInterface::Delete(Cvp::ObjectInterface::ID); ``` - 清空对象池: ``` void Cvp::ObjectInterface::Clear(); ``` - 将指定对象序列化: ``` static Cvp::DataBase Cvp::ObjectInterface::Serialize(Cvp::ObjectInterface::Object&); Cvp::DataBase Cvp::ObjectInterface::Serialize(Cvp::ObjectInterface::ID)const; ``` - 反序列化至指定对象: ``` static void Cvp::ObjectInterface::Deserialize(Cvp::ObjectInterface::Object&, Cvp::DataBase&& buffer); void Cvp::ObjectInterface::Deserialize(Cvp::ObjectInterface::ID, Cvp::DataBase&& buffer); ``` - 序列化/反序列化对象池: ``` Cvp::DataBase Cvp::ObjectInterface::Serialize()const; void Cvp::ObjectInterface::Deserialize(Cvp::DataBase&& data); ``` - 根据ID尝试获取对象: ``` Cvp::ObjectInterface::Object* Cvp::ObjectInterface::Get(Cvp::ObjectInterface::ID)const; ``` - 对象迭代器: ``` Cvp::ObjectInterface::iterator Cvp::ObjectInterface::begin()const; Cvp::ObjectInterface::iterator Cvp::ObjectInterface::end()const; ``` ### Object接口 - #### Cvp::ObjectInterface\::Object 动态多态对象接口 - 获取对象成员 ``` fieldT& Cvp::ObjectInterface::Object::operator[](Cvp::MemberInterface)const; fieldT& Cvp::ObjectInterface::Object::Get(Cvp::ObjectInterface::MemberType)const; ``` - 获取对象ID及类型 ``` Cvp::ObjectInterface::ID Cvp::ObjectInterface::Object::GetID(); Cvp::ObjectInterface::DeriveType& Cvp::ObjectInterface::Object::GetType()const; ``` - 释放对象内存/析构对象 ``` void Cvp::ObjectInterface::Object::Free(); void Cvp::ObjectInterface::Object::Delete(); ``` - 序列化/反序列化对象 ``` DataBase Cvp::ObjectInterface::Object::Serialize(); void Cvp::ObjectInterface::Object::Deserialize(DataBase&& buffer); ``` ### MemberInteface接口 - #### Cvp::MemberInteface\ 对象成员数据库成员池接口,存储、控制及交互跨模块多态对象成员信息 - 构造接口,除name外参数可选: ``` Cvp::MemberInterface(string name, std::function*)> staticinit); ``` 注意:接口必须构造为全局对象 - 内置类型,用于记录类型索引、属性偏移、对象池索引、成员偏移,不推荐显式使用: ``` using Cvp::MemberInterface::DeriveType = Cvp::TypeTrait::type; using Cvp::MemberInterface::PropType = Cvp::TypeTrait::prop; using Cvp::MemberInterface::PoolType = Cvp::TypeTrait::pool; using Cvp::MemberInterface::MemberType = Cvp::TypeTrait::member; ``` - 获取内置成员偏移,不推荐使用: ``` Cvp::MemberInterface::MemberType Cvp::MemberInterface::Member()const; ``` - 获取对象成员 ``` fieldT& Cvp::MemberInterface::operator[](Cvp::ObjectInterface::Object&)const; ``` - 设置某一类型中本接口对应成员的构造函数/析构函数/序列化与反序列化函数 ``` void Cvp::MemberInterface::Set_Constructor(Cvp::MemberInterface::DeriveType type, std::function func); void Cvp::MemberInterface::Set_Destructor(Cvp::MemberInterface::DeriveType type, std::function func); void Cvp::MemberInterface::Set_Serializer(Cvp::MemberInterface::DeriveType type, std::function func_serialize, std::function func_deserialize); void Cvp::MemberInterface::Set_Serializer(Cvp::MemberInterface::DeriveType type, std::function func); void Cvp::MemberInterface::Set_Constructor(Cvp::TypeInterface type, std::function func); void Cvp::MemberInterface::Set_Destructor(Cvp::TypeInterface type, std::function func); void Cvp::MemberInterface::Set_Serializer(Cvp::TypeInterface type, std::function func_serialize, std::function func_deserialize); void Cvp::MemberInterface::Set_Serializer(Cvp::TypeInterface type, std::function func); ``` - 设置部分类型中本接口对应成员的构造函数/析构函数/序列化与反序列化函数 ``` void Cvp::MemberInterface::Set_Constructor(std::function func, std::function range); void Cvp::MemberInterface::Set_Destructor(std::function func, std::function range); void Cvp::MemberInterface::Set_Serializer(std::function func_serialize, std::function func_deserialize, std::function range); void Cvp::MemberInterface::Set_Serializer(std::function func, std::function range); ``` - 根据类型设置本接口对应成员的构造函数/析构函数/序列化与反序列化函数 ``` void Set_Constructor(std::function(DeriveType)> func_factory); void Set_Destructor(std::function(DeriveType)> func_factory); void Set_Serializer(std::function(DeriveType)> func_factory_serialize, std::function(DeriveType)> func_factory_deserialize); void Set_Serializer(std::function(DeriveType)> func_factory); ``` - 设置全部类型中本接口对应成员的构造函数/析构函数/序列化与反序列化函数 ``` void Cvp::MemberInterface::Set_Constructor(std::function func); void Cvp::MemberInterface::Set_Destructor(std::function func); void Cvp::MemberInterface::Set_Serializer(std::function func_serialize, std::function func_deserialize); void Cvp::MemberInterface::Set_Serializer(std::function func); ``` - 尝试对所有类型中本接口对应成员设置默认构造函数/析构函数/序列化与反序列化函数 ``` void Cvp::MemberInterface::Set_Constructor(); void Cvp::MemberInterface::Set_Destructor(); void Cvp::MemberInterface::Set_Serializer(); ``` 注意:永远不要在任何场合(同模块内/不同模块同时)重复设置构造函数、析构函数、序列化与反序列化函数 ## 杂项及补充 ### 关于Functor对象 - #### Cvp::Functor\ 函数类,使用引用计数 - 构造 ``` Cvp::Functor(std::function);//产生函数 Cvp::Functor(retT);//产生常量函数 Cvp::Functor();//产生空函数 ``` - 分支 ``` Cvp::Functor Cvp::Functor::MakeBranch()const;//复制自身,但返回值使用独立的引用计数 Cvp::Functor& Cvp::Functor::Branch();//将自身使用的引用计数与其他对象独立 ``` - 复合 ``` Cvp::Functor& Cvp::Functor::operator+=(std::function);//将当前对象的operator()过程转为新的函数,原过程设为当前对象的上级函数 ``` - 调用 ``` retT Cvp::Functor::operator()(argT...)const;//调用当前函数 static retT Cvp::Functor::Recur(argT...);//调用当前调用中对象的上级函数 ``` ### 序列化与反序列化机制 - #### Cvp::Data 序列化数据元 - 构造 ``` Cvp::Data(); ``` - 判定 ``` bool Cvp::Data::isEmpty()const;//空 bool Cvp::Data::isData()const;//数据 bool Cvp::Data::isTree()const;//子树 ``` - 断言 ``` void Cvp::Data::checkEmpty()const; void Cvp::Data::checkNotEmpty()const; void Cvp::Data::checkData()const; void Cvp::Data::checkTree()const; ``` - 写入/读取数据 ``` void Cvp::Data::Push(const T& val);//使用Template::serializeN(const T*)和Template::serialize(const T&, BYTE*),自定义类型需重载这两个模板 void Cvp::Data::Pop(T& val)const;//使用Template::deserialize(Y&, BYTE*, int),自定义类型需重载这个模板 ``` - 写入/读取树 ``` void Cvp::Data::SetChild(DataMap&& val); CvP::DataMap& Cvp::Data::GetChild()const; ``` - #### Cvp::DataMap 序列化树 - 构造 ``` Cvp::DataMap();//构造空树 Cvp::DataMap(char* path);//从路径读取树 ``` - 保存 ``` void Cvp::DataMap::Write(char* path)const;//将树保存到对象 ``` - 写入/读取 ``` void Cvp::DataMap::Set(std::string label, Data&& data);//写入数据元 Cvp::Data Cvp::DataMap::Get(std::string label)const;//获取数据元 ``` - 迭代器 ``` Cvp::DataMap::iterator Cvp::DataMap::begin()const; Cvp::DataMap::iterator Cvp::DataMap::end()const; ``` ### 工具接口 # 介绍————to 加载器开发者 cvp vs. (plants vs. zombies)\ pvz的逻辑还原,以动态语言方式重新实现pvz逻辑并调用pvz自身二进制底层函数\ 使用cvp编写加载器模块,可直接修改pvz运行逻辑,也可对外暴露设计的接口\ 涉及文件:pvzClass.h pvzStatic.h ui.h pvzData.h ## 接口 # 介绍————to cvp开发者 cvp vs. (plants vs. zombies)\ 使用模板元编程实现基于C++的高性能动态多态类型编程库\ 涉及文件:cvp.h dynamic_language.h Game.h ## cvp项目结构