zoukankan      html  css  js  c++  java
  • 在lua脚本中使用我们自定义的精灵类

    首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite

     1 //
     2 //  HSprite.h
     3 //  cocos2dx_lua_tests_by_Himi
     4 //
     5 //  Created by Himi on 12-8-30.
     6 //
     7 //
     8  
     9 #ifndef cocos2dx_lua_tests_by_Himi_HSprite_h
    10 #define cocos2dx_lua_tests_by_Himi_HSprite_h
    11  
    12 #include "cocos2d.h"
    13 using namespace cocos2d;
    14  
    15 class HSprite : public cocos2d::CCSprite{
    16  
    17 public:
    18     static HSprite* createHSprite(const char* _name);
    19     void hspriteInit();
    20 };
    21 #endif

    HSprite.cpp

    //
    //  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”这个函数,然后在其中进行注册:

    tolua_usertype(tolua_S,"HSprite");

    如下图所示:

    第二步:声明我们自定义类的函数:

    搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:

    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 /* method: create of class  HSprite */
     2 #ifndef TOLUA_DISABLE_tolua_Himi_HSprite_createHSrpite00
     3 static int tolua_Himi_HSprite_createHSrpite00(lua_State* tolua_S)
     4 {
     5 #ifndef TOLUA_RELEASE
     6     tolua_Error tolua_err;
     7     if (
     8         !tolua_isusertable(tolua_S,1,"HSprite",0,&tolua_err) ||
     9         !tolua_isstring(tolua_S,2,0,&tolua_err) ||
    10         !tolua_isnoobj(tolua_S,3,&tolua_err)
    11         )
    12         goto tolua_lerror;
    13     else
    14 #endif
    15     {
    16         const char* pszFileName = ((const char*)  tolua_tostring(tolua_S,2,0));
    17         {
    18             HSprite* tolua_ret = (HSprite*)  HSprite::createHSprite(pszFileName);
    19             int nID = (tolua_ret) ? tolua_ret->m_uID : -1;
    20             int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL;
    21             tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"HSprite");
    22         }
    23     }
    24     return 1;
    25 #ifndef TOLUA_RELEASE
    26 tolua_lerror:
    27     tolua_error(tolua_S,"#ferror in function 'create'.",&tolua_err);
    28     return 0;
    29 #endif
    30 }
    31 #endif //#ifndef TOLUA_DISABLE

    这里Himi解释下:

    童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,

    首先是375~384之间的代码:

    #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之间的代码段:

    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”下代码修改如下:

    -- run
    local sceneGame = CCScene:create()
    -- sceneGame:addChild(createLayerFram())
    -- sceneGame:addChild(createLayerMenu())
    sceneGame:addChild(createHimiLayer())
    CCDirector:sharedDirector():runWithScene(sceneGame)

    这里Himi注视了另个layer的添加,添加了自己的Layer

    sceneGame:addChild(createHimiLayer())

    然后将Himi自定义方法添加在脚本中,代码如下:

    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,运行后的接图如下:

  • 相关阅读:
    [学]寻找mysql高并发解决方案(事务,行锁,事务隔离级别)
    [学]MYSQL中replace into的用法
    Dynamics CRM OData方式进行增删改查时报错的问题
    Get Form type using javascript in CRM 2011
    Dynamics CRM 同一实体多个Form显示不同的Ribbon按钮
    java中throw与throws
    Dynamics CRM 通过OData查询数据URI中包含中文的情况
    我是怎样阅读技术论文的
    Dynamics CRM2013/2015 禁止欢迎界面(Disable the Welcome Screen)
    社会化网络分析
  • 原文地址:https://www.cnblogs.com/damowang/p/4060418.html
Copyright © 2011-2022 走看看