2.player走起
安装好Quick之后,我们先来开启player跑跑看,初窥一下Quick,也正好验证一下环境变量的配置是否争取了。
上面已经提到了安装完成后player所在的位置,毫不犹豫的点击运行,如果一切顺利,player就顺利启动了,点击示例标签你会看到如下界面:
这里包含了Quick提供的一些示例项目,单击某个示例将会启动一个新的player打开所选示例。你会看到新启动的player带了一个控制台窗口。这个控制台窗口是player的输出窗口,包括你打印的日志以及崩溃日志都会出现在这里,所以,一开始遇到bug,请同学们先去看看控制台里面是否有啥不正常的打印内容,即为报错内容,如果你要问问题,这个报错信息是很关键的!
3.Quick的基本目录结构
好了,player已经跑起来了,被太兴奋,先把player放着就是了,我们来看看Quick的基本目录结构。
打开Quick根目录,我们一个一个说:
-
build:build目录是Cocos2d-x的项目存放目录,可以不鸟
-
cocos:这是Cocos2d-x的主目录,核心代码基本都在这里了
-
docs:这个是Quick的文档目录,至于都有啥文档,自己去瞧瞧
-
extensions:这是cocos的一些扩展内容所在的目录,也可以先不鸟
-
external:同样是扩展内容,也先不鸟
-
licenses:这个就不说了
-
quick:这个是Quick的核心目录了,后面会详细介绍
-
tools:这里放的东东是用来做luabinding的工具,你肯定会用到,但现在还用不到,系列后面会有专门讲如何使用工具来导出自己定义的C++类
好了,目录结构就介绍完了,除了Quick目录,其他的目录你可以都先不鸟了,所以我们下面重点说下Quick目录。
进入Quick目录,内容如下:
-
bin:这里存放的基本都是Quick的工具脚本,包括binding脚本,加密脚本等,每个工具的使用以后会在用到的时候详细讲
-
cocos:这里存放的一大堆lua文件,绝大多数都是C++那边定义的一些常量以及一些封装的接口
-
framework:这个就是Quick框架的核心目录了,你后面基本都是在跟framework打交道
-
lib:这里放的是Quick的一些库
-
player:这里放的是player的工程文件,你可以在这里打开player的工程项目,对player进行修改,对于小白,就先算了,知道这事就好
-
samples:这里放着的是Quick示例的代码
-
templates:这里是Quick的项目模板,知道就行
-
welcome:这里是player启动界面的代码,也就是你打开player看到的第一个界面就是从这里加载构建的
以上就是Quick目录的基本内容,罗里吧嗦一大堆,估计你都迷糊了,别怕,现在开始,你只需要关注smpales和framework这两个目录,这将会是你Quick起飞的地方!
4.Quick的入门
Quick如何入门?其实很简单,打开player,跑示例,然后看代码,然后创建自己的项目,在项目里使用消化的示例内容来做一些自己的内容。
我们实际来做一下吧:
A.打开player,切换到示例,打开TOUCH示例
正常运行如上图,用鼠标在白色区域点点拖拖你会看到相应的变化。
你现在肯定想问代码在哪里呢?还记得前面提到的sample目录么?对的,现在就打开samples/touch/src/app/scenes/TestSingleTouche1Scene.lua
这里面就是上面的场景的构建代码了,代码中都有相关注释,对照player表现的内容,浏览代码,了解每行代码的意义。
Quick的入门也就大致如此了,如果这样你还不知道咋玩,那我只能说,哥们,别完了,去蓝翔吧,会比你写代码有前途!
开个玩笑,其实Quick已经让我们的开发很简单了,顺便调侃一下,前两天群里有个哥们说他正在做个不用写代码就可以做任何游戏的平台,你也可以期待一下!
Quick小白书系列(四)Quick中的Scene
Quick小白书系列(三)MyApp详解
Quick-Cocos2d-x 3.3中的CCStore使用说明
天我们来讲解Quick中的Scene,也就是场景,场景是构成一个游戏的基本概念。场景简单地理解就是一个舞台,你构建一个场景之后,就可以在场景上添加你的游戏元素了!
我们就以一个新建项目中得MainScene来逐步讲解Scene!
1. 打开你项目的MainScene,我们先来看最上面的MainScene的定义,代码如下:
1
2
3
|
localMainScene=
class
(
"MainScene"
,function()
return
display.newScene(
"MainScene"
)
end)
|
这片代码的意思就是定义一个名为MainScene的场景类,并赋值给local变量MainScene。为什么要赋值给一个local变量呢?我们后面会揭晓!
那么display.newScene方法是在哪里定义的呢?在src/framework/display.lua中:
1
2
3
4
5
6
7
|
functiondisplay.newScene(name)
localscene=cc.Scene:create()
scene:setNodeEventEnabled(
true
)
scene:setAutoCleanupEnabled()
scene.name=nameor
"<unknown-scene>"
return
scene
end
|
2.Scene的构造函数ctor
接着往下看你回看到MainScene的构造函数,如下:
1
2
3
4
5
6
|
functionMainScene:ctor()
cc.ui.UILabel.
new
({
UILabelType=2,text=
"Hello,World"
,size=64})
:align(display.CENTER,display.cx,display.cy)
:addTo(self)
end
|
ctor函数就是MainScene的构造函数,在这里,你可以对MainScene做初始化,比如上面的代码就是在场景中添加一个label,显示helloworld,总之可以做的事情so many!以后再论吧!
构造函数ctor在何时调用?看过上一篇文章的应该知道了,在你对一个Scene调用new来实例化的时候会调用,不晓得的童鞋就去看下上一篇文章就知道了!
3.Scene的一些方法
再往下看你回看到两个方法的定义:
1
2
3
4
5
|
functionMainScene:onEnter()
end
functionMainScene:onExit()
end
|
用过Cocos2d-x的C++版本的童鞋应该很熟悉这两个方法,onEnter方法是在进入场景的时候调用,onExit方法是在退出场景的时候调用,在C++中是通过重写父类方法产生作用的。那么在quick中是如何起作用的呢?我们来一步一步的找答案:
A. 在上面定义MainScene的时候我们说到调用了display.newScene方法,翻看上面的代码你回看到display.newScene方法中有这样一句:
1
|
scene:setNodeEventEnabled(
true
);
|
这句代码的意思是开启scene的node事件
B. 继续扒,打开src/framework/cocos2dx/NodeEx.lua,找到function Node:setNodeEventEnabled(enabled,listener)
代码太长,我就不贴了。首先NodeEx.lua中都是定义了一些对Node进行扩展的函数,因为Scene在底层是继承自Node的,所以对Node的这些扩展同样可以被Scene调用。
C. 再扒,看Node:setNodeEventEnabled中的这段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
if
notlistenerthen
listener=function(event)
localname=event.name
if
name==
"enter"
then
self:onEnter()
elseifname==
"exit"
then
self:onExit()
elseifname==
"enterTransitionFinish"
then
self:onEnterTransitionFinish()
elseifname==
"exitTransitionStart"
then
self:onExitTransitionStart()
elseifname==
"cleanup"
then
self:onCleanup()
end
end
end
|
这片代码在你们使用Node:setNodeEventEnabled的时候只传入第一个bool参数时,会向底层注册一些默认调用的函数,从而让你在自己的Scene中定义的onEnter等方法可以被调用。
常用的就是onEnter和onExit,一个是在进入场景的时候调用,你可以在这里做一些初始化的事情,个人更建议初始化的事情在ctor里做。而onExit就是在场景退出的时候调用,在这里你可以做一些清理工作,比如释放某些不用的资源,重置某些变量等。
至此,该扒的就都扒完了,至于更深层地的底层的东西,在你能熟练应用之后再去查看会更有收获!
4.最后的返回值
MainScene的最后一行是一个return MainScene语句,意思就是返回最上面定义的那个local MainScene。为何要写这一句呢?
当你在想要引用这个MainScene的时候,你需要这样写:
1
|
localMainScene=require(
"app.scenes.MainScene"
);
|
这样就把你定义的MainScene类返回给了前面的local变量MainScene。之后,你就可以调用MainScene.new()来实例化一个场景,然后调用display.replaceScene来切换到你实例化的这个新场景。
当然,看过前面的文章的童鞋就知道有更方便的方法,直接调用app:enterScene("MainScene")来进入一个新场景,因为app:enterScene方法帮你完成了场景的实例化等。
好了,现在你可以去构建一个属于自己的场景了,如MyScene
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
localMyScene=
class
(
"MyScene"
,function()
return
display.newScene(
"MyScene"
)
end)
functionMyScene:ctor()
cc.ui.UILabel.
new
({
UILabelType=2,MyScene"
,size=64})
:align(display.CENTER,display.cy)
:addTo(self)
end
functionMyScene:onEnter()
end
functionMyScene:onExit()
end
return
MyScene
|