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
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中背景音乐和音效使用实例
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之文本类使用实例
- Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
- Cocos2d-x UI开发之菜单类使用实例
- Cocos2d-x UI开发之CCControlButton控件类实例
- Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
- Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
- Cocos2d-x学习笔记之CCLayerColor层的使用实例
- Cocos2d-x Schedule定时器的使用实例
- Cocos2d-x中使用CCScrollView来实现关卡选择实例
- Cocos2d-x中CCEditBox文本输入框的使用实例
- cocos2d-x学习笔记之CCLayer、CCLayerColor、CCLayerGradient、CCLayerMultiplex场景层介绍
- Cocos2d-x UI开发之CCControlSlider控件类使用实例
- Cocos2d-x学习笔记之开发环境搭建
- Cocos2d-x学习笔记之Hello World!
- 使用C++进行Cocos2d-x游戏开发入门过程中的要点解析
- Cocos2d-x的内存管理总结
- Cocos2d-x 3.0中集成社交分享ShareSDK的详细步骤和常见问题解决