Quick-Cocos2d-x初学者游戏教程(三) ---------------------------- 解析quick新建项目的代码文件

Quick-Cocos2d-x初学者游戏教程(三)

2、main.lua

在src目录下,除了 config.lua 文件外,还有一个 main.lua 文件,这个 main.lua 是 Quick 项目的通用入口文件,它类似于 Cocos2d-x 中的 AppDelegate.h/cpp 文件,同时也类似于一般 Windows 工程中的 main 文件。

打开 main.lua 文件,其内容如下所示:


1

2

3

4

5

6

7

8

9

10

function __G__TRACKBACK__(errorMessage)

    print("----------------------------------------")

    print("LUA ERROR: " .. tostring(errorMessage) .. "\n")

    print(debug.traceback("", 2))

    print("----------------------------------------")

end

package.path = package.path .. ";src/"

cc.FileUtils:getInstance():setPopupNotify(false)

require("app.MyApp").new():run()

每个新项目的 main.lua 文件内容都是一样的,一般情况下,我们不需要改动它。
我们只需要知道,main 文件的最后一行代码中通过载入的 app.MyApp 模块创建了一个 MyApp 实例,并且还调用执行了该 MyApp
实例的 run 方法。这行代码将启动并执行 MyApp 脚本。从此处我们也可以看出,main.lua 文件是应用程序 lua 脚本的启动文件。

require 方法表示引入一个文件,使用 require 方法加载文件的过程会检查文件的 lua 语法,同时会完成被加载文件内部变量的初始化。

3、MyApp.lua

main.lua 文件启动执行 MyApp 脚本后,接下来我们就来看看“src/app”目录下的 MyApp.lua 文件,该文件将启动游戏场景,其代码段如下所示:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

-- 1

require("config")

require("cocos.init")

require("framework.init")

-- 2

local MyApp = class("MyApp", cc.mvc.AppBase)

-- 3

function MyApp:ctor()

    MyApp.super.ctor(self)

end

-- 4

function MyApp:run()

    cc.FileUtils:getInstance():addSearchPath("res/")

    cc.Director:getInstance():setContentScaleFactor( 640/CONFIG_SCREEN_HEIGHT )

    self:enterScene("MainScene")

end

return MyApp

我们依次来看以上各代码行的含义:

  1. 使用 require 方法载入配置、cocos 以及 Quick 框架。这些是每个 Quick 程序都必须要加载的。
  2. 使用 class 函数定义一个 MyApp 类。
    class 方法本身是 Quick 框架中定义的一个用于创建自定义 lua 类的函数,该函数可在 Quick 引擎的
    “quick/framework/functions.lua” 文件中找到。当然,如果你听了我的话,在 Sublime 下安装了
    QuickDev 插件,那么你也可以在 class 字符上单击右键,跳转到它的定义(Goto Definition),这样也能找到它。


    在 “functions.lua” 中,function class(classname, super)函数有两个参数,其中 classname 表示的是类名,super 表示的是父类或者创建对象实例的函数。当 super 传入的参数是前者时,将会以传入的对象为父类派生新类,如本处;当传入的参数为后者时,会以传入的函数作为构造函数创建新类,如稍后要讲解的 MainScene 类。
    从本段代码中我们可以看到,MyApp 这个类是从 cc.mvc.AppBase 中继承而来的,而 AppBase 是 Quick 中自带的一个
    MVC(面向对象的一种设计模式)的应用程序基础类,这个类为我们的应用程序提供了一些逻辑控制上的功能,比如进入场景,切换场景等等。

  3. MyApp 的ctor()函数相当于 C++
    中的构造(constructor)函数,以及init()函数。所以我们一般会在ctor()函数中初始化我们的游戏数据和信息,每当调用
    XXClass.new() 创建对象实例时,也会自动执行ctor()函数。
    另外,在子类的ctor函数中必须手动调用父类的构造函数,这样才等保证子类能“继承”父类的属性和方法,正如上段代码所示。其中 XXClass.super 可以访问指定 XXClass 类的父类。
  4. 在 MyApp 的 run 方法中,这里做了三件事:
    • 首先,通过 addSearchPath 方法设置资源搜索路径。这也是为什么资源一定要放在“res”目录下的原因。
    • 然后,通过 setContentScaleFactor 方法设置资源缩放因子,这行代码是我们在上章进行分辨率适配时自己添加的。
    • 最后,因为 MyApp 类继承于 AppBase 类,因此自然地,MyApp 也同父类一样,具备了些许逻辑控制的功能。所以在 run 方法的最后,程序调用 enterScene 函数进入到名为 “MainScene” 的游戏场景。
      当然我们也可以在 enterScene 函数中设置场景切换的动画,不过为了加深大家对场景切换的印象,我们还是留到后面使用的时候再做详细的讲解。

      注意:游戏场景默认必须放在 “src/app/scenes” 目录下,放到其他目录下是不能找到的。

4、MainScene.lua

讲的这里,大家应该很清楚 main 文件执行 require("app.MyApp").new():run() 代码的过程了吧。所以,接下来请大家打开“src/app/scenes”目录下的 MainScene.lua 文件,我们接着来看它的结构。其代码如下图所示:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

local MainScene = class("MainScene", function()

    return display.newScene("MainScene")

end)

function MainScene:ctor()

    cc.ui.UILabel.new({

            UILabelType = 2, text = "Hello, World", size = 64})

        :align(display.CENTER, display.cx, display.cy)

        :addTo(self)

end

function MainScene:onEnter()

end

function MainScene:onExit()

end

return MainScene

在 MainScene.lua 这个文件中,第一行代码使用 class 函数创建了一个 MainScene 场景类,同前边创建 MyApp 类不同的是,这里我们的类不是从基础类继承而来,而是通过一个函数创建出来的。

这是因为 Scene 场景对象必须是一个 C++ 的对象,而 C++ 的对象是无法直接派生出 Lua 的类的,所以我们只有用一个函数把它创建出来,然后再为它添加相应的方法。

在创建场景的函数段里,display.newScene() 方法将创建了一个新场景,并返回该 Scene 场景对象。

这里的 display 是一个重要的概念,在 Quick 中,display 模块封装了绝大部分与显示有关的功能,并负责根据
config.lua 中定义的分辨率设定计算屏幕的设计分辨率。display
模块提供了众多的方法和属性,比如创建层(display.newLayer),创建精灵(display.newSprite),以及恢复暂停切换场景
等等。

总而言之,display 是个很值得我们细细探索的模块。关于它更多详情内容可参见Quick-Cocos2d-x的API文档

下面我们例举一些 display 常用的属性:

  • display.widthInPixels, display.heightInPixels: 屏幕分辨率的宽、高
  • display.width, display.height: 设计分辨率的宽、高
  • display.cx, display.cy: 设计分辨率中央的 x、y 坐标
  • display.left, display.top, display.right, display.bottom: 设计分辨率四边的坐标
  • display.c_left, display.c_top, display.c_right, display.c_bottom: 当父对象在屏幕中央时,屏幕四边的坐标
  • display.contentScaleFactor: 设计分辨率到屏幕分辨率的缩放因子,不同于内容缩放因子。

结合 display 模块提供的常量,我们可以很方便的获取屏幕的某些与现实相关的属性,如位置和颜色等等。display
模块中关于位置的常量是初始化的时候程序就已经计算好的(不信你可以查看控制台窗口中的打印信息),它们根据分辨率的不同而不同。

MainScene 的 ctor 函数中默认添加了一个 UI 标签,这个标签的作用是在屏幕正中间添加一个“Hello World”的文本,并显示到屏幕上。

其中 cc.ui 模块中封装了大量符合脚本风格的 Cocos2d-x 控件,包含 UILabel、UIImage、UISlider 等等。所以正如上述代码一样,我们可以通过调用cc.ui.UILabel.new()来实例化一个新的 UILabel 控件。其先有参数分别表示:

  • UILabelType:创建文本对象所使用的方式。
    1 表示使用位图字体创建文本显示对象,返回对象是 LabelBMFont。
    2 表示使用 TTF 字体创建文字显示对象,返回对象是 Label。
  • text:要显示的文本。
  • size:文字尺寸。

创建好 UILabel 后,通过调用 align 方法设置文本的锚点和显示位置。最后用 addTo 方法把文本添加到场景中。

至于 MainScene 的 onEnter 和 onExit 两个方法,清楚 Cocos2d-x
原理的的童鞋应该很容易理解。其中onEnter 方法是在进入场景的时候调用的,我们可以在这里做一些初始化的工作;而 onExit
方法是在退出场景的时候调用的,在这里我们可以释放资源,重置变量。

小结

到现在为止,我们就已经解析完 src 目录下所有的 lua 文件了,总的来说,这两章所解析的 lua 文件的关系和用途如下图所示:

好了,上图把这两章讲解的废话都概括完了,我想应该够清楚明了的吧!! O(∩_∩)O~,从下章开始,我们将正式开始类el游戏的开发。

时间: 2024-12-23 10:25:10

Quick-Cocos2d-x初学者游戏教程(三) ---------------------------- 解析quick新建项目的代码文件的相关文章

Quick-Cocos2d-x初学者游戏教程(二) -------------------- Quick内部的代码结构及相应的原理

Quick-Cocos2d-x初学者游戏教程(二) 上一章我们已经了解了Quick的一些基础知识,所以本章我们将开始深入到Quick内部,了解它内部的代码结构,同时在解析的过程中学到相应的原理,并学会如何修改.添加相应的代码文件,比如实现屏幕的分辨率适配. 前面我们创建了一个叫做parkour的游戏项目,其意思就是本人本来打算要做一个跑酷游戏的,但是因为这几天玩了一款叫做<el>的飞行游戏,非常有意境,并且几乎零差评,所以请允许我任性一下,善变的我不想做跑酷游戏了,而是想要挑战下这种类型的游戏

Quick-Cocos2d-x初学者游戏教程(一)--------------------Quick的一些基础知识

本文转自Quick-Cocos2d-x初学者游戏教程(一) 前言 虽然之前已经写过了很多 Cocos2d-x 相关的教程和文档,但本次却是我第一次接触 Quick,第一次接触 Lua,所以此次的教程本人将站在一个初学者的角度(看到这里是不是想白眼我了,哈哈,别切啊!尽管第一次,但我身边可是有很多 Quick 大神的,廖大大也在旁边办公室,没准撒个娇大神就把他知道的全部要点倾囊相授了啦!),全方位的解析 Quick 的学习过程,并同大家一起学习如何利用 Quick-Cocos2d-x 开发一款属于

Quick-Cocos2d-x初学者游戏教程(五) --------------------- 辅助工具和跳转场景

Quick-Cocos2d-x初学者游戏教程(五) 上一章我们创建了游戏的菜单场景,并讲解了一些基础元素的创建,接下来这章,我们会先让大家了解一些接下来游戏开发中需要用到的辅助工具,然后再教大家创建另一个游戏场景,并跳着到该场景中来. 工具介绍 在开始真真的写代码之前,其实早该讲讲以下这些辅助工具的.这些工具可以让我们更好更方便的实现程序中的某些功能,比如地图编辑工具.粒子编辑工具 等.尽管这些工具在我之前的教程中已经不厌其烦的讲了好多次了,但是为了做到真正的初学者教程,本小节还是先来简单的介绍

Quick-Cocos2d-x初学者游戏教程(十一) ------------------ 物体碰撞检测

Quick-Cocos2d-x初学者游戏教程(十一) 本章主要讲解物体碰撞检测之间的原理,以及具体的实现方法. 碰撞检测 本游戏使用物理引擎的一个重要目的是为了让碰撞检测更方便,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高. 在 Quick 3.3final 版本中,所有事件均有事件派发器统一管理,物理引擎的碰撞事件也不例外.它由 cc.EventListenerPhysicsContact 的实例来监听. 监听事件分类 碰撞监听事件有以下几种: cc.Handler.EVENT_P

Quick-Cocos2d-x初学者游戏教程(十三) ---------- 完善游戏功能

Quick-Cocos2d-x初学者游戏教程(十三) 本章将是本教程的最后一章,在这章我们将完善游戏功能,即给游戏添加粒子特效,音乐音效,和玩家的受伤动画等等. 添加受伤动画 首先,我们来添加玩家受伤动画. 玩家受伤动画是 Player 与障碍物或地面碰撞的时候播放的一个动画效果,它是一个独立的帧动画,帧序列图片如下: PS:该动画添加到玩家上是非常丑的,所以如果各位有更好地资源可以不用它.我的美术御用妹子前两周出车祸把手伤了,没人给我画,所以才迫不得已找了这个丑图来替代,看不下去的见谅! 我们

Quick-Cocos2d-x初学者游戏教程(八)----------------- 物理引擎和角色

Quick-Cocos2d-x初学者游戏教程(八) 续上章载入 TiledMap 背景后,接下来的这章我们将开始引入物理引擎相关的东西,并且会开始创建我们的游戏角色.游戏地图中各类障碍物和奖励品的创建则会留到下一章. 构建物理世界 首先,物理引擎是干什么的应该不用我说吧?好吧,还是说一下(百度的):物理引擎通过为刚性物体赋予真实的物理属性的方式来计算运动.旋转和碰撞反映.所以用它来模拟真实世界的飞行.掉落等功能是具有得天独厚的优势的,这也是为什么我们的游戏要使用它的原因. 然后,我们要怎样使用物

Quick-Cocos2d-x初学者游戏教程(四) --------------- 开发初探(添加背景,标题,动作,按钮)

Quick-Cocos2d-x初学者游戏教程(四) 前面我们已经大概的讲解完了Quick的框架和代码结构,接下来,本章开始我们将正式进入到游戏的开发.当然在开发的过程中,如果遇到值得一提的知识点和概念,我们还是会为大家详细讲解的. 哈哈,这章的内容我加它为——开发初探,因为我们将先来实现一些基础的内容.本章将实现的效果如下图所示: 菜单场景 从前面章节讲解的的知识点中,我们知道每个新建的 Quick 项目里都已经默认创建好了一个 mainScene 场景,所以下面我们将利用这个现成的场景,把它改

Quick-Cocos2d-x初学者游戏教程(六) --------------------- 游戏逻辑

Quick-Cocos2d-x初学者游戏教程(六) 上一章我 们介绍了开发中会用到的辅助工具,并创建了 GameScene 场景,接下来这章我们将继续 GameScene 的传(bai)奇(bi).不过在开始编写 GameScene 场景的代码之前,我们还是先来明确一下游戏的功能和实现方法.这样可以帮我们更好的理解并设计逻辑.下面是总结出的结论: 在 GameScene 场景中,我们将创建一个飞行的娃娃角色,这个角色是游戏的唯一主角.游戏初始状态下,这个角色有满满的生命值,但随着时间的推移,生命

Quick-Cocos2d-x初学者游戏教程(十) ---------------- 添加游戏障碍物

Quick-Cocos2d-x初学者游戏教程(十) 在我们的游戏中,我们除了添加奖励品外,还需要添加一些必要的障碍物来丰富游戏逻辑,增加游戏难度,所以本章我们将继续上章的内容——添加游戏障碍物.游戏中,障碍物是不止一种,这里有飞行的鸟,有上下移动的飞艇. 创建障碍物-飞艇 其实创建飞艇的逻辑和前面创建心心的逻辑是一样的,只不过这里我想让飞艇不停的上下移动,一方面做点带感的效果出来,另一方面也可以增加游戏难度. 看过之前教程的童鞋,现在应该懂得怎样创建这样的一个飞艇了吧.所以下面我们直接给出它的定