Xcode环境下tolua++的使用方法

Xcode环境:cocos2dx-lua中如何利用tolua++工具调用自定义类

参考文档:http://www.cocos2dev.com/?p=405

感觉自己的这篇是最详细的了,希望对从零开始的童鞋有帮助,高手勿喷!

一、环境搭建:
这里我们只介绍cocos2dx的安装及覆盖安装,准备好coco2dx安装包,我这里用的是cocos2d-x-2.1.4版本的。打开终端,cd到安装包文件夹内,ls查看有多个安装文件,我们选择install-templates-xcode.sh进行安装,安装命令:sudo ./install-templates-xcode.sh 回车就可以了。如果之前安装有其他版本的cocos2d-x,无需卸载,只要覆盖安装就好了,命令:sudo ./install-templates-xcode.sh -f 回车,OK了!是不是很简单呢。
查看第一个lua语言的程序更简单,启动Xcode工具,选择cocos2dx_lua模版,新建后直接运行就会出现,lua示例程序:一只小松鼠在农场里来回走,还有音乐哦。

二、创建自定义类:
在 classes下创建自己的类:HYSprite
HYSprite.h

//
//   HYSprite.h
//   FirstLua
//
//   Created by qiyu on 13-11-7.
//
//

#ifndef __FirstLua__HYSprite__
#define __FirstLua__HYSprite__

#include
#include "cocos2d.h"
USING_NS_CC;
class HYSprite : public CCSprite{
private:
      void initData();
public:
      static HYSprite * create(const char * filename);
      
};
#endif

HYSprite.cpp

//
//   HYSprite.cpp
//   FirstLua
//
//   Created by qiyu on 13-11-7.
//
//

#include "HYSprite.h"
HYSprite * HYSprite::create(const char * filename){
      HYSprite * sprite = new HYSprite();
      if (sprite && sprite->initWithFile(filename)) {
            sprite->initData();
            sprite->autorelease();
            return sprite;
      }
      CC_SAFE_DELETE(sprite);
      return NULL;
}
void HYSprite::initData(){
      this->setPosition(ccp(200, 200));
}
三、使用tolua++将自定义的类添加到LuaCocos2d.cpp文件中。
这一步需要四个必备条件:tolua++工具、手动编写pkg文件、build.sh编译工具、修改Cocos2d.pkg文件


1、tolua++工具在哪儿?
答:在cocos2dx的安装包里:cocos2d-x-2.1.4/tools/tolua++/ 
没有找到吧,那就对了,但是你能看到tolua++.Mac.zip这个压缩包,解压就出来了。
2、怎么编写pkg文件?
答:其实就是把纯文本文件的后缀改成pkg就好了。在tools/tolua++文件下有很多.pkg文件,都可以使用记事本打开。现在我们来编写自己的pkg文件,还记得我们自己定义的类么?(编写完成后,将HYSprite.pkg和那一坨pkg文件放在一起!)

HYSprite.pkg

class HYSprite : public CCSprite{
public:
      static HYSprite * create(const char * filename);
};
pkg编写规则:
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的函数都删除

3、编写的HYSprite.pkg有什么用呢?
答:注册。   在Cocos2d.pkg文件中注册HYSprite.pkg文件。在那一坨.pkg文件中你会找到Cocos2d.pkg,用记事本打开,在最后一行注册声明:$pfile "HYSprite.pkg"       
4、修改build.sh文件,build.sh在哪儿?
答:在cocos2dx的安装包里:cocos2d-x-2.1.4/tools/tolua++/ build.sh   找到了吗?打开build.sh,修改两个路径:
1)tolua++工具所在路径:
修改前(默认路径):TOLUA=`which tolua++5.1`
修改后(tolua++实际路径):TOLUA=/Users/qiyu/Desktop/cocos2d-x-2.1.4/tools/tolua++(注:文件夹名)/tolua++(注:工具名)
2)生成新LuaCocos2d.cpp文件的保存路径:
修改前:basic.lua -o ../../scripting/lua/cocos2dx_support/LuaCocos2d.cpp Cocos2d.pkg
修改后:basic.lua -o /Users/qiyu/Desktop/FirstLua/FirstLua/libs/lua/cocos2dx_support/LuaCocos2d.cpp Cocos2d.pkg
(建议:直接替换原工程中的LuaCocos2d.cpp文件)
5、编译,如何编译呢?
答:打开终端,直接cd到tolua++目录下,运行命令:./build.sh 回车 无报错,ok了!

四、编写lua脚本
1、检验生成的LuaCocos2d.cpp文件是否正常。
正常情况:回到工程中来,直接运行,会报错(这里必须得报错):意思是没有发现HYSprite这个类,在LuaCocos2d.cpp文件中添加HYSprit.h文件就好了,这时运行就会出现lua示例程序的界面:松鼠在农场里运动。
异常情况:回到工程中,直接运行,如果没有报错或着报了很多错误(至少20个),说明我们在生成LuaCocos2d.cpp文件的时候出了问题,主要是路径问题。(我遇到的是build.sh版本的问题,如果你用的是cocos2dx-2.1.1引擎,而使用cocos2dx-2.1.4安装包里的build.sh文件,那你完了,这东西不通用的)
2、hello.lua和hello2.lua
我们会在工程的Resources目录下,找到hello.lua和hello2.lua两个脚本文件。这里的hello2.lua没有实际意义,只是对hello.lua里一个函数的实现而已。我们只用到hello.lua或者我们自己建立一个新的.lua脚本也可以,比如hello3.lua:

hello3.lua内如如下:

function __G__TRACKBACK__(msg)
      print("----------------------------------------")
      print("LUA ERROR: " .. tostring(msg) .. "\n")
      print(debug.traceback())
      print("----------------------------------------")
end
local function main()
  local function createSunnyLayer()
            local layerSunny = CCLayer:create()
 
            local labTips = CCLabelTTF:create("我是hello3哦", "Arial", 18)
            labTips:setPosition(ccp(240,280))
            layerSunny:addChild(labTips)
 
            local sp = HYSprite:create("Icon.png")
            sp:setPosition(ccp(100,100))
            layerSunny:addChild(sp)
 
            return layerSunny
      end

      local sceneGame = CCScene:create()
      sceneGame:addChild(createSunnyLayer())
      CCDirector:sharedDirector():runWithScene(sceneGame)
end
xpcall(main, __G__TRACKBACK__)

3、选择执行哪个lua脚本:
打开Classes下的AppDelegate.cpp:
std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename(" hello3.lua");
修改lua脚本名称就ok了,修改前为hell.lua,修改成自己的hello3.lua。

至此,所有的工作都做完了,运行就OK了

你可能感兴趣的:(Xcode环境下tolua++的使用方法)