另:本章所用Cocos2d-x版本为:
Cocos2d-2.0.2
http://cn.cocos2d-x.org/download
大家好,又是一周过去了,这一周忙的有点焦头烂额,除了工作照例每天加班到九点外,工具箱又做了大幅改进,新的论坛游戏兔子game2z也上线了,Cocos2d-x的学习时间被压缩的很少了,现在是凌晨一点零六分,看着妻子睡熟的样子,我也只能告诉自已,坚持到底。
好了,不说废话,本周奉上一篇初级入门教程博文,Cocos2d-x中的LUA引导与入门。
做为惯例,一切都是以HelloWorld的样例为准。我们今天学习用LUA来完成一版HelloWorld。
大家既使没有看过我的“HelloWorld 深入分析”一文,想必也无数次运行过Cocos2d-x里的HelloCpp工程,对于运行的结果画面熟烂于心。我们回想一下,这个画面里有什么。嗯,一个背景图精灵,一个文字标签,一个关闭按钮。OK,咱们就做这么个东西。
首先,我们要知道LUA是个什么东西,至于官方怎么说可以百度去查,但我想告诉你的是LUA就是一种可以在不必修改C++代码的情况下实现逻辑处理的手段。稍微讲的再明白一点,就是你用指定语法写一些逻辑处理函数然后保存成文本格式,这个文件称为脚本文件,可以被游戏执行。经过若干年的发展,现在在LUA中写逻辑,除了调用注册到LUA的静态C函数外,也已经可以方便的访问到C++工程中的类的成员函数。这是游戏开发史上最重要的技术之一。其改变了很多设计方案,使游戏变的灵活强大而极具扩展性。
在Cocos2d-x中,有两个类来完成对于LUA脚本文件的处理。
1. CCLuaEngine:LUA脚本引擎
2. CCScriptEngineManager:脚本引擎管理器。
CCLuaEngine类的基类是一个接口类,叫做CCScriptEngineProtocol,它规定了所有LUA引擎的功能函数,它和CCScriptEngineManager都存放在libcocos2d下的script_support目录中的CCScriptSupport.h/cpp中。
首先我们来看一下CCScriptEngineProtocol:
- classCC_DLLCCScriptEngineProtocol:publicCCObject
- {
- public:
- //取得LUA的全局指针,所有的LUA函数都需要使用这个指针来做为参数进行调用。
- virtuallua_State*getLuaState(void)=0;
- //通过LUA脚本ID移除对应的CCObject
- virtualvoidremoveCCObjectByID(intnLuaID)=0;
- //通过函数索引值移除对应的LUA函数。
- voidremoveLuaHandler(intnHandler)=0;
- //将一个目录中的LUA文件加入到LUA资源容器中。
- voidaddSearchPath(constchar*path)=0;
- //执行一段LUA代码
- virtualintexecuteString(char*codes)=0;
- //执行一个LUA脚本文件。
- intexecuteScriptFile(char*filename)=0;
- //调用一个全局函数。
- intexecuteGlobalFunction(char*functionName)=0;
- //通过句柄调用函数多种形态。
- //通过句柄调用函数,参数二为参数数量。
- intexecuteFunctionByHandler(intnHandler,intnumArgs=0)=0;
- intexecuteFunctionWithIntegerData(intdata)=0;
- intexecuteFunctionWithFloatData(floatdata)=0;
- intexecuteFunctionWithBooleanData(booldata)=0;
- 名称。
- intexecuteFunctionWithCCObject(char*typeName)=0;
- //将一个整数数值压栈做为参数。
- intpushIntegerToLuaStack(intdata)=0;
- //将一个浮点数值压栈做为参数。
- intpushFloatToLuaStack(//将一个布尔数值压栈做为参数。
- intpushBooleanToLuaStack(//将一个CCObject指针和类型名压栈做为参数。
- intpushCCObjectToLuaStack(CCObject*pObject,87); background-color:inherit; font-weight:bold">char*typeName)=0;
- //执行单点触屏事件
- intexecuteTouchEvent(inteventType,CCTouch*pTouch)=0;
- //执行多点触屏事件。
- intexecuteTouchesEvent(//执行一个回调函数。
- intexecuteSchedule(floatdt)=0;
- };
这个接口类的功能函数的具体实现,我们要参看CCLuaEngine类。
现在我们打开CCLuaEngine.h: