
我们有一个C++类,TestLayer.h
#ifndef __TEST_LAYER_H__#define __TEST_LAYER_H__#include "cocos2d.h"namespace cocos2d{ class TestLayer : public Layer { public: static TestLayer* create(); bool init(); voID myPrint(const std::string &str); TestLayer(voID); ~TestLayer(voID); };}int register_TestLayer(lua_State* tolua_S);#endif TestLayer.cpp
#include "TestLayer.h"using namespace cocos2d;TestLayer::TestLayer(){}TestLayer::~TestLayer(){}voID TestLayer::myPrint(const std::string &str){ cclOG(str.c_str());}TestLayer* TestLayer::create(){ TestLayer *pRet = new TestLayer(); if ( pRet && pRet->init() ) { pRet->autorelease(); return pRet; } CC_SAFE_DELETE(pRet); return nullptr;}bool TestLayer::init(){ if ( !Layer::init() ) { return false; } return true;}//lua binding#include "tolua_fix.h"#include "LuaBasicConversions.h"int lua_cocos2dx_TestLayer_create(lua_State* tolua_S){ int argc = 0; bool ok = true;#if COCOS2D_DEBUG >= 1 tolua_Error tolua_err;#endif#if COCOS2D_DEBUG >= 1 if (!tolua_isusertable(tolua_S,1,"cc.TestLayer",&tolua_err)) goto tolua_lerror;#endif argc = lua_gettop(tolua_S) - 1; if (argc == 0) { if(!ok) { tolua_error(tolua_S,"invalID arguments in function 'lua_cocos2dx_TestLayer_create'",nullptr); return 0; } TestLayer* ret = TestLayer::create(); object_to_luaval<TestLayer>(tolua_S,"cc.Layer",(TestLayer*)ret); return 1; } luaL_error(tolua_S,"%s has wrong number of arguments: %d,was expecting %d\n ","cc.Layer:create",argc,0); return 0;#if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_TestLayer_create'.",&tolua_err);#endif return 0;}int lua_cocos2dx_TestLayer_myPrint(lua_State* tolua_S){ int argc = 0; TestLayer* cobj = nullptr; bool ok = true;#if COCOS2D_DEBUG >= 1 tolua_Error tolua_err;#endif#if COCOS2D_DEBUG >= 1 if (!tolua_isusertype(tolua_S,&tolua_err)) goto tolua_lerror;#endif cobj = (cocos2d::TestLayer*)tolua_tousertype(tolua_S,0);#if COCOS2D_DEBUG >= 1 if (!cobj) { tolua_error(tolua_S,"invalID 'cobj' in function 'lua_cocos2dx_TestLayer_myPrint'",nullptr); return 0; }#endif argc = lua_gettop(tolua_S)-1; if (argc == 1) { std::string arg0; ok &= luaval_to_std_string(tolua_S,2,&arg0,"cc.TestLayer:myPrint"); if(!ok) { tolua_error(tolua_S,"invalID arguments in function 'lua_cocos2dx_TestLayer_myPrint'",nullptr); return 0; } cobj->myPrint(arg0); lua_settop(tolua_S,1); return 1; } luaL_error(tolua_S,was expecting %d \n","cc.TestLayer:myPrint",1); return 0;#if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_TestLayer_myPrint'.",&tolua_err);#endif return 0;}int lua_register_cocos2dx_TestLayer(lua_State* tolua_S){ tolua_usertype(tolua_S,"cc.TestLayer"); tolua_cclass(tolua_S,"TestLayer",nullptr); tolua_beginmodule(tolua_S,"TestLayer"); tolua_function(tolua_S,"create",lua_cocos2dx_TestLayer_create); tolua_function(tolua_S,"myPrint",lua_cocos2dx_TestLayer_myPrint); tolua_endmodule(tolua_S); std::string typename = typeID(TestLayer).name(); g_luaType[typename] = "cc.TestLayer"; g_typeCast["TestLayer"] = "cc.TestLayer"; return 1;}int register_TestLayer(lua_State* tolua_S){ lua_getglobal(tolua_S,"_G"); if (lua_istable(tolua_S,-1))//stack:...,_G,{ tolua_open(tolua_S); tolua_module(tolua_S,"cc",0); tolua_beginmodule(tolua_S,"cc"); lua_register_cocos2dx_TestLayer(tolua_S); tolua_endmodule(tolua_S); } lua_pop(tolua_S,1); return 1;} 这样就写好了一个c++类及其绑定函数,然后我们在Appdelegate.cpp中加入如下代码
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(); lua_module_register(L); register_TestLayer(L); // If you want to use Quick-Cocos2d-X,please uncomment below code // register_all_quick_manual(L); LuaStack* stack = engine->getLuaStack(); stack->setXXTEAKeyAndSign("2dxLua",strlen("2dxLua"),"XXTEA",strlen("XXTEA")); //register custom function //LuaStack* stack = engine->getLuaStack(); //register_custom_function(stack->getLuaState()); #if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT > 0) // NOTE:Please don't remove this call if you want to deBUG with Cocos Code IDE RuntimeEngine::getInstance()->start(); cocos2d::log("iShow!");#else if (engine->executeScriptfile("src/main.lua")) { return false; }#endif return true;} OK,大功告成,我们只要在lua文件中做如下调用进行测试:
local MainScene = class("MainScene",cc.load("mvc").VIEwBase)function MainScene:onCreate() -- add background image display.newSprite("MainSceneBg.jpg") :move(display.center) :addTo(self) -- add play button local playbutton = cc.MenuItemImage:create("Playbutton.png","Playbutton.png") :onClicked(function() --self:getApp():enterScene("PlayScene") local layer = cc.TestLayer:create() layer:myPrint("哈哈") end) cc.Menu:create(playbutton) :move(display.cx,display.cy - 200) :addTo(self)endreturn MainScene 可以看到,lua文件中,成功打印“哈哈”
总结
以上是内存溢出为你收集整理的cocos2d-Lua与c++交互,lua如何绑定C++类。全部内容,希望文章能够帮你解决cocos2d-Lua与c++交互,lua如何绑定C++类。所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)