游戏一般有多个场景,场景之间涉及切换的问题,怎么样才能使这些场景之间更好地过渡呢?有很多的图片、序列帧、粒子特效等资源,怎么来管理它们?一个场景由多个元素组成,既包括角色、文字对白和菜单按钮等,又包括声音、动画等特效,使用什么类来表现游戏中的这些元素呢?
本章围绕 Cocos2d-x 引擎中的一些基础知识点和常用类来讲解,其中包括超级管理类Director、场景类Scene、层类Layer、精灵类Sprite、菜单类Menu等,为了讲解方便,又把它们分成几个部分,具体如图2-1所示。
图2-1 基础类结构
Director 类管理游戏中的多个场景,一个场景中又包括多个元素,对于这些元素的组织,引擎提供的组织方式如图2-2所示。
从图 2-2 中可以看出,一个场景中可以包括多个 Layer,而一个 Layer 中又可以包括多个Sprite、Menu和Label等,通过把这些元素有序地组织起来,形成游戏中的一个场景。
逻辑上,可以按照图 2-2 中的方式组织场景中的元素,但是,由于这些类都继承自Node 类,所以在元素的组织上,我们也可以把一个 Sprite 节点直接加入到 Scene 中,Label也可以作为Sprite的子节点。
场景元素的组织原则是,一般按照图中的方式来组织它们,这样使场景层次结构更加清晰。但是,有时根据实际的需要,也可以改变这种组织方式。
Cocos2d-x 使用场景图的方式组织这些元素,实际上是使用树的数据结构,通过节点的Z-Order排列。当Z-Order小于0时,作为左节点加入,否则为右节点。父节点通过Z-Order值排列子节点,而当子节点的 Z-Order 值相同时,则先加入的节点排在前面。例如,在一个场景中加入4个子节点A、B、C和D,实现如程序片段2-1所示。
通过上面的代码,引擎为我们构建如图2-3所示的场景。
程序片段2-1 场景中加入节点
图2-2 场景元素组织
图2-3 场景图
A节点的Z-order值为-2,为场景根节点的左节点,而B节点的Z-order值为-1时,为场景左节点的第二个子节点,C和D节点的Z-order值相同,而C节点先加入,所以C节点作为右节点第一个子节点,D作为右节点的第二个子节点,当在调用addChild函数没有设置Z-order值时,默认为0,作为场景图的右节点加入。
场景图在遍历树中各个节点时,使用的是 in-order(中序遍历)算法,即先遍历左节点,然后根节点,最后才是右节点。所以,对于图 2-3 中的遍历结果是 A、B、Node、C、D。由于A节点先于其他节点渲染,所以当这4个节点有重叠时,最后看到显示在最上面的节点是D。