让我们把KBEngine玩坏吧!如何定制我们自己的C++函数(一)
为什么不更新kbe warring的代码解读了,因为在我看来那个demo讲完了实体就没东西可讲了,如果专心的看官方文档和PPT的话demo的代码后面没任何难点了已经,单纯的复制黏贴代码实在太过无聊。程序员一定要做点好玩的事情才行~
好吧,今天开始想法直接改引擎底层,争取把引擎底层直接玩坏(*^__^*)
另外因为平时工作比较忙,这个系列会不定期的更新。
从自己的HelloWorld写起
先来点简单的,baseapp脚本层调用一个自定义的C++函数,输出helloworld!
因为是baseapp的特有C++函数,所以我们需要打开baseapp项目的文件进行修改,这里我选baseapp.h和baseapp.cpp
为避免复制黏贴多余的代码,所以只写核心部分
baseapp.h
![](/assets/blank.gif)
class Baseapp : public EntityApp<Base>, public Singleton<Baseapp> { public://added by lsmstatic PyObject* __py_findAvatarByName(PyObject* self, PyObject* args); protected: }
![](/assets/blank.gif)
baseapp.cpp
![](/assets/blank.gif)
//------------------------------------------------------------------------------------- bool Baseapp::installPyModules() {Base::installScript(getScript().getModule());Proxy::installScript(getScript().getModule());GlobalDataClient::installScript(getScript().getModule());registerScript(Base::getScriptType());registerScript(Proxy::getScriptType());// 将app标记注册到脚本std::map<uint32, std::string> flagsmaps = createAppFlagsMaps();std::map<uint32, std::string>::iterator fiter = flagsmaps.begin();for (; fiter != flagsmaps.end(); ++fiter){if (PyModule_AddIntConstant(getScript().getModule(), fiter->second.c_str(), fiter->first)){ERROR_MSG(fmt::format("Baseapp::onInstallPyModules: Unable to set KBEngine.{}.\n", fiter->second));}}// 注册创建entity的方法到py APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), time, __py_gametime, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBase, __py_createBase, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseLocally, __py_createBase, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createEntity, __py_createBase, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseAnywhere, __py_createBaseAnywhere, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseRemotely, __py_createBaseRemotely, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseFromDBID, __py_createBaseFromDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseAnywhereFromDBID, __py_createBaseAnywhereFromDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseRemotelyFromDBID, __py_createBaseRemotelyFromDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), executeRawDatabaseCommand, __py_executeRawDatabaseCommand, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), quantumPassedPercent, __py_quantumPassedPercent, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), charge, __py_charge, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), registerReadFileDescriptor, PyFileDescriptor::__py_registerReadFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), registerWriteFileDescriptor, PyFileDescriptor::__py_registerWriteFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), deregisterReadFileDescriptor, PyFileDescriptor::__py_deregisterReadFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), deregisterWriteFileDescriptor, PyFileDescriptor::__py_deregisterWriteFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), reloadScript, __py_reloadScript, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), isShuttingDown, __py_isShuttingDown, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), address, __py_address, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), deleteBaseByDBID, __py_deleteBaseByDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), lookUpBaseByDBID, __py_lookUpBaseByDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), setAppFlags, __py_setFlags, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), getAppFlags, __py_getFlags, METH_VARARGS, 0);//addition by lsmAPPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), testfunc, __py_findAvatarByName, METH_VARARGS, 0);return EntityApp<Base>::installPyModules(); }//added by lsm //Email:240782361@qq.com //Description:某些自用的函数 //------------------------------------------------------------------------------------- PyObject* Baseapp::__py_findAvatarByName(PyObject* self, PyObject* args) {PyObject* pyval = NULL;std::string strTest = "HelloWorld!This is my first test cpp function!!--Lsm";pyval = PyUnicode_FromString(strTest.c_str());return pyval; }
![](/assets/blank.gif)
然后我们就能用官方自带的调试工具验证我们的成果了~!
输出某类实体
一般来说,C++效率是python的50-1000倍,所以如果遇到比较耗时的操作我们需要放到C++部分进行运算。另外引擎自己提供的api有些时候不能满足我们自己的需求,这个时候就需要我们来实现自己的需求了。
写点稍微有用的,kbe自带的api没有办法直接输出某类实体,那么我们制作一个自己的api,输出某类实体。
和上个方法类似,首先头文件定义
Baseapp.h
![](/assets/blank.gif)
class Baseapp : public EntityApp<Base>, public Singleton<Baseapp> { public://added by lsmstatic PyObject* __py_testfunc(PyObject* self, PyObject* args);static PyObject* __py_findEntityByName(PyObject* self, PyObject* args); protected: }
![](/assets/blank.gif)
Baseapp.cpp
![](/assets/blank.gif)
//------------------------------------------------------------------------------------- bool Baseapp::installPyModules() {Base::installScript(getScript().getModule());Proxy::installScript(getScript().getModule());GlobalDataClient::installScript(getScript().getModule());registerScript(Base::getScriptType());registerScript(Proxy::getScriptType());// 将app标记注册到脚本std::map<uint32, std::string> flagsmaps = createAppFlagsMaps();std::map<uint32, std::string>::iterator fiter = flagsmaps.begin();for (; fiter != flagsmaps.end(); ++fiter){if (PyModule_AddIntConstant(getScript().getModule(), fiter->second.c_str(), fiter->first)){ERROR_MSG(fmt::format("Baseapp::onInstallPyModules: Unable to set KBEngine.{}.\n", fiter->second));}}// 注册创建entity的方法到py APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), time, __py_gametime, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBase, __py_createBase, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseLocally, __py_createBase, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createEntity, __py_createBase, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseAnywhere, __py_createBaseAnywhere, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseRemotely, __py_createBaseRemotely, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseFromDBID, __py_createBaseFromDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseAnywhereFromDBID, __py_createBaseAnywhereFromDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), createBaseRemotelyFromDBID, __py_createBaseRemotelyFromDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), executeRawDatabaseCommand, __py_executeRawDatabaseCommand, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), quantumPassedPercent, __py_quantumPassedPercent, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), charge, __py_charge, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), registerReadFileDescriptor, PyFileDescriptor::__py_registerReadFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), registerWriteFileDescriptor, PyFileDescriptor::__py_registerWriteFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), deregisterReadFileDescriptor, PyFileDescriptor::__py_deregisterReadFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), deregisterWriteFileDescriptor, PyFileDescriptor::__py_deregisterWriteFileDescriptor, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), reloadScript, __py_reloadScript, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), isShuttingDown, __py_isShuttingDown, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), address, __py_address, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), deleteBaseByDBID, __py_deleteBaseByDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), lookUpBaseByDBID, __py_lookUpBaseByDBID, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), setAppFlags, __py_setFlags, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), getAppFlags, __py_getFlags, METH_VARARGS, 0);//addition by lsmAPPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), testfunc, __py_testfunc, METH_VARARGS, 0);APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), findEntityByName, __py_findEntityByName, METH_VARARGS, 0);return EntityApp<Base>::installPyModules(); }
![](/assets/blank.gif)
下面是方法的具体实现
![](/assets/blank.gif)
PyObject* Baseapp::__py_findEntityByName(PyObject* self, PyObject* args) {//首先读取参数int argCount = (int)PyTuple_Size(args);if (argCount != 1){PyErr_Format(PyExc_TypeError, "KBEngine::findEntityByName(): args is error!");PyErr_PrintEx(0);return 0;}char* entity_name = NULL;if (PyArg_ParseTuple(args, "s", &entity_name) == -1){PyErr_Format(PyExc_TypeError, "KBEngine::findEntityByName(): args is error!");PyErr_PrintEx(0);return 0;}//获取实体列表Entities<Base>::ENTITYS_MAP& entities = Baseapp::getSingletonPtr()->pEntities()->getEntities();Entities<Base>::ENTITYS_MAP::const_iterator iter = entities.begin();//先遍历获取返回值大小int entity_size = 0;while (iter != entities.end()){PyObject* entity = static_cast<PyObject*>(iter->second.get());//如果名字和实体名相同if (strcmp(entity->ob_type->tp_name, entity_name) == 0) {entity_size++;}iter++;}//第二次遍历获取具体返回值iter = entities.begin();PyObject* pyList = PyList_New(entity_size);int i = 0;while (iter != entities.end()){PyObject * pTuple = PyTuple_New(2);PyObject* entityID = PyLong_FromLong(iter->first);PyObject* entity = static_cast<PyObject*>(iter->second.get());//如果名字和实体名相同if (strcmp(entity->ob_type->tp_name, entity_name) == 0) {Py_INCREF(entity);PyTuple_SET_ITEM(pTuple, 0, entityID);PyTuple_SET_ITEM(pTuple, 1, entity);PyList_SET_ITEM(pyList, i, pTuple);i++;}iter++;}return pyList; }
![](/assets/blank.gif)
最终效果如下图
让我们把KBEngine玩坏吧!如何定制我们自己的C++函数(一)相关推荐
- 2014年:这些词都快被玩坏了
又是一年辞旧迎新,本年度有很多词被我们用得越来越多,多到当你每次见到它时只想远远地躲开.对于热门的概念人人都想跟它扯上关系,借机炒作一把,造成滥用.一方面由于词本身的定义不是很清晰,另一方面用的人太多 ...
- 瞧!老师的屏幕是如何被学生的弹幕玩坏的......
一直认为,我是在清华第一个敢在课堂上使用弹幕的教师.这个可以使用反证法来证明–那就是对于任何新鲜的事务,一开始年轻人总是会疯狂的,随后热情就会大大衰减.比如现在使用雨课堂上课的同学就不会太喜欢发弹幕了 ...
- 漫谈可视化Prefuse(四)---被玩坏的Prefuse API
这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的"漫谈可视化"系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse ...
- c++求矩阵的秩_线性代数复习(被玩坏的矩阵)
最近, 老有同学问, (线性)代数应该怎样复习呀. 本期就来谈谈我对这门课程的看法, 希望对大家有所帮助. 线代故事梗概大家不妨回想一下之所以有这门课程的「罪魁祸首」是什么? 那当然是 线性方程组 如 ...
- ios 获取是否静音模式_果粉感动:部分iOS“新功能”早已被安卓玩坏
一年一度的WWDC大会如期举行,今年不仅展示了全新的iOS.iPadOS以及macOS.当然,具体更新了什么相信早已经被各大媒体报道出来,本文并不是重复报道,相反的,iOS经过了13代的发展,有开创性 ...
- 苹果抄袭豌豆射手实锤!AirPods Pro又被玩坏了...
每一次苹果发布新品,买不买另说,但是外形总是会被网友拿来各种调侃.所以,今天凌晨,苹果发布的AirPods Pro毫无意外的再次被网友玩坏了. 继上个月的iPhone 11系列P图大赛之后,这次轮到了 ...
- 新iPhone又被各个品牌玩坏了,这里的人个个都是人才,说话又好听…
今年苹果发布会刚刚结束,新苹果手机都还没正式出售,就已经被网友们各种玩坏,各种吐槽.之前我们的小派同学已经给大家带来了网友们的吐槽内容,今天就来看看各个品牌是怎么吐槽新iPhone的. 不过首先还是给 ...
- 如何在VS上用C#玩坏“Hello World”。
如何在VS上用C#玩坏"Hello World". 为了开发win8应用,重装了系统到win8.1,安好了VS2013终极版,我们开始使用C#,今天来玩"Hello Wo ...
- 文心一言,被网友玩坏了哈哈哈哈哈哈哈
现在人工智能正火,百度"文心一言"出来,虽然只是小范围测试,但已经被玩坏了! 这应该算是卖全羊送狗肉 娃娃-菜-也没毛病哈 看来对美女还有些误解 虎头虎脑的胖大胖小子哈哈哈哈哈 鸳 ...
最新文章
- SQL中的join操作总结(非常好)
- AngularJS自定义表单验证
- 安装mysql 10055_Can’t connect to MySQL server on ‘localhost’ (10055) | 学步园
- 乘法器专题研究(内含所有类型乘法器)
- 局域网屏幕共享软件 推荐_局域网共享软件,详细教您局域网共享软件如何使用...
- java分布式架构的发展
- 回公司无聊和小冰聊天,很好奇她到底怎么想的
- Luogu P1039 侦探推理(模拟+枚举)
- 基于安卓手机的WAPI证书安装使用详解
- XMPP即时通讯协议使用(六)——开发Openfire聊天记录插件
- 网络中的“大禹”—防水墙是怎么工作的?
- android 系统 迷你pc,Remix mini:一款真正运行安卓系统的电脑
- Spring boot in action pdf+源码
- 深度linux时间.年日调整,deepin深度商店中的Linux版应用体验分享(一)
- ANSVC无功补偿装置在南京某高等院校中的应用-安科瑞华楠
- 使用 Matlab 解决数学建模问题
- 使用gensim框架及Word2Vec词向量模型获取相似词
- 机器学习之为什么要数据预处理?如何预处理数据?
- nodejs学习-fs模块
- 湖南计算机高考可填哪些志愿,湖南2021新高考填报志愿指南 可以填报几个志愿...