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

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

582人阅读 评论(0) 收藏 举报



使用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]

//
// 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__) */

[/cpp]

Snsprite.cpp

[cpp]

//
// 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));
}

[/cpp]

上面是我定义个一个类,很简单的功能

二、使用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]

class Snsprite : public CCSprite{
static Snsprite* create(const char* name);
};

[/cpp]

注意对比之前的头文件声明,可以进一步了解pkg文件的编写规则。将编写好的pkg文件放在tolua++中,和所有的pkg文件放在一起。

2、在Cocos2d.pkg文件注册添加的pkg文件
用文本编辑器打开Cocos2d.pkg文件,在最后一行加入我们的注册声明:
$pfile “Snsprite.pkg”

3、配置build.sh编译脚本
在tolua++文件夹里面有个tolua++.Mac.zip,解压得到mac版的tolua++
打开build.sh文件修改成下面的:

[cpp]

#!/bin/bash
#
# Invoked build.xml,overriding the lolua++ property
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
TOLUA=/APP/cocos2d-2.1rc0-x-2.1.2/tools/tolua++/tolua++
if [ -z "${TOLUA}" ]; then
TOLUA=which tolua++5.1
fi
if [ -z "${TOLUA}" ]; then
echo "Unable to find tolua++ (or tolua++5.1) in your PATH."
exit 1
fi
cd ${SCRIPT_DIR}
${TOLUA} -L basic.lua -o /Users/liuyanghui/Desktop/LuaDemo/LuaDemo/libs/lua/cocos2dx_support/LuaCocos2d.cpp Cocos2d.pkg

[/cpp]

两个地方注意修改

a、TOLUA=/APP/cocos2d-2.1rc0-x-2.1.2/tools/tolua++/tolua++ 这个是你的mac版tolua++的地址,请修改成你自己的。

b、${TOLUA} -L basic.lua -o /Users/liuyanghui/Desktop/LuaDemo/LuaDemo/libs/lua/cocos2dx_support/LuaCocos2d.cpp Cocos2d.pkg

参数-o 后面的 /Users/liuyanghui/Desktop/LuaDemo/LuaDemo/libs/lua/cocos2dx_support/LuaCocos2d.cpp 是生成新的LuaCocos2d.cpp的存放路径,请修改成你自己的。

4、执行编译脚本,生成LuaCocos2d.cpp文件

终端cd到build.sh目录。执行:

./build.sh

执行后之后,在你定义的输出目录就生成了新的LuaCocos2d.cpp文件。我们自己定义的类也添加进去了。

三、在lua中调用自定义

在刚才新的cocos2dx-lua的Demo工程中,在hello.lua文件添加调用自定义类的函数

[cpp]

local function createSunnyLayer()
local layerSunny = cclayer:create()

local labTips = cclabelTTF:create("这个icon图标就是使用的自定义类","Arial",18)
labTips:setPosition(ccp(240,280))
layerSunny:addChild(labTips)

local sp = Snsprite:create("Icon.png")
sp:setPosition(ccp(100,100))
layerSunny:addChild(sp)

return layerSunny
end
— play background music,preload effec t

[/cpp]

添加到scene中:

[cpp]

– run
local sceneGame = CCScene:create() — 创建场景
–sceneGame:addChild(createLayerFarm()) — 将农场层加入场景
–sceneGame:addChild(createLayerMenu()) — 将菜单界面层加入场景
sceneGame:addChild(createSunnyLayer())
CCDirector:sharedDirector():runWithScene(sceneGame)

[/cpp]

OK,xcode编译运行,就看到效果了。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...