您好,欢迎访问一九零五行业门户网

【Cocos2dX(2.x)

本站文章均为 李华明himi 【黑米gamedev街区】 http://www.himigame.com/lua-2/985.html ? 点击订阅 ? 本博客最新动态!及时将最新博文通知您! 本篇做起来比较累,大家请参考最新篇 【cocos2dx-lua 脚本开发之四】使用tolua++编译pkg,从而创建自定义类让lua
本站文章均为 李华明himi 
【黑米gamedev街区】http://www.himigame.com/lua-2/985.html
? 点击订阅 ? 本博客最新动态!及时将最新博文通知您!
本篇做起来比较累,大家请参考最新篇【cocos2dx-lua 脚本开发之四】使用tolua++编译pkg,从而创建自定义类让lua脚本使用
此篇可能会在最新的cocos2dx版本中出现如下问题:
1
2
lua error: ...24f82-1230-41fe-8a04-c445fb7d1bab/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
16
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,运行后的接图如下:
好了,本篇就到这里,童鞋们感觉本站好的文章记得分享,转播散播哦
其它类似信息

推荐信息