为什么不更新kbe warring的代码解读了,因为在我看来那个demo讲完了实体就没东西可讲了,如果专心的看官方文档和PPT的话demo的代码后面没任何难点了已经,单纯的复制黏贴代码实在太过无聊。程序员一定要做点好玩的事情才行~

好吧,今天开始想法直接改引擎底层,争取把引擎底层直接玩坏(*^__^*)

另外因为平时工作比较忙,这个系列会不定期的更新。

从自己的HelloWorld写起

先来点简单的,baseapp脚本层调用一个自定义的C++函数,输出helloworld!

因为是baseapp的特有C++函数,所以我们需要打开baseapp项目的文件进行修改,这里我选baseapp.h和baseapp.cpp

为避免复制黏贴多余的代码,所以只写核心部分

baseapp.h

class Baseapp :    public EntityApp<Base>, public Singleton<Baseapp>
{
public://added by lsmstatic PyObject* __py_findAvatarByName(PyObject* self, PyObject* args);
protected:
}

baseapp.cpp

//-------------------------------------------------------------------------------------
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;
}

然后我们就能用官方自带的调试工具验证我们的成果了~!

输出某类实体

一般来说,C++效率是python的50-1000倍,所以如果遇到比较耗时的操作我们需要放到C++部分进行运算。另外引擎自己提供的api有些时候不能满足我们自己的需求,这个时候就需要我们来实现自己的需求了。

写点稍微有用的,kbe自带的api没有办法直接输出某类实体,那么我们制作一个自己的api,输出某类实体。

和上个方法类似,首先头文件定义

Baseapp.h

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:
}

Baseapp.cpp

//-------------------------------------------------------------------------------------
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();
}

下面是方法的具体实现

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;
}

最终效果如下图

让我们把KBEngine玩坏吧!如何定制我们自己的C++函数(一)相关推荐

  1. 2014年:这些词都快被玩坏了

    又是一年辞旧迎新,本年度有很多词被我们用得越来越多,多到当你每次见到它时只想远远地躲开.对于热门的概念人人都想跟它扯上关系,借机炒作一把,造成滥用.一方面由于词本身的定义不是很清晰,另一方面用的人太多 ...

  2. 瞧!老师的屏幕是如何被学生的弹幕玩坏的......

    一直认为,我是在清华第一个敢在课堂上使用弹幕的教师.这个可以使用反证法来证明–那就是对于任何新鲜的事务,一开始年轻人总是会疯狂的,随后热情就会大大衰减.比如现在使用雨课堂上课的同学就不会太喜欢发弹幕了 ...

  3. 漫谈可视化Prefuse(四)---被玩坏的Prefuse API

    这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的"漫谈可视化"系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse ...

  4. c++求矩阵的秩_线性代数复习(被玩坏的矩阵)

    最近, 老有同学问, (线性)代数应该怎样复习呀. 本期就来谈谈我对这门课程的看法, 希望对大家有所帮助. 线代故事梗概大家不妨回想一下之所以有这门课程的「罪魁祸首」是什么? 那当然是 线性方程组 如 ...

  5. ios 获取是否静音模式_果粉感动:部分iOS“新功能”早已被安卓玩坏

    一年一度的WWDC大会如期举行,今年不仅展示了全新的iOS.iPadOS以及macOS.当然,具体更新了什么相信早已经被各大媒体报道出来,本文并不是重复报道,相反的,iOS经过了13代的发展,有开创性 ...

  6. 苹果抄袭豌豆射手实锤!AirPods Pro又被玩坏了...

    每一次苹果发布新品,买不买另说,但是外形总是会被网友拿来各种调侃.所以,今天凌晨,苹果发布的AirPods Pro毫无意外的再次被网友玩坏了. 继上个月的iPhone 11系列P图大赛之后,这次轮到了 ...

  7. 新iPhone又被各个品牌玩坏了,这里的人个个都是人才,说话又好听…

    今年苹果发布会刚刚结束,新苹果手机都还没正式出售,就已经被网友们各种玩坏,各种吐槽.之前我们的小派同学已经给大家带来了网友们的吐槽内容,今天就来看看各个品牌是怎么吐槽新iPhone的. 不过首先还是给 ...

  8. 如何在VS上用C#玩坏“Hello World”。

    如何在VS上用C#玩坏"Hello World". 为了开发win8应用,重装了系统到win8.1,安好了VS2013终极版,我们开始使用C#,今天来玩"Hello Wo ...

  9. 文心一言,被网友玩坏了哈哈哈哈哈哈哈

    现在人工智能正火,百度"文心一言"出来,虽然只是小范围测试,但已经被玩坏了! 这应该算是卖全羊送狗肉 娃娃-菜-也没毛病哈 看来对美女还有些误解 虎头虎脑的胖大胖小子哈哈哈哈哈 鸳 ...

最新文章

  1. SQL中的join操作总结(非常好)
  2. AngularJS自定义表单验证
  3. 安装mysql 10055_Can’t connect to MySQL server on ‘localhost’ (10055) | 学步园
  4. 乘法器专题研究(内含所有类型乘法器)
  5. 局域网屏幕共享软件 推荐_局域网共享软件,详细教您局域网共享软件如何使用...
  6. java分布式架构的发展
  7. 回公司无聊和小冰聊天,很好奇她到底怎么想的
  8. Luogu P1039 侦探推理(模拟+枚举)
  9. 基于安卓手机的WAPI证书安装使用详解
  10. XMPP即时通讯协议使用(六)——开发Openfire聊天记录插件
  11. 网络中的“大禹”—防水墙是怎么工作的?
  12. android 系统 迷你pc,Remix mini:一款真正运行安卓系统的电脑
  13. Spring boot in action pdf+源码
  14. 深度linux时间.年日调整,deepin深度商店中的Linux版应用体验分享(一)
  15. ANSVC无功补偿装置在南京某高等院校中的应用-安科瑞华楠
  16. 使用 Matlab 解决数学建模问题
  17. 使用gensim框架及Word2Vec词向量模型获取相似词
  18. 机器学习之为什么要数据预处理?如何预处理数据?
  19. nodejs学习-fs模块
  20. 湖南计算机高考可填哪些志愿,湖南2021新高考填报志愿指南 可以填报几个志愿...

热门文章

  1. NOIP2017逛公园
  2. adb连接各个手机模拟器的默认端口号及adb基本操作命令
  3. Android系统截屏监听工具
  4. 《移动游戏开发精要》书评【跟我一样小白的,推荐这本书哦】
  5. 那个16岁便盗了马化腾QQ的少年,如今怎么样了?
  6. 用css做透明效果,CSS实现毛玻璃透明效果
  7. java inflater_java – Inflater和循环不能正常工作
  8. 2020/12/15测试案例
  9. Linux右键菜单全是英文的,QT下解决QTextEdit的右键菜单是英文的办法
  10. 年轻人小型创业项目 年轻人小成本创业项目