环境 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); // 改这一句