【cocos2d-x】CCScene CCLayer CCSprite CCNode 描述



  在原文上添加补充

【原文地址】https://i-blog.csdnimg.cn/blog_migrate/fc564778d5b4445c9a164a83b88aede5.png












游戏中4者的关系



Scenes

scene(即 CCScene类)是app 工作流上独立块。scene也叫做 screents 或者“stages”. 一个app可能拥有多个scenes, 但在任何时候只能有一个是激活状态的。举个例子,某个游戏可能拥有如下scenes: Intro, Menu菜单, Level 1, Cutscene 1, Level 2, Winning cutscene, losing cutscene, High scores screen等等. 可以把这些scenes定义成独立的应用块;这些scenes之间包含了相互连接的逻辑(当中断或者完成,intro会进入menu,level1 引导您渠道cutscene 1 假如完成或者丢失cutscene,等)

一个cocos2d CCScene 对象 由一个或多个layers组成(layer即CCLayer 对象),layers之间是前后相连的。layer提供了scene的外观 appearance和行为behavior;通常的用法是直接用一个或多个layers实例化一个scence; CCScene的子类CCTrasitionScene 实现移动transitions , 提供两个scenes 之间的转移效果((比如fade out/in, slide from a side, 等效果).)由于scenes 是CCNode子类,所以scenes可以手工或者用actions来转变坐标。

-所有的层和精灵都是它的children 在屏幕上显示一个画面,就要先建一个CCScene对象 
在HelloWorldScene.cpp文件中
[cpp]  view plain copy
  1. CCScene* HelloWorldScene::scene()  
  2. {  
  3.   CCScene * scene = NULL;  
  4.   do  
  5.   {  
  6.     // 'scene' is an autorelease object  
  7.     scene = CCScene::node();  
  8.     CC_BREAK_IF(! scene);  
  9.   
  10.     // 'layer' is an autorelease object  
  11.     BeginScene *layer = HelloWorldScene::node();  
  12.     CC_BREAK_IF(! layer);  
  13.   
  14.     // add layer as a child to scene  
  15.     scene->addChild(layer);  
  16.   } while (0);  
  17.   
  18.   // return the scene  
  19.   return scene;  
  20. }  

创建的layer是自定义的一个CCLayer继承子类

-在AppDelegate.cpp文件 applicationDidFinishLaunching方法调用的第一个scene

[cpp]  view plain copy
  1. bool AppDelegate::applicationDidFinishLaunching()  
  2. {  
  3.     // initialize director  
  4.     CCDirector *pDirector = CCDirector::sharedDirector();  
  5.     pDirector->setOpenGLView(&CCEGLView::sharedOpenGLView());  
  6.   
  7.     // sets landscape mode  
  8.     pDirector->setDeviceOrientation(kCCDeviceOrientationLandscapeLeft);  
  9.   
  10.     // turn on display FPS  
  11.     pDirector->setDisplayFPS(true);  
  12.   
  13.     // set FPS. the default value is 1.0/60 if you don't call this  
  14.     pDirector->setAnimationInterval(1.0 / 60);  
  15.   
  16.     // create a scene. it's an autorelease object  
  17.     CCScene *pScene = HelloWorldScene::scene();  
  18.   
  19.     // run  
  20.     pDirector->runWithScene(pScene);  
  21.   
  22.     return true;  
  23. }  
CCScene的4个基本方法:runWithScene(运行画面),replaceScene(替换场景 例如从主菜单进入游戏界面),
                      pushScene(暂停界面), popScene(从暂停的界面还原到游戏界面)


例 在自己建立的BeginScene层中掉调用replaceScene切换到GameScene:
[cpp]  view plain copy
  1. void BeginScene::toPlay(CCObject* sender)  
  2. {  
  3.   GameScene* gameScene = GameScene::node();  
  4.   CCDirector::sharedDirector()->replaceScene(gameScene);  
  5. }  
Director
CCDirector 负责scenes之间的前进或后退。

CCDirector是singleton模式的共享的对象。它知道当前哪个scene是激活。 CCDirector以stack的方式处理scenes的调用(当另一个scene进入的时候,暂停当前的scene,完成之后再返回原来的 scene),CCDirector 负责更换CCScene,在 CCLayer 被push的时候,更换或结束当前的scene。另外:CCDirector 负责初始化OpenGL ES。
作用:
1.访问和改变场景
2.访问cocos2d的配置细节
3.访问视图,(openGL, UIView, UIWindow)
4.暂停,恢复和结束游戏
5.在UIKit和OpenGL之间转换坐标

常用的方法:

1.主程序启劢,显示第一个场景的方法:(void) runWithScene:(Scene*) scene;
2.
 挂起当前当前正在运行的场景并压栈到代执行场景队列。将传入场景设置为当前执行场景:(void) pushScene:(Scene*) scene;
3.
 执行代执行场景队列中的最后一个场景,当前场景被释放:(void) popScene;当代执行队列中没有代执行场景时,系统自劢退出,调用 end 方法。

4. 直接用一个场景取代当前执行场景,释放当前场景:(void) replaceScene:(Scene*) scene;是经常实用的函数 

5.结束场景运行:(void) end;
6.
暂停场景运行:(void) pause;画面还存在,时间任务停止。
7.恢复场景运行:-(void) resume;


Layers



层:Layers 
     CCLayer同样是CCNode的子类,通常用addChild方法把 CCLayer的子类添加到CCScene中。CCSence提供了一个表演的舞台,而CCLayer提供了舞台中的幕布。

  在一个scene中建多个layer层

第一种方法
HelloWorldScene.h

class HelloWorld : public cocos2d::CCLayer
{
public:
    HelloWorld(void);


public:
    static cocos2d::CCScene* scene();


    void HelloWorldCallback(CCObject* pSender);


    LAYER_CREATE_FUNC(HelloWorld);
};


class FirstTestLayer : public cocos2d::CCLayer
{
public:
    FirstTestLayer(void);


public:
    void FirstTestLayerCallback(CCObject* pSender);


    LAYER_CREATE_FUNC(FirstTestLayer);
};


HelloWorldScene.cpp

//                       主layer      第一layer
CCLayer* pLayerPlay,* pFirstLayer,* pSecondLayer,* pThirdLayer;


CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do 
    {
        // 'scene' is an autorelease object
        scene = CCScene::create();
        CC_BREAK_IF(! scene);


  pLayerPlay = new HelloWorld();   // HelloWorld构造方法
  pFirstLayer = new FirstTestLayer();
  pSecondLayer = new SecondTestLayer();
  pThirdLayer = new ThirdTestLayer();


 pLayerPlay = HelloWorld::create();  
 pFirstLayer = FirstTestLayer::create();
 pSecondLayer = SecondTestLayer::create();
 pThirdLayer = ThirdTestLayer::create();

          pLayerPlay->addChild(pFirstLayer, 0); 
 pLayerPlay->addChild(pSecondLayer, 0); 
 pLayerPlay->addChild(pThirdLayer, 0);

 scene->addChild(pLayerPlay, 0); 

 pFirstLayer->setVisible(false); //以可见与不可见当前层切换layer
 pSecondLayer->setVisible(false);
    pThirdLayer->setVisible(false);


    } while (0);


    return scene;
}


第二种方法
通过switchTo方法进行layer的替换

//Multiplex的创建方法,以及switchTo切换layer   (释:removeChild上一个layer,切换到当前layer)
CCLayerMultiplex* layer = CCLayerMultiplex::create(FirstTest,SecondTest, ThirdLayer,NULL);
   ((CCLayerMultiplex*)m_pParent)->switchTo(0);



     CCLayer 对象定义了可描绘的区域,定义了描绘的规则。CCLayer可以实现半透明的效果,令您看到它背后的layers。概括地说:CCLayer 用于定义外观和事件behavior。所以,当编写cocos2d程序的时候,大部分工作就是编写CCLayer的子类去实现所要的效果。 



 
CCLayer 负责处理事件event。Events 会从第一个向最后一个layers传递,直至某个layer获取event并处理它。

虽然某个时候,你需要客户化一个CCLayer类, 但cocos2d已经实现了多种功能的layers(比如菜单layer: CCMenu, 颜色层layer: CCColorLayer,等等)。
Layers 可以包含CCSprite 对象, CCLabel 对象 和其它layer对象。 layers是CCNode的子类,所以他们也可以使用actions来转 换坐标. See Actions for more detail about actions.
CCLayer:
  在同一个场景中需要多个CCLayer时:
方法1
CCScene* scene
CCLayer* backgroundscene
CCLayer* userInterfaceLayer

return

方法2
创建CCScene的子类,然后在各个场景的init方法中生成CCLayer层和其它的对象

Sprites
cocos2d的sprite对象就是一个可以移动、选择、伸缩、动画的2d图形,CCSprite 对象的子成员中可以包含其它的CCSprite 对象。当CCSprite 对象转换坐标系的时候,它所包含的CCSprite 对象也会转换转换坐标系。sprites 是CCNode 的子类所以他们也可以使用actions来转换坐标. See Actions for more detail about actions.

 可以用图片初始化一个sprite添加到CCLayer的子层中

[cpp]  view plain copy
  1. CCSprite *background = CCSprite::spriteWithFile("background.jpg");  
  2.  background->setPosition(ccp(winSize.width/2, winSize.height/2));  
  3.  this->addChild(background);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值