环境 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() = ;
}; 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();
}

这里说一下我遇到的几个问题
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);  // 改这一句

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

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

    代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_d ...

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

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

  3. Lua中调用C++方法

    目前项目,使用了Lua脚本,至于使用Lua的好处不再赘述了.于是对Tolua做了一些小小的学习,总结一下吧. 主要说一下如何在Lua中调用C++方法. Lua调用C++的桥梁,是tolua.tolua ...

  4. lua中调用C++函数

    lua中调用C++函数 我们产品中提供了很多lua-C API给用户在lua中调用,之前一直没用深究其实现原理,只是根据已有的代码在编码.显然这不是一个好的习惯,没用达到知其所以然的目的. 一.基本原 ...

  5. kettle中调用java类

    kettle中调用java类 有时须要在kettle调用java类,如:验证.查询或自己定义加密等.有时甚至连主要的数据訪问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应 ...

  6. C#在派生类中调用基类成员

    一.在派生类中调用基类成员 在C#的派生类中,我们可以使用base关键字调用基类中的公有或者受保护成员.这些成员只能是构造函数.实例方法或者实例属性. base关键字调用基类成员的语法格式如下: ba ...

  7. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

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

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

  9. cocos2d-x 3.0 在C++中调用lua函数(2)

    个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define ...

随机推荐

  1. PCL点云特征描述与提取(1)

    3D点云特征描述与提取是点云信息处理中最基础也是最关键的一部分,点云的识别.分割,重采样,配准曲面重建等处理大部分算法,都严重依赖特征描述与提取的结果.从尺度上来分,一般分为局部特征的描述和全局特征的 ...

  2. Axiom3D写游戏:第一个窗口

    Axiom主要的代码大致翻看了下,就想到了自己来模拟一下游戏开发. 这章主要包括创建窗口及3D渲染的一些基本元素,并添加一个第三人称的骨骼动画作主角,加上前文中修改过后的地形组件,能用鼠标和键盘进行漫 ...

  3. python gpio

    打算用python控制gpio,网上找的都是一些关于树莓派如何操作gpio的文档,只针对树莓派.所以就自己封装一下函数,方便以后使用.在linux上已经生成了和gpio相关的文件,只要对文件进行读取即 ...

  4. Mybatis系列(五):mybatis逆向工程

    一.背景 在实际开发中我们会自己去写mapper映射文件,接口,数据库表对应的实体类,如果需求任务比较少,咱们还可以慢慢的一个一个去写,但是这是不现实的,因为在工作中我们的任务是很多的,这时mybat ...

  5. JAVA编程环境JDK与JRE运行环境与API核心ClassMap

    JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境.JDK是整个Java的核心1.Java运行环境( ...

  6. 本机IP、127.0.0.1和0.0.0.0的区别

    本机ip.127.0.0.1和0.0.0.0区别   网络java IP地址的记法: IP地址由四个字节构成,为了方便阅读和书写,每个字节用0-255的数字表示,字节之间用’.'分割,如: 10.10 ...

  7. 回想sql语句中的各种连接

    1. 内连接(Inner Join) 内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接. 以下是ANSI SQL-92标准 select * from    t_ins ...

  8. 超酷 CSS3/HTML5 3D 飘带菜单实现教程

    今天我们来介绍一款很有创意的CSS3/HTML5菜单,首先菜单是飘带形状的,看起来很优雅,这种菜单在个人博客中用的比较多,不仅干净利落,而且很具有个性化.另外,这款菜单在鼠标滑过菜单项时,将会出现3D ...

  9. hdu 5086 Revenge of Segment Tree(BestCoder Round #16)

    Revenge of Segment Tree                                                          Time Limit: 4000/20 ...

  10. 腾讯爱玩某处csrf导致骚扰用户(QQ弹窗+QQ会话+微博)

    点击提醒,然后抓包: POST /dyid_proc.php HTTP/1.1 Host: tx.qq.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW ...