博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
让我们把KBEngine玩坏吧!如何定制我们自己的C++函数(一)
阅读量:4614 次
发布时间:2019-06-09

本文共 14123 字,大约阅读时间需要 47 分钟。

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

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

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

从自己的HelloWorld写起

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

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

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

baseapp.h

class Baseapp :    public EntityApp,                 public Singleton
{public: //added by lsm static 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
flagsmaps = createAppFlagsMaps(); std::map
::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 lsm APPEND_SCRIPT_MODULE_METHOD(getScript().getModule(), testfunc, __py_findAvatarByName, METH_VARARGS, 0); return EntityApp
::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,                 public Singleton
{public: //added by lsm static 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
flagsmaps = createAppFlagsMaps(); std::map
::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 lsm APPEND_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
::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::ENTITYS_MAP& entities = Baseapp::getSingletonPtr()->pEntities()->getEntities();    Entities::ENTITYS_MAP::const_iterator iter = entities.begin();    //先遍历获取返回值大小    int entity_size = 0;    while (iter != entities.end())    {        PyObject* entity = static_cast
(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
(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;}

最终效果如下图

 

转载于:https://www.cnblogs.com/lsm19870508/p/7028886.html

你可能感兴趣的文章
C语言学习笔记--字符串
查看>>
CSS-上下文选择器
查看>>
ionic repeat 重复最后一个时要执行某个函数
查看>>
1.初识代码审计-基础
查看>>
[Vue-rx] Stream an API using RxJS into a Vue.js Template
查看>>
解决VC几个编译问题的方法——好用
查看>>
SPOJ #11 Factorial
查看>>
City Upgrades
查看>>
“人少也能办大事”---K2 BPM老客户交流会
查看>>
关于七牛进行图片添加文字水印操作小计
查看>>
DataSource数据库的使用
查看>>
CentOS开启samba实现文件共享
查看>>
MSSQL使用sqlbulkcopy批量插入数据
查看>>
证明一个数能被3整除,当且仅当它的各位数的和能被3整除
查看>>
2018秋寒假作业4—PTA编程总结1
查看>>
android自适应屏幕
查看>>
2019-北航面向对象-电梯作业总结
查看>>
SqlHelper
查看>>
初识算法、数据结构
查看>>
Luogu4069 SDOI2016 游戏 树链剖分、李超线段树
查看>>