• Cocos2d-x之Director


    |   版权声明:本文为博主原创文章,未经博主允许不得转载。

    Director类简介

           在Cocos2d-x-3.x引擎中,采用节点树形结构来管理游戏对象,一个游戏可以划分为不同的场景,一个场景又可以分为不同的层,一个层又可以拥有任意个可见的游戏节点(即对象,游戏中基本上所有的类都派生于节点类Node)。可以执行Action来修改游戏节点的属性,使其移动、旋转、放大、缩小等等。每一个时刻都有一个场景在独立运行,通过切换不同的场景来完成一个游戏流程,游戏流程的管理由Director来执行,其基本框架类图如下:

                    

      一款游戏好比一部电影,只是游戏具有更强的交互性,不过它们的基本原理是一致的。所以在Cocos2dx中把统筹游戏大局的类抽象为导演(Director),Director是整个cocos2dx引擎的核心,是整个游戏的导航仪,游戏中的一些常用操作就是由Director来控制的,比如OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点(游戏元素)的控制等,还有一些游戏数据的保存调用,屏幕尺寸的获取等都要由Director类来管理控制的。因为Director是游戏项目的总导演,会经常调用进行一些控制,所以该Director利用了单件设计模式,也就是项目里取到的director都是同一个。用getInstance() 方法取得Director的实例,具体的API可以参考相关文档,就不做赘述了。

      Director类是Cocos2D-X游戏引擎的核心,它用来闯将并控制着主屏幕的显示,同时控制场景的显示时间和显示方式。Director类还可以设定游戏呈现方面,包括游戏呈现的窗口,PFS显示,默认帧率上限,纹理颜色为框等;在整个游戏里一般只有一个导演。游戏的开始、结束、暂停都会调用Director类的方法。Director类的主要功能如下:

         ◆  初始化OpenGL会话  

         ◆  设置OpenGL的一些参数和方式

         ◆  访问和改变场景以及访问Cocos2D-X的配置细节

         ◆  访问视图

         ◆  设置投影和朝向

     

    Director是单例模式,调用Director方法的标准如下:

    auto director = Director::getInstance();
    director -> 函数名();
    或者
    Director::getInstance() -> 函数名();
    

    DisplayerLinkDirector继承了Director,是一个自动刷新的导演类。它支持1/60, 1/30, 1/15三种动画帧间隔。

     

    Director类的主要函数:

     画红线重要函数的讲解: 

       getVisibleOrigin:   获得当前窗口的原点坐标

       getVisibleSize:  获取可见窗口的大小,返回的是点

       getRunningScene: 获得当前正在运行的场景,导演一次只能运行一个场景。

       setOpenGLView:      设置绘制所有对象的OpenGL视图

       getOpenGLView:      获得绘制所有对象的OpenGL视图

       setProjection:      设置OpenGL投影。

       getProjection:      获取OpenGL投影。

       getWinSize:      获得当前窗口的大小,经常根据返回的窗口尺寸,定位其他节点位置(点坐标)

       convertToGL:     将屏幕坐标转换为一个OpenGL坐标。 对于将(多点)触摸坐标转换为当前布局(横向或纵向)很有用。

       convertToUI:     转换一个OpenGL坐标到屏幕坐标。 对于比如glScissor调用将node点转换到窗口点很有用。

       stopAnimation:      停止动画。不进行绘制。主循环不会再被触发。 如果你不想暂停动画,请调用            [pause]。

     

       startAnimation:  主循环触发一次。 只有之前调用过stopAnimation,才能调用这个函数。不调用这个函数来开始主循环。请调用runWithScene来开始主循环。

       end:         结束场景,同时退出应用

    下面这几个函数见cocos2d-x引擎框架那里

     1 runWithScene:    启动游戏,并运行scene场景。这个方法在主程序启动时第一次启动主场景时调用
     2 
     3 popScene:           释放当前场景,再从代执行场景栈中弹出栈顶的场景,并将其设置为当前运行场景。如果栈空,则直接结束应用。
     4 
     5 pushScene:           将当前运行中的场景暂停并压入到带执行场景栈中去,再将传入的scene设置为当前运行场景。
     6 
     7 replaceScene:      直接使用传入的scene替换当前场景来切换画面,当前场景将被释放
     8 
     9 pause:                 暂停当前运行场景中的所有计时器和动作,场景任会显示在屏幕上
    10 
    11 resume:               恢复当前运行场景中被暂停的计时器和动作

     

    导演类的使用代码:

     1 // on "init" you need to initialize your instance
     2 bool HelloWorld::init()
     3 {
     4 //////////////////////////////
     5 // 1. super init first
     6 if ( !Layer::init() )
     7 {
     8 return false;
     9 }
    10 
    11 Size visibleSize = Director::getInstance()->getVisibleSize();
    12 Vec2 origin = Director::getInstance()->getVisibleOrigin();
    13 
    14 /////////余下部分省略
    15 
    16 return true;
    17 }
    18 
    19 void HelloWorld::menuCloseCallback(Ref* pSender) //回调函数的功能实现
    20 {
    21 Director::getInstance()->end();
    22 
    23 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    24 exit(0);
    25 #endif
    26 }
    27 
    28 bool AppDelegate::applicationDidFinishLaunching() {
    29 // initialize director
    30 auto director = Director::getInstance();
    31 auto glview = director->getOpenGLView();
    32 if(!glview) {
    33 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
    34 glview = GLViewImpl::createWithRect("MyGame01", Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
    35 #else
    36 glview = GLViewImpl::create("MyGame01");
    37 #endif
    38 director->setOpenGLView(glview);
    39 }
    40 
    41 // turn on display FPS
    42 director->setDisplayStats(true);
    43 
    44 // set FPS. the default value is 1.0/60 if you don't call this
    45 director->setAnimationInterval(1.0 / 60);
    46 
    47 // Set the design resolution
    48 glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
    49 Size frameSize = glview->getFrameSize();
    50 // if the frame's height is larger than the height of medium size.
    51 if (frameSize.height > mediumResolutionSize.height)
    52 { 
    53 director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
    54 }
    55 // if the frame's height is larger than the height of small size.
    56 else if (frameSize.height > smallResolutionSize.height)
    57 { 
    58 director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
    59 }
    60 // if the frame's height is smaller than the height of medium size.
    61 else
    62 { 
    63 director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
    64 }
    65 
    66 register_all_packages();
    67 
    68 // create a scene. it's an autorelease object
    69 auto scene = MyGame::createScene();
    70 
    71 // run
    72 director->runWithScene(scene);
    73 
    74 return true;
    75 }
    76 
    77 // This function will be called when the app is inactive. When comes a phone call,it's be invoked too
    78 void AppDelegate::applicationDidEnterBackground() {
    79 Director::getInstance()->stopAnimation();
    80 
    81 // if you use SimpleAudioEngine, it must be pause
    82 // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
    83 }
    84 
    85 // this function will be called when the app is active again
    86 void AppDelegate::applicationWillEnterForeground() {
    87 Director::getInstance()->startAnimation();
    88 
    89 // if you use SimpleAudioEngine, it must resume here
    90 // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
    91 }                                                                 
  • 相关阅读:
    FW 构建OpenStack的高可用性(HA,High Availability)
    nodeJS进程管理器pm2
    JS构造函数中 this 和 return
    js中通过Object.prototype.toString方法----精确判断对象的类型
    jpeg和jpg的区别是什么
    Http协议中Cookie详细介绍
    http协议与内容压缩
    设置TextView文字居中
    矩阵的等价,相似,合同
    “读者-写者问题”的写者优先算法实现
  • 原文地址:https://www.cnblogs.com/geore/p/5794035.html
Copyright © 2020-2023  润新知