您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx-lua_添加c++自定义函数

2016-07-12 17:25 597 查看
以下在win7、cocos2dx-3.10下

1.概述

当cocos2dx lua提供的函数无法满足我们的一些需求时,就需要我们自己写cocos2dx c++的类,然后再

将其注册到lua中调用。

2.将c++的函数注册到lua

这里由于cocos code IDE无法显示c++文件,故只能用vs2013调试。

但在调试之前,你应该已经在cocos code IDE创建了win32的模拟器,在cocos code IDE的顶部菜单中

就有构建模拟器的按钮,创建后,你就可以在cocos code IDE下启动win32的模拟器,能出来cocos2dx

测试界面就算设置成功了。

且在创建你的cocos2dx lua项目时,设置的是Framework Mode,而不是Engine Mode,因为我们下面放

自定义c++文件的地方就在你的项目的frameworks中。

打开你的项目-》frameworks-》runtime-src-》proj.win32

双击vs的项目文件,如“test.sln”。

在打开的vs项目中,你可以看到frameworks/runtime-src/Classes中的c++文件,默认如下:

Classes--

--ide-support

  --CodeIDESupport.h

  --lang

  --lua_debugger.c

  --lua_debugger.h

  --RuntimeLuaImpl.cpp

  --RuntimeLuaImpl.h

  --SimpleConfigParser.cpp

  --SimpleConfigParser.h

--AppDelegate.cpp

--AppDelegate.h

--lua_module_register.h

我们在Classes下添加自己的c++类:

myTest.h

myTest.cpp          //其中包含了注册到lua的逻辑

myTestFunction.h

myTestFunction.cpp  //其中包含了2个数字相加并返回结果的函数

2.1.自定义c++文件

myTest.h-------------

#ifndef myTest_h

#define myTest_h

#include <stdio.h>

#include "CCLuaEngine.h"

class myTest{

public:

    static myTest* getInstance();

    ~myTest();

    void bind(lua_State* ls);

    static int cpp_log(lua_State* ls);
static int cpp_add(lua_State* ls);

private:

    lua_State* m_ls;

};

#endif /* myTest_hpp */

myTest.cpp-------------

#include "myTest.h"

#include "myTestFunction.h"  //注意这里

#include "cocos2d.h"

USING_NS_CC;

static myTest* _instance = nullptr;

static const char* cpp_su = "function yj_scheduleUpdate(d) d:scheduleUpdateWithPriorityLua(function(t) d:update(t) end,0) end";

static const char* cpp_unsu = "function yj_unscheduleUpdate(d) d:unscheduleUpdate() end";

myTest* myTest::getInstance(){

    if(_instance == nullptr){

        _instance = new myTest();

    }

    return _instance;

}

void myTest::bind(lua_State *ls){

    this->m_ls = ls;

    

    luaL_dostring(ls, yj_su);

    luaL_dostring(ls, yj_unsu);
//注册到lua

    lua_register(ls, "cpp_log", cpp_log);

    lua_register(ls, "cpp_add", cpp_add);

}

int myTest::cpp_log(lua_State* ls){

    const char* str = lua_tostring(ls, 1);

    printf("%s\n",str);

    return 0;

}

int myTest::cpp_add(lua_State* ls){

    const char* num1 = lua_tostring(ls, 1);

    const char* num2 = lua_tostring(ls, 2);

    myTestFunction::getInstance()->add(num1, num2);

    return 0;

}

myTest::~myTest(){

    if (_instance) {

        free(_instance);

        _instance = nullptr;

    }

}

myTestFunction.h-------------

#ifndef myTestFunction_h

#define myTestFunction_h

#include "cocos2d.h"

USING_NS_CC;

class myTestFunction{

public :

    static myTestFunction * getInstance();
size_t add(const size_t x, const size_t y);

};

#endif /* myTestFunction_hpp */

myTestFunction.cpp-------------

#include "myTestFunction.h"

#include "CCLuaEngine.h"

static myTestFunction * instance = nullptr ;

myTestFunction* myTestFunction::getInstance(){

    if (instance == nullptr) {

        instance = new myTestFunction();

    }

    return instance ;

}

size_t myTestFunction::add(const size_t x, const size_t y){
return x+y;

}

2.2.修改AppDelegate.cpp

AppDelegate.cpp-------------

#include "AppDelegate.h"

#include "CCLuaEngine.h"

#include "SimpleAudioEngine.h"

#include "cocos2d.h"

#include "lua_module_register.h"

#include "myTest.h"              //引用自定义c++文件

bool AppDelegate::applicationDidFinishLaunching()

{

    // set default FPS

    Director::getInstance()->setAnimationInterval(1.0 / 60.0f);

    // register lua module

    auto engine = LuaEngine::getInstance();

    ScriptEngineManager::getInstance()->setScriptEngine(engine);

    lua_State* L = engine->getLuaStack()->getLuaState();

    

    myTest::getInstance()->bind(L);  //注册自定义c++文件到lua

...

}

2.3.在你的cocos2dx lua项目中

main.lua------------

require "config"

require "cocos.init"

local function main()

    local sum = cpp_add(1,2)
cpp_log("sum=" .. sum)

end

local status, msg = xpcall(main, __G__TRACKBACK__)

if not status then

    print(msg)

end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x