【Cocos2dX(2.x)_Lua开发之三】
【Cocos2dX(2.x)_Lua开发之三】在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi )
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/lua-game/985.html
☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!
本篇做起来比较累,大家请参考最新篇【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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//
// HSprite.cpp
// cocos2dx_lua_tests_by_Himi
//
// Created by Himi on 12-8-30.
//
//
#import "HSprite.h"
HSprite* HSprite::createHSprite( const char * _name){
HSprite* sp = new HSprite();
if (sp && sp->initWithFile(_name)){
sp->hspriteInit();
sp->autorelease();
return sp;
}
CC_SAFE_DELETE(sp);
return NULL;
}
void HSprite::hspriteInit(){
CCMessageBox( "create HSprite success" , "Himi_Lua" );
}
|
以上代码不做解释了,很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit)
下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图:
然后开始添加我们自定义精灵类,让Lua脚本能认识它;
步骤分为3步:
1. 注册我们的自定义类:
在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册:
1
|
tolua_usertype(tolua_S, "HSprite" );
|
如下图所示:
第二步:声明我们自定义类的函数:
搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:
1
2
3
4
|
tolua_cclass(tolua_S, "HSprite" , "HSprite" , "CCSprite" , NULL);
tolua_beginmodule(tolua_S, "HSprite" );
tolua_function(tolua_S, "createHSprite" ,tolua_Himi_HSprite_createHSrpite00);
tolua_endmodule(tolua_S);
|
如下图:
这里开始解释:
首先定义能让脚本认识的类函数,遵循如下:
a) tolua_cclass(tolua_S, “HSprite”, “HSprite”, “CCSprite”, NULL);
tolua_cclass声明哪个类函数,第一个状态值默认:tolua_S
后两个参数:是自定义类类名
再往后是继承的父类类名
b)添加参数开始声明:
tolua_beginmodule(tolua_S,”HSprite”);
c) 添加自定类函数:
tolua_function(tolua_S,”createHSprite”,tolua_Himi_HSprite_createHSrpite00);
第一个参数默认,第二个参数自定义类名,第三个:实现脚本与自定义类之间的转换实现函数
注意,这里有多个函数,可以继续写;
d) 结束自定义函数:
tolua_endmodule(tolua_S);
第三步:实现我们的脚本之间转换函数 tolua_Himi_HSprite_createHSrpite00
实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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, "HSprite" ,0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,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, "HSprite" );
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S, "#ferror in function 'create'." ,&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
|
如下图所示:
这里Himi解释下:
童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,
首先是375~384之间的代码:
1
2
3
4
5
6
7
8
9
10
|
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertable(tolua_S,1, "HSprite" ,0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
|
这里是对参数类型的判断:
tolua_isusertable 是否为”第三个参数”自定义类型
tolua_isstring 是否为字符串类型
tolua_isnoobj 结束(没有参数的判断)
然后是386~392之间的代码段:
1
2
3
4
5
6
7
|
const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,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, "HSprite" );
}
|
这里是对脚本代码的解析从而调用的自定义创建的函数
最后我们修改 hello2.lua 脚本中的代码:(创建cocos2dx-lua项目默认Resources下自带的文件)
在脚本最后”– run”下代码修改如下:
1
2
3
4
5
6
|
-- run
local sceneGame = CCScene:create()
-- sceneGame:addChild(createLayerFram())
-- sceneGame:addChild(createLayerMenu())
sceneGame:addChild(createHimiLayer())
CCDirector:sharedDirector():runWithScene(sceneGame)
|
这里Himi注视了另个layer的添加,添加了自己的Layer
1
|
sceneGame:addChild(createHimiLayer())
|
然后将Himi自定义方法添加在脚本中,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
local function createHimiLayer()
local layerH = CCLayer:create()
local _font = CCLabelTTF:create( "Himi_(cocos2dx-Lua)教程" , "Arial" ,33)
_font:setPosition(230,280)
layerH:addChild(_font)
--创建自定义类型精灵
local hsprite = HSprite:createHSprite( "himi.png" )
hsprite:setPosition(100,100)
hsprite:setScale(1.5)
hsprite:setRotation(45)
layerH:addChild(hsprite)
return layerH
end
|
创建自己定义的精灵,然后进行调用缩放,旋转,设置坐标函数。
ok,运行后的接图如下:
本站文章均为 李华明Himi 原创,转载务必在明显处注明:(作者新浪微博: @李华明Himi )
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/lua-game/985.html
☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!
本篇做起来比较累,大家请参考最新篇【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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//
// HSprite.cpp
// cocos2dx_lua_tests_by_Himi
//
// Created by Himi on 12-8-30.
//
//
#import "HSprite.h"
HSprite* HSprite::createHSprite( const char * _name){
HSprite* sp = new HSprite();
if (sp && sp->initWithFile(_name)){
sp->hspriteInit();
sp->autorelease();
return sp;
}
CC_SAFE_DELETE(sp);
return NULL;
}
void HSprite::hspriteInit(){
CCMessageBox( "create HSprite success" , "Himi_Lua" );
}
|
以上代码不做解释了,很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit)
下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图:
然后开始添加我们自定义精灵类,让Lua脚本能认识它;
步骤分为3步:
1. 注册我们的自定义类:
在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册:
1
|
tolua_usertype(tolua_S, "HSprite" );
|
如下图所示:
第二步:声明我们自定义类的函数:
搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:
1
2
3
4
|
tolua_cclass(tolua_S, "HSprite" , "HSprite" , "CCSprite" , NULL);
tolua_beginmodule(tolua_S, "HSprite" );
tolua_function(tolua_S, "createHSprite" ,tolua_Himi_HSprite_createHSrpite00);
tolua_endmodule(tolua_S);
|
如下图:
这里开始解释:
首先定义能让脚本认识的类函数,遵循如下:
a) tolua_cclass(tolua_S, “HSprite”, “HSprite”, “CCSprite”, NULL);
tolua_cclass声明哪个类函数,第一个状态值默认:tolua_S
后两个参数:是自定义类类名
再往后是继承的父类类名
b)添加参数开始声明:
tolua_beginmodule(tolua_S,”HSprite”);
c) 添加自定类函数:
tolua_function(tolua_S,”createHSprite”,tolua_Himi_HSprite_createHSrpite00);
第一个参数默认,第二个参数自定义类名,第三个:实现脚本与自定义类之间的转换实现函数
注意,这里有多个函数,可以继续写;
d) 结束自定义函数:
tolua_endmodule(tolua_S);
第三步:实现我们的脚本之间转换函数 tolua_Himi_HSprite_createHSrpite00
实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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, "HSprite" ,0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
{
const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,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, "HSprite" );
}
}
return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
tolua_error(tolua_S, "#ferror in function 'create'." ,&tolua_err);
return 0;
#endif
}
#endif //#ifndef TOLUA_DISABLE
|
如下图所示:
这里Himi解释下:
童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,
首先是375~384之间的代码:
1
2
3
4
5
6
7
8
9
10
|
#ifndef TOLUA_RELEASE
tolua_Error tolua_err;
if (
!tolua_isusertable(tolua_S,1, "HSprite" ,0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,3,&tolua_err)
)
goto tolua_lerror;
else
#endif
|
这里是对参数类型的判断:
tolua_isusertable 是否为”第三个参数”自定义类型
tolua_isstring 是否为字符串类型
tolua_isnoobj 结束(没有参数的判断)
然后是386~392之间的代码段:
1
2
3
4
5
6
7
|
const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,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, "HSprite" );
}
|
这里是对脚本代码的解析从而调用的自定义创建的函数
最后我们修改 hello2.lua 脚本中的代码:(创建cocos2dx-lua项目默认Resources下自带的文件)
在脚本最后”– run”下代码修改如下:
1
2
3
4
5
6
|
-- run
local sceneGame = CCScene:create()
-- sceneGame:addChild(createLayerFram())
-- sceneGame:addChild(createLayerMenu())
sceneGame:addChild(createHimiLayer())
CCDirector:sharedDirector():runWithScene(sceneGame)
|
这里Himi注视了另个layer的添加,添加了自己的Layer
1
|
sceneGame:addChild(createHimiLayer())
|
然后将Himi自定义方法添加在脚本中,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
local function createHimiLayer()
local layerH = CCLayer:create()
local _font = CCLabelTTF:create( "Himi_(cocos2dx-Lua)教程" , "Arial" ,33)
_font:setPosition(230,280)
layerH:addChild(_font)
--创建自定义类型精灵
local hsprite = HSprite:createHSprite( "himi.png" )
hsprite:setPosition(100,100)
hsprite:setScale(1.5)
hsprite:setRotation(45)
layerH:addChild(hsprite)
return layerH
end
|
创建自己定义的精灵,然后进行调用缩放,旋转,设置坐标函数。
ok,运行后的接图如下:
转载于:https://www.cnblogs.com/lifesteven/p/3897871.html
【Cocos2dX(2.x)_Lua开发之三】相关推荐
- 《团队项目开发之三对一维环形数组的求解》
<团队项目开发之三对一维环形数组的求解> 设计思想:通过把数组的长度扩大为原来的一倍,相当于新数组是由对原来的数组重复了一遍后而组成的,这样保证了数组以环状的形式,按照数组中每个数字的位序 ...
- 用VC++进行MapX二次开发::之三------使用MapX工具
VC++进行MapX二次开发 之三------使用MapX工具 对于一个"标准"的Windows应用程序,一般都有一个工具栏.如果你用过某 ...
- 十.四轮车驱动开发之三: 巧用编码器获取电机转速信息
这是"四轮车驱动控制"系列,分多个小节来介绍: 1. 八.四轮车驱动开发之一:正/逆向运动学分析 2. 九.四轮车驱动开发之二: 配置PWM驱动直流电机 3. 十.四轮车驱动开发之 ...
- cocos2d-x 3.3 Lua开发 摄像机使用
这一篇我们先看cocos2d-x 3.3 Lua开发 摄像机使用. 1.为什么要使用Camera 游戏有点像电影,镜头的使用非常重要.忽远忽近,跟随主角,场景切换等等.一般来说2d游戏不太需要使用Ca ...
- iOS流媒体开发之三:HLS直播(M3U8)回看和下载功能的实现
1.概要 流媒体开发第一篇文章就说要把这些不是随便就可以百度到的知识献给"简书",拖了一个多月了,总算弄完了,深深松了口气,万幸没有食言,否则对不起小伙伴们. 流媒体始终是大众生活 ...
- web工作流管理系统开发之三 可视化流程设计器
原文地址为: web工作流管理系统开发之三 可视化流程设计器 在工作流管理系统中,引擎的所有的活动,驱动,和流转,都是以流程定义为基础而展开的.流程定义文件是流程能运行的先决条件,同时流程定义文件又是 ...
- XMPP客户端库Smack 4.0.6版开发之三
XMPP客户端库Smack 4.0.6版开发之三 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 六.建立连接的例子 XMPPConnection类用于创 ...
- 【Cocos2d-X(2.x) 游戏开发系列之三】最新版本cocos2d-2.0-x-2.0.2使用资源加载策略
前段时间cocos2dx更新了最新版本cocos2d2.0x2.0.2,也从这个版本开始对于资源加载与管理都改变了策略. 在之前的加载方式都是通过沿用与cocos2d-iphone一样的加载资源 ...
- eclipse开发cocos2dx 3.2环境搭建之三: ccp-tests项目编译 (this project is not a CDT project)
cocos2dx还有一些测试项目,3.2版本都在安装目录下的tests文件夹下.其中ccp-tests项目包含非常多的使用示例,初学者可以通过熟悉学习这个项目快速的了解cocos2dx的基础知识. 自 ...
最新文章
- Windows10使用技巧
- SAP MM 如何看一个采购申请是由APO系统创建后同步过来的?
- 如何加快HTML页面加载速度
- Struts2 action的单例与多例
- matlab如何创建callback函数_如何学好MATLAB GUI
- 程序员找工作那点事儿
- 《敏捷软件开发过程及最佳实践》培训总结
- Android 系统性能优化(47)---Traceview
- Undefined control sequence.l.463 \cita
- Java并发编程的艺术(一)并发编程的挑战
- json文件使用tips
- Plan——没有计划不可能越狱
- 《机器学习》周志华,勘误修订(带公式显示)
- YUV420->RGB888格式转换的CPP实现
- TeXLive升级教程
- 对比汇新云和猪八戒?
- Flutter流畅性fps计算
- java基础--狂神
- 拿得起,放得下,想得开
- 浏览器刷新+缓存原理
热门文章
- macOS Big Sur怎么样?值得升级吗?Big Sur与Catalina的对比
- 11届蓝桥杯青少年组C++全国赛高级组 六.编程实现:求阶乘(python3实现)
- CAN总线技术 | 物理层01 - CAN信号电平
- Qt文档阅读笔记-Qt单元测试中模拟GUI事件
- MySQL笔记-MDL锁(metadata lock)
- C++ opengl 点的绘制
- Qt学习笔记-Qt5程序开机自启动(windows)
- C++带参数控制台(实例)
- 最小二乘法幂函数C语言,跪求最小二乘法幂函数C 语言程序
- java查询未提交事务的数据_Jfinal同一事务中已插入的数据记录在事务未提前前查询不到?...