cocos2d-x中的导演、场景、层和精灵
场景(Scenes)
场景在cocos2d-x中是CCScene类实现的,是应用程序流中独立的一部分。一个cocos2dx应用程序可以有许多场景,但是在某一时刻,只有一个场景在运行。
比如,你有一个游戏,有以下场景:介绍、菜单、关卡1,过渡动画1,关卡2,胜利动画,失败动画,比分。设计者可以把每个场景当成一个独立的应用程序来设计,最后用一些少量的胶水代码,讲这些场景连接起来,形成一个完整的游戏。比如,介绍场景结束之后应该进入菜单场景,关卡1结束之后应该进入过渡动画1场景等等。场景切换流程可以设计如下图:
一个cocos2d场景对象由一个或者多个CCNode对象,加入到场景对象作为它的儿子组成。CCNode的子类,比如CCLayer和CCSprite,提供了场景的现实和行为。一般来说,程序员实现自己的CCLayer的一个子类,然后加入到一个空的场景对象中,在子类中实现你其他的图像显示和其他的游戏对象比如CCNode,再将这些游戏对象加入到你的自定义CCLayer的子类对象中。
因为场景是CCNode的子类,所以程序员可以可以通过CCAction来移动场景。
另外还有一系列的过渡场景类(CCTransitionScene)来实现场景切换时的效果,比如旧场景淡入,新场景淡出等等。
导演
导演对象时一个共享(单例)对象,负责场景之间的切换工作。它知道目前是哪个场景在执行,允许程序员通过它的接口,用新的场景替换旧的场景,或者压入一个新的场景到场景栈。当一个新的场景被压入到场景栈后,导演暂停旧的场景,但是旧的场景依旧保存在内存。如果将来程序员将新的栈弹出,旧的场景会从暂停的状态中恢复过来。
导演对象也负责初始化OpenGL ES。
层
层是CCNode子类,特别的功能是它能出来触摸消息。层可以是透明,也可以是不透明,甚至可以是半透明,让玩家透过半透明的层看那些后面的层。CCLayer在游戏的表现和行为上有非常重大的作用,所以程序员经常在CCLayer的子类中,实现大量的游戏需要的逻辑代码。
CCLayer可以处理用户触摸屏幕事件,只要重载相应的触摸事件处理函数,CCLayer就能反应用户的交互。触摸事件会发散到一个场景中的所有层,从前到后,知道有层捕获并接受这个事件为止。
复杂的程序需要程序员从CCLayer继承,实现自定义的层。cocos2dx提供了几个预定义的层,比如CCMenu(一个简单的menu层),CCColorLayer(一个带有颜色的层),CCLayerMultiplex(复合层,能让多个层混合在一起,当一个被激活时,其他无效)
层可以包含其他CCNode对象,比如CCSpite,CCLabel甚至可以使其他层对象。层也和场景一样都是CCNode的子类,所以它也可以定义动作。
复合层例子:
CCLayerGradient* layer1 = CCLayerGradient::create(ccc4(255, 0, 0, 255), ccc4(255, 0, 255, 255)); layer1->setContentSize(CCSizeMake(80, 80)); layer1->setPosition(ccp(50,50)); addChild(layer1); CCLayerGradient* layer2 = CCLayerGradient::create(ccc4(0, 0, 0, 127), ccc4(255, 255, 255, 127)); layer2->setContentSize(CCSizeMake(80, 80)); layer2->setPosition(ccp(100,90)); addChild(layer2); CCLayerGradient* layer3 = CCLayerGradient::create(); layer3->setContentSize(CCSizeMake(80, 80)); layer3->setPosition(ccp(150,140)); layer3->setStartColor(ccc3(255, 0, 0)); layer3->setEndColor(ccc3(255, 0, 255)); layer3->setStartOpacity(255); layer3->setEndOpacity(255); ccBlendFunc blend; blend.src = GL_SRC_ALPHA; blend.dst = GL_ONE_MINUS_SRC_ALPHA; layer3->setBlendFunc(blend); addChild(layer3);效果如下:
精灵
精灵和定义其他引擎的精灵类似,精灵是一个2D图片,它能被移动,旋转,缩放,动画等和其他转换格式。精灵由精灵类CCSprite实现,精灵也可以有儿子对象,这些儿子对象,会随着父对象一起,被处理。