cocos2d-x游戏开发(十)执行单元场景CCScene
游戏逻辑其实就像拍摄一部电影,整个过程都由导演来驱动。
游戏中的一个一个关卡,一个一个场景都跟电影中类似。每一个场景都有一些特定的元素,比如林冲风雪山神庙这个场景,大环境就是一个大风雪的夜晚,一个银装素裹的破败山头,有一个破败的山神庙,当然还可以有一些其他的元素,比如火光,野狼,灯光, 乌鸦连声叫、黄狗大声吼等。这就是一个特定的场景了,呵呵。然后导演大叫一声:“Action!”,然后所有的故事情节就在这里展开,主角和一干配角上场了...
以上所有的元素就组成了这么一个场景,那么在游戏里又如何组织这些元素呢。先来看看cocos2d-x的场景处理流程。
cocos2d-x中的导演执行单元就是场景CCScene。一个场景又有那么多元素,比如一个大的背景,然后又有一些小元素,比如星星,火堆,狗等,又是如何加到场景里的呢。
可以这么说,一个场景就是一个特别的容器(其实就是一个CCNode),它能容纳各类节点(通过addChild)。那么跟电影一样,镜头一出来先有一个大的环境。这个就是主背景层(CCLayer),对,就是CCLayer(怎么翻译好一点)。然后在这个主Layer里面再添加一些其他的元素,比如人物、火堆、狂奔的大狗、清唱的小鸟等。这些元素都是独立的对象(继承CCSprite),他们都有各自的属性和行为,比如人物是一个男人,他在漫无目的的行走,火堆在燃烧放出一跳一跳的火光,狗在奔跑,鸟在飞来飞去等。所有这些元素都添加到主Layer里面,然后这个主Layer又被添加都场景里面(CCScene),最后导演执行这个场景(pDirector->runWithScene(pScene)),一个画面就出来了。
来看一看代码级别的执行过程:
主循环(不知道的看我前面的文章)
if (m_pNextScene)// 刚才的pushScene函数设置了这个值 { setNextScene(); // 将下个要运行的Scene给m_pRunningScene } kmGLPushMatrix(); // draw the scene if (m_pRunningScene) // 这里开始渲染当前要运行的Scene { m_pRunningScene->visit(); }
导演每次只能执行一个场景,执行并不仅仅是绘制,还包括其动作,回调,过渡等。每个场景实质上是一个CCNode,
前面讲过,CCNode有个很重要的成员变量m_pChildren,这是一个CCArray,用来存放添加到该节点的子节点。Scene在渲染的时候会递归渲染其子节点,这就组成一个渲染链,保证整个场景的所有元素都会被渲染。