美文网首页
cocos2d第三篇--场景与层

cocos2d第三篇--场景与层

作者: Arackboss | 来源:发表于2018-01-05 14:54 被阅读0次

    场景与层的关系

    编程的时候往往不需要子类化场景,而是子类化层。虽然场景与层之间是1:n组成的关系,但是通过模板生成的工程默认情况下都是1:1的关系。由模板生成的HelloWorldScene.h和HelloWorldScene.cpp文件中声明和定义了层HelloWorld类。场景与层的静态结构关系如xia:scene(1)——layer(1...n)。从这里我们可以看到HelloWorld是子类化Layer,其中createScene()是静态函数,create()也是惊天函数,init()是实例函数用来初始化层,Scene类是Cocos2d-x提供的场景类,其中的create()是静态函数用来创建场景,addChild()是实例函数用来将刚刚创建的层添加到场景中。

    场景切换相关函数

    场景切换是通过导演类Director实现的,其中的相关函数如下:

    • 1)void runWithScene(Scene *scene).该函数可以运行场景,只能在启动第一个场景时调用该函数。如果已经有一个场景运行,则不能调用该函数
    • 2)void replaceScene(Scene *scene).切换到下一个场景。用一个新的场景替换当前场景,当前被终端释放掉
    • 3)void pushScene(Scene *scene).切换到下一个场景中,将当前场景挂起放入到场景堆栈中,然后切换到下一个场景中。
      *4)void popScene().与pushScene配合使用,可以回到上一个场景。
    • 5)void popToRootScene().与pushScene配合使用,可以回到根场景。
      需要注意replaceScene和pushScene使用的区别,replaceScene会释放和销毁场景,如果要保持原来场景的状态,replaceScene函数不适合,pushScene并不会释放和销毁场景,原来的场景的状态可以保持,但是游戏中也不能同时又太多的场景对象运行。

    场景过渡动画

    场景切换时是可以添加过渡动画的,场景过渡动画是由TransitionScene类和它的子类展示的。TransitionScene类的直接子类有13个,而且有些子类还有子类,全部的过渡动画类有30多个。但是其使用方式都是一样的类似如下代码:

        auto scene = MyFirsh::createScene();
        auto rescene = TransitionFlipX::create(1.0f, scene);
        Director::getInstance()-> pushScene(rescene);
    

    意思就是基本所有的过渡动画都是这样子写的,我们要做的就是把代码中的TransitionFlipX替换成自己想要的效果就OK了;

    场景的生命周期

    • 1)bool init()。初始化层调用。
    • 2)void onEnter()。进入层时调用
    • 3)void onEnterTransitionDidFinish()。进入层而且过渡动画结束时调用。
    • 4)void onExit()。退出层时调用。
    • 5)void onExitTransitionDidStart()。退出层而且开始过渡动画时调用。
      1. void cleanup()。层对象被清除时调用。
        提示:层继承于节点,这些生命周期函数根本上是从Node继承而来。事实上所有Node对象都有这些函数,只要是子类化这些类都可以重写这些函数,来处理这些对象的不同生命周期阶段事件。

    重写HelloWorld层中的几个生命周期函数,代码如下:

    bool HelloWorld::init()
    {
          if(!Layer::init())
          {
                return false;
          }
          log("HelloWorld init");
          ...
          return true;
    }
    
    void HelloWorld::onEnter()
    {
        Layer::onEnter();
        log("HelloWorld onEnter");
    }
    

    注意:在重写生命周期函数中,第一行代码应该是调用父类的函数。列如,HelloWorld::onEnter()中第一行应该是Layer::onEnter()函数,如果不调用父类的函数则可能会导致层中的动画,动作或者计划无法执行。

    相关文章

      网友评论

          本文标题:cocos2d第三篇--场景与层

          本文链接:https://www.haomeiwen.com/subject/rgbjnxtx.html