cocos2dx lua 绑定之二:手动绑定自定义类中的函数

cococs2dx 3.13.1 + vs2013 + win10

1.首先按照《cocos2dx lua 绑定之一:自动绑定自定义类》绑定Student类

2.在Student类中增加一个用于测试手动绑定的函数manual_call

①Student.h中增加函数

    //手动绑定调用函数
    void manual_call();

②Student.cpp中增加函数实现

//和自动绑定相比,只增加了这个函数
void Student::manual_call()
{
    std::cout << " manual call function " << std::endl;
}

3.在libluacocos2d项目中新增两个手动绑定的处理文件lua_cocos2dx_student_manual.h和lua_cocos2dx_student_manual.cpp

①lua_cocos2dx_student_manual.h

#pragma once

#ifdef __cplusplus
extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif

TOLUA_API int register_student_moudle(lua_State* L);

②lua_cocos2dx_student_manual.cpp

#include "scripting/lua-bindings/manual/user_define/lua_cocos2dx_student_manual.hpp"
#include "scripting/lua-bindings/auto/lua_userdefine_student_auto.hpp"
#include "user_define/Student.h"

#include "scripting/lua-bindings/manual/tolua_fix.h"
#include "scripting/lua-bindings/manual/LuaBasicConversions.h"
#include "scripting/lua-bindings/manual/cocos2d/LuaScriptHandlerMgr.h"
#include "scripting/lua-bindings/manual/CCLuaValue.h"
#include "scripting/lua-bindings/manual/CCLuaEngine.h"
#include "base/CCEventListenerFocus.h"

//调用函数
static int tolua_student_test_function(lua_State* L)
{
    if (nullptr == L)
        return 0;

    Student** s = (Student**)luaL_checkudata(L, 1, "Student");
    luaL_argcheck(L, s != NULL, 1, "invalid user data");
    (*s)->manual_call();
    return 0;
}

//注册函数
static void regist_student_manual_functions(lua_State* L)
{
    //找到对应自动注册的类
    lua_pushstring(L, "Student");
    lua_rawget(L, LUA_REGISTRYINDEX);
    if (lua_istable(L,-1))
    {
        tolua_function(L, "manual_call", tolua_student_test_function); //将函数绑定到Student类中
    }
    lua_pop(L, 1);
}

int register_student_moudle(lua_State* L)
{
    lua_getglobal(L, "_G");
    if (lua_istable(L,-1))//stack:...,_G,
    {
        register_all_userdefine_student(L);
        regist_student_manual_functions(L);
    }
    lua_pop(L, 1);

    return 1;
}

4.将函数注册到lua中,找到libluacocos2d项目中

①在CCLuaStack.cpp文件增加头文件引用

#include "scripting/lua-bindings/manual/user_define/lua_cocos2dx_student_manual.hpp"

②在init函数里增加函数注册到Lua

先屏蔽注册自动函数的相关代码,使用register_student_moudle同时注册自动绑定和手动绑定的函数

//register_all_userdefine_student(_state);
register_student_moudle(_state);

5.重新编译项目,在Lua里使用

local student = Student:new()
student:manual_call()

6.如果不使用自动绑定,全部使用手动绑定,可参考下面两篇文章直接进行绑定

Lua和C++交互 学习记录之八:C++类注册为Lua模块

Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

时间: 2024-12-25 05:11:11

cocos2dx lua 绑定之二:手动绑定自定义类中的函数的相关文章

关于在App_Code文件夹自定义类中Session无法使用

由于前台页面需要调用App_Code中自定义类的函数,但在自定义类中找不到Session,解决方法如下: 新建一个类session,并自己定义函数GetSession(),引用命名空间 System.Web 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 6 public static class session 7 { 8 public static o

在自定义类中使用setMouseCallBack

TOP 在opencv学习中教程中的鼠标回调函数的使用,都是在主函数中调用,但在自定义类中调用该函数时,会出现参数的类型与形参不匹配问题.最后在stackoverflow中找到了一些解决办法. 鼠标调用的函数为: 1 /** @brief Sets mouse handler for the specified window 2 3 @param winname Name of the window. 4 @param onMouse Callback function for mouse ev

Win32下 Qt与Lua交互使用(四):在Lua脚本中自由执行Qt类中的函数

话接上篇.通过前几篇博客,我们实现在Lua脚本中执行Qt类中函数的方法,以及在Lua脚本中连接Qt对象的信号与槽. 但是,我们也能发现,如果希望在Lua脚本中执行Qt类的函数,就必须绑定一个真正实现功能的函数.如QWidget::show(),需要写一个在栈中取出widget指针,widget调用show()函数的方式.如果希望在Lua中调用大量函数,就需要编写大量的C++实现函数.有没有什么省时省力的好方法呢? 上一篇中我们实现了在Lua脚本中连接信号与槽.我们只是传过去了两个QObject的

第八周项目 二 【项目2-Time类中的运算符重载】

[项目2-Time类中的运算符重载] 实现Time类中的运算符重载. [cpp] view plaincopyprint? class CTime { private: unsigned short int hour;    // 时 unsigned short int minute;  // 分 unsigned short int second;  // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,i

spring自定义类中@AutoWired标识的元素注入为null

最近在做项目的时候,发现程序运行的时候有一个nullpointer exception,一脸懵逼因为感觉程序没什么逻辑.后来发现是因为new出来的component不会自动注入它的元素. 现象:@Component修饰的自定义普通类中@Autowired属性为null 原因:如果是通过new实例化的对象,脱离了Spring的管理,所以获取不到Spring注解的属性值. 在新线程中也会存在注解获取不到Spring管理的Bean,也是因为new出来的线程,脱离了Spring容器 我在实际开发中遇到有

【从零之三(更)】自定义类中调用讯飞语音包错误解决办法

原文:http://blog.csdn.net/monkeyduck/article/details/24302655 在科大讯飞语音包的Mscdemo中它的方法都是写在Activity中的,这样其实并不是很好,因为Activity只是负责UI交互的,如果项目很简单自然可以,但是一旦比较复杂肯定要自己定义很多包很多类,但是写在Activity中的方法就不能被自己定义的类调用了,咋办尼,那就把方法写在自己的类里就行了.准备工作:把Msc.jar包和libmsc.so拷贝到自己工程的libs目录下,

自定义的类型放入STL的set中,需要重载自定义类中的“&lt;”符号(转)

在以前学习STL的时候,曾经学到过,如果要将自定义的类型放入到set中的话,就需要重载“<”符号,原因是set是一个有序的集合,集合会按照“<”比较的大小,默认按照从小到大的顺序排列.假设我现在设计如下类型: class MyType { public: int a, b, c; } 这是,为了让MyType类型可以顺利的放进set中,我必须重载“<”,这时问题来了,要如何重载呢?这个类型有三个数据成员,我能不能要求按照a的大小排列,如果a相等的话就随便按照b或者c的大小排列呢?如果近实

python3 与dict相关的魔法方法。使用于二叉搜索树的类中

Python的魔术方法一般以__methodname__的形式命名,如:__init__(构造方法), __getitem__. __setitem__(subscriptable所需method), __delitem__(del obj[key]所需method), __len__(len(…)所需method)等. 在Python中,如果我们想实现创建类似于序列和映射的类,可以通过重写魔法方法__getitem__.__setitem__.__delitem__.__len__方法去模拟.

自定义类中定义两个方法,相互调用

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Test06 7 { 8 //class Class1 9 //{ 10 // public string Country() 11 // { 12 // string strCountry = "方法的示例!"; 13 // return strCountry; 14 /