quick 是对 cocos2d-x lua 版本的一次再次封装,cocos2d-x 中的东西到了 quick 上面基本都能用。这篇文章主要讲从 cocos2d-x 转到 quick 需要注意的一些东西。
首先,下载安装 quick
下载地址
https://github.com/u0u0/Quick-Cocos2dx-Community
目前最新版本是 quick3.7,这个版本是一次大更新,把很多模块都移除掉了,进行了一次简化。主要的目录结构
|-quick3.7
|-build
|-cocos
|-external
|-quick
|-setup_win.bat
|-setup_mac.sh
windows 下双击 setup_win.bat 就可以完成安装,主要是添加环境变量和创建 player.exe 桌面快捷方式。
打开 player.exe,点击新建项目,设置项目路径和包名即可
项目的目录结构
|-project
|-frameworks
|-res
|-src
可以看到目录结构非常简单,res 保存资源,src 保存代码。运行游戏需要 player.exe,打开 player,选中我们的项目,然后点击打开项目就可以运行了。这种方式不仅麻烦,而且不能调试。
我们可以使用 visual studio code,sublime text 等主流编辑器来写代码,然后打开 player.exe 运行我们的游戏。一种比较好的方式是使用 visual studio+babelua,既能够使用 IDE 直接运行,还可以断点调试,而且有代码提示功能。
下载安装完 babelua 插件后,点击 lua–>new lua project
然后设置源代码路径,lua 解释器路径,lua 工作目录和运行参数
设置完成后保存解决方案,按 F5 就可以直接运行游戏,还可以断点调试。
接下来我们使用断点调试来看看我们的游戏从哪里开始执行,如何进到场景以及场景的结构和调用方式。
首先,游戏从 main.lua 开始执行
require("app.MyApp").new():run()
这里创建一个 Application 实例然后调用 run 函数开始执行
local AppBase = require("framework.AppBase")
local MyApp = class("MyApp", AppBase)
function MyApp:ctor()
MyApp.super.ctor(self)
end
function MyApp:run()
cc.FileUtils:getInstance():addSearchPath("res/")
self:enterScene("MainScene")
end
return MyApp
MyApp 继承自 AppBase,AppBase 在 framework 中定义;这里使用到 class 关键字,这是原生 lua 没有的,class 函数在 framework/function.lua 中定义,这个文件提供了一组函数,用于扩展 lua 标准库。class 封装一个类的实现,其创建的类默认有一个 new 方法,在 new 方法中创建一个实例并给实例添加一个 ctor 方法,完成实例的初始化工作。new 方法相当于类的工厂方法,而 ctor 则是构造方法。所以 require("app.MyApp").new():run()
的执行过程如下
* 执行 MyApp 的 new 方法,创建一个实例 MyApp
* 执行 MyApp 的 ctor,再调用 AppBase 的 ctor 方法,完成 MyApp 的初始化工作
* 执行 MyApp 的 run 方法
在 MyApp 的 run 方法中调用 enterScene 方法,开始加载第一个场景。enterScene 方法在 AppBase 中定义
function AppBase:enterScene(sceneName, transitionType, time, more, ...)
local scenePackageName = "app.scenes." .. sceneName
local sceneClass = require(scenePackageName)
local scene = sceneClass.new(...)
display.replaceScene(scene, transitionType, time, more)
end
先根据场景名 require 相应的 lua 文件,然后调用 new 方法创建一个场景实例,new 方法会调用场景类的构造方法 ctor,完成初始化工作。创建完场景后调用 display.replaceScene 来替换当前运行的场景。
一个场景的 ctor 方法在什么时候调用?使用 new 创建场景实例的时候。
什么时候创建场景实例?使用 enterScene 切换场景的时候。
从哪里调用 enterScene?在 MyApp(AppBase) 中。
所以在一个场景中切换场景的写法是
app:enterScene("GameScene");
app 是一个全局变量,它的值在 AppBase.ctor 中初始化。
分析完 AppBase 和 MyApp 类,我们再来分析下场景类的写法
local MainScene = class("MainScene", function()
return display.newScene("MainScene")
end )
同样使用 class 方法来定义一个类,要使这个类是一个场景类,则必须让它继承 cc.scene;这里使用 display.newScene()
创建一个类作为场景的父类
function display.newScene(name)
local scene = cc.Scene:create()
scene.name = name or ""
scene:setNodeEventEnabled(true)
return scene
end
默认场景类会有 ctor,onEnter 和 onExit 三个函数
function MainScene:ctor()
end
function MainScene:onEnter()
end
function MainScene:onExit()
end
ctor 讲过了,调用 new 方法创建一个场景实例时会调用。onEnter 和 onExit 是结点事件,在 framework/NodeEx.lua 中定义
function Node:setNodeEventEnabled(enabled)
if enabled then
local listener = function(event)
local name = event.name
if name == "enter" then
self:onEnter()
elseif name == "exit" then
self:onExit()
elseif name == "enterTransitionFinish" then
self:onEnterTransitionFinish()
elseif name == "exitTransitionStart" then
self:onExitTransitionStart()
elseif name == "cleanup" then
self:onCleanup()
end
end
self:addNodeEventListener(c.NODE_EVENT, listener)
else
self:removeNodeEventListener(c.NODE_EVENT)
end
return self
end
进入场景时会调用 onEnter 方法,离开场景时会调用 onExit 方法。