cocos2d-x 3.0 在lua中调用自定义类

环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包

1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东,
主要就是python2.7.3, PyYAML-3.10.win32-py2.7, pyCheetah
这些东东在README.mdown上面都给好了连接, 直接下载就行了, 安装好python后, 在系统环境变量的PATH中设置python所在的目录
2.
安装android-ndk-r9b,
下载地址:http://dl.google.com/android/ndk/android-ndk-r9b-windows-x86.zip,
安装好以后要添加环境变量NDK_ROOT, 另外, 友情提示一下, 这个目录的上级目录中不能有空格存在, 比如说, 如果是放在program
files目录下面, 后面生成.h & .cpp文件的时候会出错, 我是直接放在D盘的根目录下面的, 像这样
 D:\android-ndk-r9b
3. 安装dos2unix,
下载地址:http://waterlan.home.xs4all.nl/dos2unix/dos2unix-6.0.5-win32.zip,
解压到一某个目录下面, 并设置PATH环境变量的值指向bin目录下, 在py文件中会使用到dos2unix.exe这个程序
4. Cygwin
Terminal, 这是android开发环境, 不一定非要安装, 考虑到肯定会在android下面进行开发调试, 所以现在可以一起安装一下.
相关安装事项可以参考这个文章:http://michaelye1988.iteye.com/blog/1740367

创建一个自己的lua项目, 这个就不多说了, 创建好该项目以后,
进入到YOUR_PROJECT_NAME\frameworks\runtime-src\Classes目录下, 添加自己的类文件, 比如hall.h &
hall.cpp, 并添加自己的类.
进入到YOUR_PROJECT_NAME\frameworks\cocos2d-x\tools\tolua下面,
复制cocos2dx_spine.ini和genbindings.py两个文件, 重新改名为hall.ini和hall.py
修改hall.ini文件,
要修改的内容如下:
[cocos2dx_ui]   改成  [hall]
prefix =
cocos2dx_ui    改成  prefix = hall
target_namespace =
ccui  改成  target_namespace =   (就是没有命名空间啦)
cpp_namespace =
cocos2d::ui  改成  cpp_namespace = 
headers =
%(cocosdir)s/cocos/ui/CocosGUI.h  改成  headers = [这里写上hall.h的目录, 可以用相对路径,
也可以用绝对路径, 注意用/表示目录, 而不是用\表示目录]
classes = ......    它原来这里的类比较多, 改成  你自己的,
要在lua中使用的类, 比如我这里有  classes = user_data hall 这两个在lua中使用的类
skip =
...       改成  skip =  (就是全删除了)
classes_have_no_parents =
Helper  改成  classes_have_no_parents =   (删除了)
abstract_classes =
Helper      改成  abstract_classes =         (删除了)

修改hall.py文件, 这下面

cmd_args = {‘cocos2dx.ini‘ : (‘cocos2d-x‘, ‘lua_cocos2dx_auto‘), \

‘cocos2dx_extension.ini‘ : (‘cocos2dx_extension‘,
‘lua_cocos2dx_extension_auto‘), \
‘cocos2dx_ui.ini‘ :
(‘cocos2dx_ui‘, ‘lua_cocos2dx_ui_auto‘), \

‘cocos2dx_studio.ini‘ : (‘cocos2dx_studio‘, ‘lua_cocos2dx_studio_auto‘), \

‘cocos2dx_spine.ini‘ : (‘cocos2dx_spine‘,
‘lua_cocos2dx_spine_auto‘), \
‘cocos2dx_physics.ini‘ :
(‘cocos2dx_physics‘, ‘lua_cocos2dx_physics_auto‘), \

}
修改成cmd_args = {‘hall.ini‘ : (‘hall‘, ‘lua_hall_auto‘), \

}
hall.ini是配置文件的名称, hall是hall.ini文件中第一行[hall]的字符串, lua_hall_auto是生成的.h
& .cpp文件名称
在此目录下按住shift右击, 选择"在此处打开命令窗口(W)", 执行python hall.py,
如果没有问题的话就会在YOUR_PROJECT_NAME\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto目录下面看到lua_hall_auto.h
& lua_hall_auto.cpp 两个文件, 将这个文件添加到项目中去, 至于文件的位置,
不用移动
在lua_hall_auto.h文件中就一个函数int register_all_hall(lua_State*
tolua_S);在AppDelegate.cpp文件中添加#include "lua_hall_auto.h"
修改代码
auto engine
=
LuaEngine::getInstance();
register_all_hall(engine->getLuaStack()->getLuaState());  //
这一行是添加的
ScriptEngineManager::getInstance()->setScriptEngine(engine);
engine->executeScriptFile("src/test.lua");

在脚本添加使用自定义的C++类
local
ghall = hall:get_singleton_ptr();
local msg =
"hallo";
ghall:send_data(msg, #msg);
在send_data中打个断点,
可以看到执行到这个函数里面了.

下面贴上我写的hall.h & hall.cpp文件

// hall.h

#pragma once

#include "CCRef.h"

class user_data : public cocos2d::Ref
{
public:
user_data(
std::string uname,
unsigned int uid);

std::string uname() const;
unsigned int uid() const;
private:
std::string uname_;
unsigned int uid_;
};

class base_net
{
public:
base_net() {};
virtual ~base_net() = 0;
};

class hall : public base_net, public cocos2d::Ref
{
public:
hall();
~hall();

static hall* get_singleton_ptr();
static hall& get_singleton();

void send_data(const char* msg, int msglen);

protected:
void process_packet();

private:
static hall* pthis;
};

// hall.cc

//#include "CCRef.h"
#include "hall.h"
#include <iostream>

#include "CCLuaEngine.h"
#include "cocos2d.h"

user_data::user_data(
std::string uname,
unsigned int uid) :
uname_(uname), uid_(uid)
{

}

std::string user_data::uname() const
{
return uname_;
}

unsigned int user_data::uid() const
{
return uid_;
}

base_net::~base_net() {}

hall* hall::pthis = NULL;

hall::hall()
{
pthis = this;
}

hall::~hall()
{}

hall& hall::get_singleton()
{
return *get_singleton_ptr();
}

hall* hall::get_singleton_ptr()
{
assert(pthis != NULL);
return pthis;
}

void hall::process_packet()
{

}

void hall::send_data(const char* msg, int msglen)
{
std::cout << msg << " " << msglen << std::endl;
process_packet();
}


View
Code

这里说一下我遇到的几个问题
1. base_net的析构函数体一开始我是写的头文件中的,
后面生成时会出现一份拷贝到lua_hall_auto.cpp文件中, 所以在头文件中不要写成员函数的实现体
2.
get_singleton()返回的是一个引用, 在生成的lua_hall_auto.cpp文件中, 关于这个函数的转换会出现问题,
如下
hall& ret =
hall::get_singleton();
object_to_luaval<hall&>(tolua_S, "hall",
(hall&)ret);
上面的代码有问题, 应该改成
hall& ret =
hall::get_singleton();
object_to_luaval<hall>(tolua_S, "hall",
&ret);  // 改这一句

时间: 2024-12-30 03:17:36

cocos2d-x 3.0 在lua中调用自定义类的相关文章

cocos2d-x 3.0 在C++中调用lua函数

代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_data) if user_data then user_data = tolua.cast(user_data, "user_data"); print (user_data:uid()); print (user_data:uname()); end end local ghall =

Lua中调用 cocos2d-x 的滑动条/滚动条 ScrollView

 ScrollView 我想玩儿过手机的朋友对滑动条都不陌生吧,(旁边: 这不是废话么???? )   那好吧,废话不多说直接开始ScrollView吧 local m_BaseNode  -- 主场景 local CreateScroll    -- 房间分级滑动视图 local CreateStageNode   -- 创建节点 local m_ScrollView              -- 滑动层变量 local m_Inner     -- 内容器 local addScrol

Lua中调用C函数

Lua利用一个虚拟的堆栈来给C传递值或从C获取值.每当Lua调用C函数,都会获得一个新的堆栈,该堆栈初始包含所有的调用C函数所需要的参数值(Lua传给C函数的调用实参),并且C函数执行完毕后,会把返回值压入这个栈(Lua从中拿到C函数调用结果). 于此相关的C API有几个比较重要的定义如下: (1)typedef struct lua_State lua_State; lua虚拟机(或叫解释器),可以理解为一个thread,和一个完整的Lua虚拟环境的执行状态. (2)typedef int

Lua中调用C函数(lua-5.2.3)

Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L). 简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该

Lua中“.”调用方法与“:”调用方法的区别

Lua中"."调用方法与":"调用方法的区别:                                                                                                                         一.概述 学lua的时候有一个迷惑点,就是搞不清楚'.'与':'调用方法的区别,今天很早就起来看了看一个大牛的视频讲解,才顿悟了:'.'调用和':'实际是传递参数的个数不同而已,':

kettle中调用java类

有时需要在kettle调用java类,如:验证.查询或自定义加密等.有时甚至连基本的数据访问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应用程序中,手工使用自定义的java客户端访问是唯一的方法.本文介绍如何在kettle中调用java类.示例代码在这里下载. 注:如果你使用kettle4.0及以上版本,也你也可以使用user defined java class 步骤实现.   Modified Java ScriptValue 步骤 关键要在kettle中使用M

Cocos2d-x Lua中Sprite精灵类

Cocos2d-x Lua中Sprite精灵类 精灵类是Sprite,它的类图如下图所示. Sprite类图 Sprite类直接继承了Node类,具有Node基本特征.此外,我们还可以看到Sprite类的子类有:PhysicsSprite和Skin.PhysicsSprite是物理引擎精灵类,Skin是皮肤精灵类用于骨骼动画.创建Sprite精灵对象创建精灵对象有多种方式,其中常用的函数如下:cc.Sprite:create ().创建一个精灵对象,纹理[ 纹理(texture),表示物体表面细

在IDL中调用自定义Python Module

在IDL中调用自定义PythonModule 要在IDL8.3中调用自定义的Python Module以实现在IDL中不方便完成的任务.如使用一些开发包,但是这个开发包并不支持IDL,毕竟使用IDL的人数还是相对较少的.因此,混合编程是一个解决之道.下面介绍在IDL(32位,下面的介绍都只是针对32位的IDL8.3)中调用自定义的PythonModule的操作步骤. 1)  下载Slither(The IDL toPython Bridge).下载地址http://research.jacque

只能从脚本中调用在类定义上有[ScriptService]属性的Web服务问题的解决方案

ajax调用webservice中的接口时, 会出现[只能从脚本中调用在类定义上有[ScriptService]属性的...]的异常. 这是因为, 在.net3.5中, 访问web服务, 要对web服务添加修饰: [System.Web.Script.Services.ScriptService]