【cocos2d】从 cocos2d-x 到 quick

安装 quick

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,点击新建项目,设置项目路径和包名即可

【cocos2d】从 cocos2d-x 到 quick_第1张图片

项目的目录结构

|-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 工作目录和运行参数

  • lua scripts folder 是我们项目的源代码路径,一般是 %PROJECT%\src
  • lua exe path 设置成 player.exe 的路径,一般是 %QUICK_ROOT%\quick\player\win32\player.exe
  • working path 是 lua exe 的工作目录,设置完 lua exe path 后会自动填充 working path
  • command line 设置运行参数,-workdir 设置项目的工作目录,-file 设置启动文件,一般是 main.lua

设置完成后保存解决方案,按 F5 就可以直接运行游戏,还可以断点调试。

quick 项目框架

接下来我们使用断点调试来看看我们的游戏从哪里开始执行,如何进到场景以及场景的结构和调用方式。

首先,游戏从 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 方法。

你可能感兴趣的:(cocos2d-x)