本篇做起来比较累,大家请参考最新篇【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
此篇可能会在最新的cocos2dx版本中出现如下问题:
1
2
|
LUA ERROR
:
...
24
F
82
-1230
-41
FE
-8
A
04
-
C
445
FB
7
D
1
BAB
/
mtet.app
hello.lua
35
:
error
in
function 'addChild'. argument
#2 is 'MySprite'; 'CCNode' expected.
|
最近Himi都没有更新博文了,其实也是犹豫写本cocos2d(x)引擎书籍在做准备,目录的草稿都写好了,目录中包含的大家最感兴趣的cocos2d/x动作编辑器的详细制作流程与源码! 但是遗憾的是Himi还是腾不出时间去写;
放弃去写的另外一个原因就是因为支持我的童鞋门,在7月份就说过要为大家奉上关于cocos2dx-lua的系列教程,但是一直由于时间等问题一再拖到现在,如果Himi真要准备写书估计半年内都基本很难有时间更新博客的,当然也考虑到公司项目,最终放弃;(暂时放弃,以后有可能的话还是会写的 )
顺便说一句,关于Himi9个技术群,不论是cocos2d-iphone、cocos2dx、android还是以后陆续公布的Unity3D群,周期性的Himi和管理员们会定期清理(一切都是为了更多想学习的新童鞋考虑),希望大家进群冒泡,积极讨论。好了,废话就不多说了,从今天开始Himi为童鞋们出cocos2dx-lua的系列开发教程,希望大家还一如既往得支持;3Q
Himi 当前开发工具等版本如下:
mac: 10.8 xcode:4.4.1 cocos2dx :cocos2d-2.0-rc2-x-2.0.1
本篇介绍两个知识点:1. Lua基础 2.在lua脚本中使用我们自定义的精灵类
一:lua基础
关于Lua的其实很早前Himi写过一篇关于cocos2dx-Lua 的基础博文了,但是是cocos2dx 1.x版本的,对于不是很熟悉的童鞋,Himi还是建议去看一看,连接:【iOS-cocos2d-X 游戏开发之八】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!Himi以后更新的Lua系列都是基于Cocos2dx 2.x版本的了。
二:在lua脚本中使用我们自定义的精灵类
首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite
HSprite.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//
// HSprite.h
// cocos2dx_lua_tests_by_Himi
//
// Created by Himi on 12-8-30.
//
//
#ifndef cocos2dx_lua_tests_by_Himi_HSprite_h
#define cocos2dx_lua_tests_by_Himi_HSprite_h
#include "cocos2d.h"
using namespace cocos2d;
class
HSprite : public cocos2d::CCSprite{
public
:
static HSprite* createHSprite( const char * _name);
void
hspriteInit();
};
#endif
|
HSprite.cpp:
// HSprite.cpp
#import "HSprite.h"
HSprite* HSprite::createHSprite( * _name){
HSprite* sp = new HSprite();
if
(sp && sp->initWithFile(_name)){
sp->hspriteInit();
sp->autorelease();
return
sp;
}
CC_SAFE_DELETE(sp);
NULL;
}
HSprite::hspriteInit(){
}
|
以上代码不做解释了,很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit)
下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图:
步骤分为3步:
在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册:
tolua_usertype(tolua_S,monospace!important; vertical-align:baseline!important; line-height:1.1em!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; width:auto!important; min-height:inherit!important; color:blue!important">"HSprite"
);
|
如下图所示:
搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:
4 |
tolua_cclass(tolua_S,monospace!important; vertical-align:baseline!important; line-height:1.1em!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; width:auto!important; min-height:inherit!important; color:blue!important">"CCSprite"
tolua_beginmodule(tolua_S,monospace!important; vertical-align:baseline!important; line-height:1.1em!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; width:auto!important; min-height:inherit!important">);
tolua_function(tolua_S,monospace!important; vertical-align:baseline!important; line-height:1.1em!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; width:auto!important; min-height:inherit!important; color:blue!important">"createHSprite"
tolua_endmodule(tolua_S);
|
如下图:
首先定义能让脚本认识的类函数,遵循如下:
a) tolua_cclass(tolua_S,“HSprite”,“CCSprite”,NULL);
tolua_cclass声明哪个类函数,第一个状态值默认:tolua_S
后两个参数:是自定义类类名
再往后是继承的父类类名
b)添加参数开始声明:
tolua_beginmodule(tolua_S,”HSprite”);
tolua_function(tolua_S,”createHSprite”,tolua_Himi_HSprite_createHSrpite00);
第一个参数默认,第二个参数自定义类名,第三个:实现脚本与自定义类之间的转换实现函数
注意,这里有多个函数,可以继续写;
d) 结束自定义函数:
tolua_endmodule(tolua_S);
第三步:实现我们的脚本之间转换函数 tolua_Himi_HSprite_createHSrpite00
实现如下:
24
25
26
27
28
29
30
31
|
/* method: create of class HSprite */
#ifndef TOLUA_disABLE_tolua_Himi_HSprite_createHSrpite00
static
int tolua_Himi_HSprite_createHSrpite00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if
(
!tolua_isusertable(tolua_S,1,&tolua_err) ||
!tolua_isstring(tolua_S,2,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto
tolua_lerror;
else
#endif
{
* pszFileName = ((
*) tolua_tostring(tolua_S,0));
{
HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName);
int nID = (tolua_ret) ? tolua_ret->m_uID : -1;
int
* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL;
tolua_pushusertype_ccobject(tolua_S,nID,pLuaID,(
void *)tolua_ret,monospace!important; vertical-align:baseline!important; line-height:1.1em!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; width:auto!important; min-height:inherit!important">);
}
}
1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S,monospace!important; vertical-align:baseline!important; line-height:1.1em!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; outline:0px!important; overflow:visible!important; position:static!important; right:auto!important; top:auto!important; width:auto!important; min-height:inherit!important; color:blue!important">"#ferror in function 'create'."
0;
#endif
}
#endif //#ifndef TOLUA_disABLE
|
童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
(
)
tolua_lerror;
else
这里是对参数类型的判断:
相关文章 本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1. 来源 QuickV3sample项目中的2048样例游戏,以及最近《...
Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...
|