Quick小白书系列(四)Quick中的Scene

今天我们来讲解Quick中的Scene,也就是场景,场景是构成一个游戏的基本概念。场景简单地理解就是一个舞台,你构建一个场景之后,就可以在场景上添加你的游戏元素了!


我们就以一个新建项目中得MainScene来逐步讲解Scene!


1. 打开你项目的MainScene,我们先来看最上面的MainScene的定义,代码如下:

1
2
3
local MainScene =  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
function display.newScene(name)
     local scene = cc.Scene:create()
     scene:setNodeEventEnabled( true )
     scene:setAutoCleanupEnabled()
     scene.name = name or  "<unknown-scene>"
     return  scene
end

这片代码会调用底层代码来创建一个Scene。


2.Scene的构造函数ctor

接着往下看你回看到MainScene的构造函数,如下:

1
2
3
4
5
6
function MainScene: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
function MainScene:onEnter()
end
  
function MainScene: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  not listener then
             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
         end

这片代码在你们使用Node:setNodeEventEnabled的时候只传入第一个bool参数时,会向底层注册一些默认调用的函数,从而让你在自己的Scene中定义的onEnter等方法可以被调用。


他默认都注册了哪些方法呢?你自己数下喽!


常用的就是onEnter和onExit,一个是在进入场景的时候调用,你可以在这里做一些初始化的事情,个人更建议初始化的事情在ctor里做。而onExit就是在场景退出的时候调用,在这里你可以做一些清理工作,比如释放某些不用的资源,重置某些变量等。


至此,该扒的就都扒完了,至于更深层地的底层的东西,在你能熟练应用之后再去查看会更有收获!


4.最后的返回值

MainScene的最后一行是一个return MainScene语句,意思就是返回最上面定义的那个local MainScene。为何要写这一句呢?

当你在想要引用这个MainScene的时候,你需要这样写:

1
local MainScene  = 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
local MyScene =  class ( "MyScene" , function()
     return  display.newScene( "MyScene" )
end)
  
function MyScene:ctor()
     cc.ui.UILabel. new ({
             UILabelType = 2, text =  "Hello, My Scene" , size = 64})
         :align(display.CENTER, display.cx, display.cy)
         :addTo(self)
end
  
function MyScene:onEnter()
end
  
function MyScene:onExit()
end
  
return  MyScene

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值