Scene :场景


了解了Director 之后,接下来介绍 Scene 这个与它紧密相关的游戏组件。


通过之前的学习,我们已经了解了场景以及它在流程控制中的地位。




在 Cocos2d-x 中,Scene 定义了一个场景。场景仅仅是层的容器。包括了全部须要显示的游戏元素。


因此相对于其它游戏元素,Scene 并没有提供什么特别的功能,就是一个十分简单的类。


除了作为层的容器,场景的还有一个作用就是流程控制。


利用 Director::replaceScene 等方法,我们能够使游戏在不同的场景中自由切换。




游戏开发过程中。当我们须要完毕一个场景时。会创建一个 Scene 的子类,并在子类中实现我们须要的功能。


比如,我们能够在子类的初始化方法中加载游戏资源,为场景加入层。启动音乐播放,等等。


同一时候,场景之间可能也会须要一定的过渡衔接效果,否则,场景的切换会显得十分突兀。


Cocos2d-x 提供了非常多华丽的场景切换特效。比如翻页、波浪、淡出淡入等。


这些特效是通过派生自 Scene 的 TransitionScene 系列特效类来实现的。


TransitionScene。这个scene是用来在两个scene切换的时候。做中间的过渡变化的一个scene。


接口设计的很清晰、简便。


头文件在cocos\2d\CCTransition.h中;


当然,你也能够模仿 Cocos2d-x 内置的场景切换特效代码,来编写属于自己的特效。




Layer :层


Layer 定义了一个层。

与 Scene 类似,层也扮演着容器的角色。


然而与场景不同的是,层通常包括的是直接呈如今屏幕上的详细内容:


我们须要在层中放入精灵、文本标签或其它游戏元素;


设置游戏元素的属性。如位置、方向和大小;


设置游戏元素的动作等。




由此可见。游戏开发的大部分编码时间都用在创建层上。


通常,层中的对象功能类似。耦合较紧,与层中游戏内容相关的逻辑代码也编写在层内。




在组织好层后,仅仅须要把层依照顺序加入到场景中就能够显示出来了。


要向场景中加入层,我们能够使用 addChild 方法。




addChild 方法共同拥有三个定义,详细例如以下所看到的:

void addChild(Node* child);  //Adds a child to the container with z-order as 0.
void addChild(Node* child, int localZOrder);
void addChild(Node* child, int localZOrder, int tag);


当中 child 參数为将要加入的节点。


对于场景而言,通常我们加入的节点就是层。

先加入的层会被置于后加入的层之下。


假设想要为它们指定先后次序。能够使用不同的 localZOrder值,localZOrder代表了该节点下元素的先后次序。值越大则显示顺序越靠上。

localZOrder的默认值为 0。


tag 是元素的标识号码,假设为子节点设置了 tag 值,就能够在它的父节点中利用 tag 值找到它了。


这里我们能够选择自己须要的方法来向场景中加入层。




在之前的文章中提到的找小三游戏场景的构成中,找小三游戏的场景大致由背景层(backgroundLayer)、动作层


(actionLayer)、触摸层(touchLayer)和菜单层(menuLayer)组成。


如果这些层已经完毕,那么我们最后要做的就是在游戏场景的初始化方法中把它们加入到场景中:



this->addChild(backgroundLayer, 0);
this->addChild(actionLayer, 100);
this->addChild(touchLayer,200);
this->addChild(menuLayer, 300);


Layer 的还有一个十分重要的功能是能够接受用户输入事件。包含触摸、加速度计和键盘输入等。


在cocos2d-x 3.0曾经版本号,层与用户输入事件相关的成员如表所看到的。


14、Cocos2dx 3.0三,找一个小游戏开发Scene and Layer:游戏梦想_初始化方法




而在3.0版本号中。採用了事件分发的机制:



(1)在使用时,首先创建一个事件监听器。事件监听器包括下面几种:

触摸事件(EventListenerTouch)

键盘响应事件(EventListenerKeyboard)

加速记录事件(EventListenerAcceleration)

鼠标对应事件(EventListenerMouse)

自己定义事件(EventListenerCustom)

(2)以上事件监听器统一由_eventDispatcher来进行管理。它的工作须要三部分组成:

事件分发器 EventDispatcher

事件类型 EventTouch, EventKeyboard 等

事件监听器 EventListenerTouch, EventListenerKeyboard 等

(3)监听器实现了各种触发后的逻辑,在适当时候由事件分发器分发事件类型,然后调用对应类型的监听器