场景图(Scene Graph)是一种安排场景内对象的数据结构,它把场景内所有的 节点(Node) 都包含在一个 树(tree) 上。(场景图虽然叫做"图",但实际使用一个树结构来表示)。
虽然场景图是一个树结构,你就能遍历它,Cocos2d-x 使用 中序遍历
,先遍历左子树,然后根节点,最后是右子树。
z-order 为负的元素,z-order 为负的节点会被放置在左子树,非负的节点会被放在右子树。实际开发的过程中,你可以按照任意顺序添加对象,他们会按照你指定的 z-order 自动排序。
渲染时 z-order
值大的节点对象会后绘制,值小的节点对象先绘制。如果两个节点对象的绘制范围有重叠,z-order
值大的可能会覆盖 z-order
值小的。
上面说到的场景树是包含了场景内的所有节点,这里不得不说到层(Layer),Layer类也继承自node,所以层也是场景内的节点,只是不一定像其他节点对象如精灵/障碍物/菜单这些直接显示出来可以看到,它更像一个逻辑上的父容器,起到当前层包含某些对象的作用,下一层又包含其他对象,这样就区分了两个层上面的对象的事件响应顺序和渲染顺序。
场景是层的容器,一个游戏场景可以包含许多层(Layer),在层中我们可以加入游戏的一些元素,构成丰富的游戏世界,。比如游戏中的文本标签或者其他人物,怪物等游戏元素都是被层包含,另外在层中我们可以设置游戏元素的属性,比如玩家位置,方向和大小;设置游戏元素的动作,跳、跑、蹲等。
层中最常见的就是触摸监听事件,还有对应的触摸函数。
auto red = LayerColor::create(Color4B(255, 0, 0, 255));//RGBA 颜色数据(红)
red->setContentSize(CCSizeMake(120, 80));//设置大小
red->setPosition(Vec2(50, 100));//设置坐标
addChild(red, 10);//添加到场景并设置绘制层的顺序
auto green = LayerColor::create(Color4B(0, 255,0, 255));//RGBA 颜色数据(绿)
green->setContentSize(CCSizeMake(120, 80));//设置大小
green->setPosition(Vec2(100, 150));//设置坐标
addChild(green, 30);//添加到场景并设置绘制层的顺序
auto blue = LayerColor::create(Color4B(0, 0, 255, 255));//RGBA 颜色数据(蓝)
blue->setContentSize(CCSizeMake(120, 80));//设置大小
blue->setPosition(Vec2(150, 200));//设置坐标
addChild(blue, 20);//添加到场景并设置绘制层的顺序
通过三个图层的创建,我们可以了解到addchild的第二个参数,默认省略参数值为0,数字越大表示该层在最后加载(在最高一层),也就是在最上层显示,也就是最后绘制,所以绘制优先级低。一般背景层的参数值最小,最先绘制。相对而言,参数值越大表示越先被触摸,触摸优先级越大。 结合最开始场景树的概念,这里层的加载顺序和渲染顺序其实就是场景树节点的z-order值大小顺序,数值大的后渲染,所以覆盖了有重叠的先渲染的节点对象,所以按这逻辑也正好符合数值越大的层(其实就是节点)先被触摸先响应事件。
大部分转自:https://www.byjth.com/biji/25.html