Cocos2d-x Lua运行流程
Cocos2d-lua
是 Cocos2d-x
引擎添加了Lua
绑定的版本。使用C++
和Cocos2d-x
引擎开发时,编写的代码是直接调用Cocos2d-x
引擎的API
,因为Cocos2d-x
引擎也是使用C++
编写的,所以无需进行语言转换。而使用Lua
和Cocos2d-x
编码时,编写的代码必须通过LuaEngine
引擎执行,LuaEngine
引擎封装了Cocos2d-x
引擎的API
,所以相当于使用Lua
脚本在调用Cocos2d-x
的API
。
主入口文件 main.lua
main.lua
启动文件是Cocos2d-lua
项目默认主入口,项目启动时默认首先执行main.lua
文件。
运行流程
步骤0:设置 编译后的客户端开始执行时,使用FileUtils
加载Luac
文件的提示是否显示。
cc.FileUtils:getInstance():setPopupNotify(true)
步骤1:将源代码src
目录和资源res
目录添加到文件搜索路径
cc.FileUtils:getInstance():addSearchPath("src/")
cc.FileUtils:getInstance():addSearchPath("res/")
注:通过addSearchPath()方法设置源代码和资源的搜索路径
步骤2:加载配置文件读取配置
require "config"
-
config.lua
配置文件用于定义初始化所使用的全局变量 -
require()
方法表示引入一个文件,使用require()
方法加载文件的过程会检查文件的lua
语法,同时会完成被加载文件内部变量的初始化。
步骤3:执行初始化
加载cocos/init.lua
文件,根据config.lua
配置文件对cocos2d-lua
框架进行初始化。
require "cocos.init"
步骤4:加载app
目录下MyApp.lua
文件,创建App对象并调用run()
函数。
local function main()
require("app.MyApp"):create():run()
end
- 调用对应
class
的Create()
方法创建对象,并执行run()
方法。 -
run()
函数用于配置第一个进入的场景,默认为MainScene
。 - 通过载入的
app.MyApp
模块创建一个MyApp
实例,并调用实例的run()
方法,此时将启动执行MyApp
脚本。
配置文件 config.lua
-
DEBUG
设置输出调试信息选项,即通过控制不同的print()输出信息。
0 表示关闭
1 表示打印少量调试信息
2 表示打印标准完整的调试信息 -
CC_USE_FRAMEWORK
设置是否使用quick框架,其中包括MVC框架。
*CC_SHOW_FPS
设置是否显示FPS等显卡信息 -
CC_DISABLE_GLOBAL
设置是否允许定义全局字段 -
CC_DESIGN_RESOLUTION
设置不同分辨率
默认应用 MyApp.lua
应用文件:app/MyApp.lua
local MyApp = class("MyApp", cc.load("mvc").AppBase)
function MyApp:onCreate()
math.randomseed(os.time())
end
return MyApp
-
MyApp
类继承自mvc
中的cc.mvc.AppBase
类,系统自动查找packages/mvc/AppBase.lua
文件,AppBase
是Quick
框架自带的一个MVC的应用程序基础类,此类为应用程序提供一些逻辑控制上的功能,如进入场景、切换场景等。 -
class()
方法本身是Quick
框架定义的用于创建自定义lua
类的函数,function class(classname, super)
函数参数classname
表示类名,super
表示父类或创建对象实例的函数。
MVC
MVC
是一种组合设计模式,被广泛应用在带有图形交互的用户界面程序(GUI)
开发中。MVC
的宗旨在于分离关注点(SoC)
,将界面表现和业务逻辑分离。(SoC)
原则在现代软件工程中是一个非常重要的设计理念。对于实际问题,要划分不同的关注点,且关注点之间必须隔离开来,这样才能达到 更好的代码重用,以获得鲁棒性、可适配性、可维护性。
Cocos2d
本身并不是基于MVC
的理念设计的,在Cocos2d_x
中CCScene
、CCLayer
、CCSprite
等类都是CCNode
的子类,开发流程基本是这样的:
- 通过应用程序代理类来初始化第一个即主场景
- 场景中实例化一个或多个布景图层,并将其添加进去。
- 布景图层中实例化一个或多个精灵,并将其添加进去。
- 场景处理用户输入,例如
Touch
事件和加速计的改变。同时更新布景图层和精灵,让精灵运行一个或多个动作等。 - 场景中运行一个游戏循环(一般是1/60更新一次),然后布景图层和精灵在游戏循环中做更新和游戏逻辑。
对于手游而言,界面UI
的布局与显示都是由View
负责的,点击事件手势滑动等操作是由Controller
来处理的,游戏中需要的数据是由Model
负责的。
local MyApp = class("MyApp", cc.load("mvc").AppBase)
/src/packages/mvc/AppBase.lua
中定义了一个AppBase
基类,作为所有Quick
游戏的Lua
入口,由player
新建的工程,有个app/MyApp.lua
文件就是继承自AppBase
类。
AppBase
功能类似于iOS
工程中的AppDelegate.m
实现的功能:
- 程序前后台切换事件的接收和分发
- 为
framework
提供程序退出接口 - 提供创建
scene
与view
的接口,并约定其存放路径。