当前位置:编程学习 > wap >>

cocos2dx-lua中如何使用自定义类以及tolua++的使用

使用cocos2dx-lua开发,免不了自己定义类,但是如何使用自定义的类的?

 


先了解下lua如何调用c++的:

lua脚本代码->通过coocs2dx中间解析层代码->将其转换并调用cocos2dx c++的前端代码

coocs2dx中间解析层代码都在libs/lua/cocos2dx_support/LuaCocos2d.cpp 这个文件中,想了解的可以自己去看下这个文件。

 


也就是说,你自己定义了一个类,lua能够调用你自己定义的类,你的自定义类就必须在LuaCocos2d.cpp这个中间解析文件中申明。

 


看了LuaCocos2d.cpp这个文件,可能有的同学都晕了,不知道怎么在LuaCocos2d.cpp中申明自己的定义的类。不过,不用担心,cocos2dx已经提供了tolua++这个工具自动编译生成新的LuaCocos2d.cpp文件。

 


下面开始进入正题。

一、创建一个coocs2dx-lua 的Demo工程,然后在class中自己定义个类。

SNSprite.h


[cpp]
<SPAN style="FONT-SIZE: 14px">//  
//  SNSprite.h  
//  LuaDemo  
//  
//  Created by LiuYanghui on 13-4-8.  
//  
//  
 
#ifndef __LuaDemo__SNSprite__  
#define __LuaDemo__SNSprite__  
 
#include "cocos2d.h"  
USING_NS_CC; 
 
class  SNSprite : public CCSprite{ 
public: 
    static SNSprite* create(const char* name); 
     
private: 
    void initData(); 
}; 
 
#endif /* defined(__LuaDemo__SNSprite__) */  
</SPAN> 

//
//  SNSprite.h
//  LuaDemo
//
//  Created by LiuYanghui on 13-4-8.
//
//

#ifndef __LuaDemo__SNSprite__
#define __LuaDemo__SNSprite__

#include "cocos2d.h"
USING_NS_CC;

class  SNSprite : public CCSprite{
public:
    static SNSprite* create(const char* name);
   
private:
    void initData();
};

#endif /* defined(__LuaDemo__SNSprite__) */

 


SNSprite.cpp

[cpp]
<SPAN style="FONT-SIZE: 14px">//  
//  SNSprite.cpp  
//  LuaDemo  
//  
//  Created by LiuYanghui on 13-4-8.  
//  
//  
 
#include "SNSprite.h"  
 
SNSprite* SNSprite::create(const char* name){ 
    SNSprite* sprite = new SNSprite(); 
    if(sprite && sprite->initWithFile(name)){ 
        sprite->initData(); 
        sprite->autorelease(); 
        return sprite; 
    } 
    CC_SAFE_DELETE(sprite); 
    return NULL; 

 
void SNSprite::initData(){ 
    CCActionInterval* action = CCSequence::createWithTwoActions(CCMoveTo::create(1.0, ccp(300,300)), 
                                                                CCMoveTo::create(1.0, ccp(100,100)) 
                                                                ); 
    this->runAction(CCRepeatForever::create(action)); 
}</SPAN> 

//
//  SNSprite.cpp
//  LuaDemo
//
//  Created by LiuYanghui on 13-4-8.
//
//

#include "SNSprite.h"

SNSprite* SNSprite::create(const char* name){
    SNSprite* sprite = new SNSprite();
    if(sprite && sprite->initWithFile(name)){
        sprite->initData();
        sprite->autorelease();
        return sprite;
    }
    CC_SAFE_DELETE(sprite);
    return NULL;
}

void SNSprite::initData(){
    CCActionInterval* action = CCSequence::createWithTwoActions(CCMoveTo::create(1.0, ccp(300,300)),
                                                                CCMoveTo::create(1.0, ccp(100,100))
                                                                );
    this->runAction(CCRepeatForever::create(action));
}
上面是我定义个一个类,很简单的功能。

 


二、使用tolua++将自定义的类添加的LuaCocos2d.cpp文件中。

tolua++工具在/tools/tolua++/目录下。

1、编写pkg文件

首先我们看下里面会发现有很多pkg文件,所以先为自定义的类编写pkg文件,文件的编写规则在README中,我简单说下编写规则:

Writing .pkg files
    1) enum keeps the same  //枚举类型保留不变
    2) remove CC_DLL for the class defines, pay attention to multi inherites  //删除cc_dll的类定义,改用多继承
    3) remove inline keyword for declaration and implementation  //删除内联关键字声明和实现
    4) remove public protect and private //删除访问限定词
    5) remove the decalration of class member variable  //删除成员变量
    6) keep static keyword  //保留静态关键词
    7) remove memeber functions that declared as private or protected //非public的函数都删除

以上是pkg文件的编写规则。

下面编写自定义文件的pkg文件。纯文本,后缀改成pkg

SNSprite.pkg


[cpp]
<SPAN style="FONT-SIZE: 14px">class  SNSprite : public CCSprite{ 
    static SNSprite* create(const char* name); 
};</SPAN> 

class  SNSprite : public CCSprite{
    static SNSprite* create(const char* name);
};
注意对比之前的头文件声明,可以进一步了解pkg文件的编写规则。将编写好的pkg文件放在tolua++中,和所有的pkg文件放在一起。

 


2、在Cocos2d.pkg文件中注册添加的pkg文件

用文本编辑器打开Cocos2d.pkg文件,在最后一行加入我们的注册声明:

$pfile "SNSprite.pkg"

 

 

3、配置build.sh编译脚本

在tolua++文件夹里面有个tolua++.Mac.zip,解压得到mac版的tolua++

打开build.sh文件

补充:移动开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,