Scene:
在应用程序中,scene是相对独立的一块,在很多其他的引擎中,也把它称之为“画布”或者“舞台”。
在cocos2d-x中,一个应用可以有多个scene,但任何时刻只能有一个是acitve的。一个CCScene由多个CCNode组成,一般是包含若干个CCLayer,而CCLayer又包含多个CCSprite。需要注意的是,CCScene,CCLayer和CCSprite都继承了CCNode,只不过后者还有其他的父类,使用多继承进行实现。可以得知cocos2d-x的可视化数据组织就是一棵场景树,只不过其中的有些中间节点被赋予了额外的逻辑(比如CCScene和CClayer)
由于Scene是CCNode的子类,所以可以进行手动或者使用Actions进行变换。
有一族特殊的scene叫CCTransitionScene,从CCScene派生而来,可以实现场景切换特效,比如褪色,翻页等效果。
Director:
Director是一个共享的单例对象,用来控制场景Scene之间的切换。Director知道当前Active的Scene。可以通过Director在场景栈的栈顶push一个新的scene来进行场景切换。将之前的Scene B压栈,push Scene A,但并不从内存中销毁Scene B。如果将栈顶Scene A弹出,则会切换到Scene B,而且状态也恢复到之前压栈的状态。
Director 还负责OpenGL ES 的初始化。
Layer:
Layer是一种可以处理触摸事件的CCNode,可以在代码中看它除了额外继承CCNode之外,还继承了CCTouchDelegate。CCLayer知道如何绘制自己,并且可以半透,让玩家看到其他的Layer。CCLayer在定义游戏的外观和行为时非常有用,所以你应该花大量的编码时间来开发自己所需要的CCLayer子类。
CCLayer可以在ccTouchBegan, ccTouchMoved, ccTouchEnded和ccTouchCancelled中处理相应的事件,而且在场景中的所有Layer都会收到这些事件,直到某个Layer处理了为止。
除了可以开发自己所需要的CCLayer子类之外,cocos2d-x还提供了几种实现好的Layer,比如CCMenu,CCColorLayer和CCLayerMultiplex等。
CCLayer可以包含任何CCNode的子类,包括CCSprite,CCLabels乃至其他的CCLayer子类。CCLayer也可以手动或者使用Actions进行变换。
以下是使用一种渐变Layer的示例:
1 CCLayerGradient* layer1 = CCLayerGradient::create(ccc4(255, 0, 0, 255), ccc4(255, 0, 255, 255)); 2 layer1->setContentSize(CCSizeMake(80, 80)); 3 layer1->setPosition(ccp(50,50)); 4 addChild(layer1); 5 6 CCLayerGradient* layer2 = CCLayerGradient::create(ccc4(0, 0, 0, 127), ccc4(255, 255, 255, 127)); 7 layer2->setContentSize(CCSizeMake(80, 80)); 8 layer2->setPosition(ccp(100,90)); 9 addChild(layer2); 10 11 CCLayerGradient* layer3 = CCLayerGradient::create(); 12 layer3->setContentSize(CCSizeMake(80, 80)); 13 layer3->setPosition(ccp(150,140)); 14 layer3->setStartColor(ccc3(255, 0, 0)); 15 layer3->setEndColor(ccc3(255, 0, 255)); 16 layer3->setStartOpacity(255); 17 layer3->setEndOpacity(255); 18 ccBlendFunc blend; 19 blend.src = GL_SRC_ALPHA; 20 blend.dst = GL_ONE_MINUS_SRC_ALPHA; 21 layer3->setBlendFunc(blend); 22 addChild(layer3);
Sprite:
Sprite的概念和其他的2D引擎是差不多的,就是一个2D的图像,可以旋转平移缩放。
Sprite可以包含其他的Sprite作为子节点,当父节点被变换时,子节点会一起被变换。
Sprite可以手动或者使用Actions进行变换。