您的位置:首页 > 移动开发 > Cocos引擎

【Cocos2d-X开发学习笔记】第04期:渲染框架之场景类(CCScene)的使用

2014-02-15 16:11 961 查看
本系列学习教程使用的是cocos2d-x-2.1.4版本(截至目前为止最新稳定版) ,PC开发环境Windows7,C++开发环境VS2010      

 

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9389883

       被导演持有的场景对象,是第一个包含游戏内容的层次。但是就其本身来说,并不是包含任何实际的绘制内容。

我们可以将场景看作是引擎中游戏画面划分当中一个重要的内容。它只是在游戏界面管理中发挥了重要的作用。场景

通常不包含游戏逻辑,仅仅是做为一个容器,将不同的层组合到一起,最终呈现给玩家一个完整的画面。它代表了游

戏运行中的一个状态,其包含的图层是更小一级的容器。图层中包含了游戏逻辑、用户响应及精灵对象。

 

一、场景类

 

        CCScene类是CCNode的子类。和CCNode相比,它只是添加了一个特性,那就是拥有自己的锚点,位置在屏幕

的正中央。除此之外,它目前还没有额外的功能,只是一个抽象的概念。

     我们在学习CCNode类时,把屏幕上所有显示对象的父节点设置为我们定义的节点,这个父节点的角色一般由场景

承担。CCScene类的继承关系如下图所示。



      

       可以看到,CCScene类有CCTransitionScene(切换场景类),并且CCTransitionScene类有很多子类,这些类

都用于切换场景的特效,我们会在后面的篇幅中学习到。

 

注意:游戏通常都会出现这种情况,当切换场景时,程序会由于旧场景的内存没有释放并且新场景已经载入,出现

短暂的“峰值”,但是不必为此而做额外的工作,因为Cocos2D-X引擎会清除旧场景的内存。但是要注意,正确使用

内存的保留与释放(这点会在后面学习到),尤其是使用场景切换特效的时候,你要做的工作是尽早上机测试和合理

的内存使用。

 

下面让就我们来学习CCScene类在游戏中的使用和场景的切换特效。

 

二、实例讲解

 

1、如何新建一个场景

 

    下面我们通过新建一个Cocos2d-x项目来总结使用场景的过程。

 

<1> 定义一个场景类实例。

 

      在HelloWorldScene.cpp中的scene函数即是新建场景的地方,如下代码所示。

[cpp] view
plaincopy

CCScene* HelloWorld::scene()  

{  

    //创建一个场景类,此对象将会自动释放  

    CCScene *scene = CCScene::create();  

  

    //创建一个布景层对象,将会自动释放  

    HelloWorld *layer = HelloWorld::create();  

  

    //将布景层对象加入场景当中  

    scene->addChild(layer);  

  

    // 返回场景对象  

    return scene;  

}  

       通过create方法构造一个场景,当然,create函数是Cocos2D-X 2.0以后的版本才有的方式,然后将定义的布景

层作为子项加入场景中,要显示的成员都在布景层中。至于布景层的定义,我们会在下一章学习到。

        

<2> 获得并运行场景。

     

       在游戏入口AppDelegate类中的applicationDidFinishLaunching函数中调用上一步定义的方法,并使用导演类的

runWithScene方法运行场景,如下代码所示。

[cpp] view
plaincopy

bool AppDelegate::applicationDidFinishLaunching()  

{  

    // 获得导演类  

    CCDirector *pDirector = CCDirector::sharedDirector();  

  

    //设置OpenGL视图  

    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());  

  

    // 设置是否显示每帧的时间  

    pDirector->setDisplayStats(true);  

  

    // 设置每帧的时间  

    pDirector->setAnimationInterval(1.0 / 60);  

  

    // 创建场景  

    CCScene *pScene = HelloWorld::scene();  

  

    // 运行场景  

    pDirector->runWithScene(pScene);  

  

    return true;  

}     

      到这里已经可以新建一个场景并把它加入游戏中了。

      

      这时也许有人会有疑问:一般来讲,游戏都会由多个场景组成,至少会有菜单场景和游戏场景,更复杂的游戏甚

至会有更多场景,那么如何在场景间切换呢?下面我们就通过引擎自带的tests例子来学习如何在场景间切换。
     

 

2、场景的切换

 

       tests项目是一个Cocos2D-X的功能示例。对于Cocos2D-X的初学者来说,看tests项目中的示例并理解它们,是

个非常不错的学习方式。下面我们就通过介绍tests的基本结构来学习场景间的切换。

      游戏入口AppDelegate类中的applicationDidFinishLaunching函数如下代码所示。

[cpp] view
plaincopy

bool AppDelegate::applicationDidFinishLaunching()  

{  

    // initialize director  

    CCDirector *pDirector = CCDirector::sharedDirector();  

    pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());  

  

    // turn on display FPS  

    pDirector->setDisplayStats(true);  

  

    // set FPS. the default value is 1.0/60 if you don't call this  

    pDirector->setAnimationInterval(1.0 / 60);  

  

    // create a scene. it's an autorelease object  

    CCScene *pScene = HelloWorld::scene();  

        

    CCLayer * pLayer = new TestController();  

  

    pLayer->autorelease();  

  

    pScene->addChild(pLayer);  

  

    // run  

    pDirector->runWithScene(pScene);  

      

    return true;  

}  

      这里和上面讲的applicationDidFinishLaunching有一点区别,它的定义场景和给场景加层的操作都在这个函数里

完成,但是本质上是类似的。下面就来看看TestController布景层里面是如何调用下一级场景的。
      切换场景这个事件应该是在按下主菜单上的按键后发生的,于是找到controller.cpp文件中的menuCallback函数。

它是自定义的一个回调函数,在定义布景层时定义。如果不理解这一点,没关系,我们会在后面学习到。

       menuCallback函数如下代码所示。

[cpp] view
plaincopy

void TestController::menuCallback(CCObject * pSender)  

{  

    // get the userdata, it's the index of the menu item clicked  

    CCMenuItem* pMenuItem = (CCMenuItem *)(pSender);  

    int nIdx = pMenuItem->getZOrder() - 10000;  

  

    // create the test scene and run it  

    TestScene* pScene = CreateTestScene(nIdx);  

    if (pScene)  

    {  

        pScene->runThisTest();  

        pScene->release();  

    }  

}  

       除了处理菜单类的内容,这部分可以暂时跳过。后面调用controller.cpp文件中定义的CreateTestScene函数获得

场景,然后调用场景的runThisTest函数,这是自定义的。

       首先来看CreateTestScene函数,如下代码所示。

[cpp] view
plaincopy

static TestScene* CreateTestScene(int nIdx)  

{  

    // 清空缓存  

    CCDirector::sharedDirector()->purgeCachedData();  

  

    TestScene* pScene = NULL;  

  

    switch (nIdx)  

    {  

    case TEST_ACTIONS:  

        pScene = new ActionsTestScene(); break;  

        //中间部分的代码过长,省略掉这部分,如果想看完整的代码,请参考Cocos2D-X  

        //引擎目录下tests项目中的controller.cpp文件  

    default:  

        break;  

    }  

  

    return pScene;  

}  

        这里省略中间的部分,首先调用导演类的清楚缓存函数,然后新建场景,并返回场景。

      

      关于场景的定义,来看ActionManagerTestScene场景的定义。ActionManagerTest.h文件中的

ActionManagerTestScene类的定义如下代码所示。

[cpp] view
plaincopy

class ActionManagerTestScene : public TestScene  

{  

public:  

    virtual void runThisTest();  

};  

      ActionManagerTest.cpp文件中的runThisTest函数的定义如下代码所示。

[cpp] view
plaincopy

void ActionManagerTestScene::runThisTest()  

{  

    CCLayer* pLayer = nextActionManagerAction();  

    addChild(pLayer);  

  

    CCDirector::sharedDirector()->replaceScene(this);  

}  

      这里做的就是把布景层加入到场景中,并把场景通过导演类replaceScene将当场景替换成场景。

以上过程分为一下三步:

<1> 调用CCDirector::sharedDirector()->purgeCachedData()清空缓存。

<2> 新建场景。

<3> 调用CCDirector::sharedDirector()->replaceScene(this)替换新场景。Cocos2D-X提供了场景间切换的特效,我们

马上就来学习这方面的内容。

 

注意:不要在节点初始化的init函数中调用replaceScene函数。导演类不允许在一个节点初始化的调用场景替换,

否则会导致程序崩溃。

 

      这里说一下压入场景(pushScene)和弹出场景(popScene)。它们都可以用来显示场景和保留当前场景并显示

新场景;不同的是它们不把旧场景从内存中释放掉,这样可以提高加载速度,这时需要注意,如果内存不足以支撑的

话,建议采用replaceScene函数。

 

 

3、场景间切换的动画

 

      很多时候,为了游戏效果,使UI更有动态,会在切换界面的过程中加入一些过程动画,如平移切换场景动画、旋

转切换场景动画等等。如下图所示。


                  


 

       正常的无过渡场景,如果尚未建立场景(游戏中的第一个场景),使用runWithScene函数即可使用相应场景;如

果是替换场景,则使用replaceScene函数替换相应的场景即可;而如果要使用场景间的切换效果,则需要使用相应的

切换类,即在CCTransitionScene子类的create函数,生成相应场景。当然,不同效果的使用方法略有不同。

      然后,通过replaceScene函数启动场景,也就是说给这个场景加了一个外包装类,然后再启动。那么,这个场景

就不是直接显示了,而是在场景的效果动画播完以后进入场景,起到了过渡的效果。

      一般情况,CCTransitionScene子类的create函数有两个参数。第一个参数是特效的切换时间,直接生成一个

CCTime类即可,例子中设定的时间是1 ~ 2s,对于很多场景的显示都很舒服,你也可以根据你的要求修改切换的时

间;第二个参数是要进入的场景。有的类会有第三个参数,如下图所示。





 



 

其中,CCTransitionPageTurn类需要先设置摄像机,使用如下代码:

[cpp] view
plaincopy

CCDirector::sharedDirector()->setDepthTest(true);  

有三种特效需要检测OpenGL版本是否支持,如下图表所示。使用如下代码检查,如果为真则不支持:

[cpp] view
plaincopy

CCConfiguration::sharedConfiguration()->getGlesVersion() <= GLES_VER_1_0  



 

tests项目的TransitionTest文件夹中的是场景切换的示例。切换场景动画的使用步骤如下。

<1> 新建场景。

<2> 根据需要的新建场景的切换动画选择CCTransitionScene子类,通过create将之前建的场景传入其中,并设置其

他参数。

<3> 调用CCDirector::sharedDirector()->replaceScene(第2步中定义的CCTransitionScene的子类)替换场景。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐