微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

利用tolua++编译pkg,以便让Lua使用cpp自定义类

感谢点评与关注,欢迎转载与分享
勤奋努力,持之以恒!

1、创建自定义类SongCpp.cpp

SongCpp.h

#ifndef __SongToLua__SongCpp__
#define __SongToLua__SongCpp__

#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;

class SongCpp : public CCSprite {
public:
    static SongCpP* createSongImage(const char* fileName);
    cclabelTTF* createSongName(const char* name,int fontSize);
};

#endif /* defined(__SongToLua__SongCpp__) */

SongCpp.cpp

#include "SongCpp.h"
SongCpP* SongCpp::createSongImage(const char *fileName){
    SongCpP* sp = new SongCpp();
    if (sp && sp->initWithFile(fileName)) {
        sp->autorelease();
        return sp;
    }
    CC_SAFE_DELETE(sp);
    return NULL;
}

cclabelTTF* SongCpp::createSongName(const char *name,int fontSize){
    cclabelTTF* name_sp = cclabelTTF::create(name,"Arial",fontSize);
    return name_sp;
}

2、通过自定义类.h(头文件)制作 pkg

在cocos2dx引擎cocos2d-x-2.1.4/tools/tolua++下有编写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的函数删除

首先通过xcode生成pkg文件或者纯文本文件(后缀改成.pkg)即可,我的SongCpp.pkg如下:

class SongCpp : public CCSprite {
    static SongCpP* createSongImage(const char* fileName);
    cclabelTTF* createSongName(const char* name,int fontSize);
};

然后把SongCpp.pkg文件放到目录/Users/xiangzi/Documents/cocos2d-x-2.1.4/tools/tolua++下 ,在Cocos2d.pkg中注册你的pkg文件,在此文件中的pkg都是会被编译的,如图11:


再找到build.sh文件修改下列两个路径,如图7:


TOLUA= 为tolua++目录下的tolua++工具    ${TOLUA} 生成的LuaCocos2d.cpp所放的路径,我们直接把它放到项目中。
接着打开终端,cd到tolua++目录下,输入make命令回车。如图8:


打开项目中新生成的LuaCocos2d.cpp文件搜索自定义类SongCpp,如果搜到则证明成功,如图9:


然后再打开LuaCocos2d.h,导入我们的自定义类SongCpp.h

#ifndef __LUACOCOS2D_H_
#define __LUACOCOS2D_H_

#ifdef __cplusplus

#include "SongCpp.h"

extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif

TOLUA_API int tolua_Cocos2d_open(lua_State* tolua_S);

#endif // __LUACOCOS2D_H_

3、Lua项目中使用自定义类:

local size = CCDirector:sharedDirector():getWinSize()
local mainLayer = cclayer:create()

local song_image = SongCpp:createSongImage("xiangzi.png")
song_image:setPosition(ccp(size.width*0.5,size.height*0.5))
mainLayer:addChild(song_image)

local song_name = song_image:createSongName("song_huixiang",50)
song_name:setPosition(ccp(size.width*0.5,size.height*0.8))
mainLayer:addChild(song_name)


-- run
local sceneGame = CCScene:create()
sceneGame:addChild(mainLayer)
CCDirector:sharedDirector():runWithScene(sceneGame)

运行结果如图10:



如有错误请大家一定要多多指正,感谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐