• cocos2d-x C++ 原始工程引擎运行机制解析


    新建一个工程,相信感兴趣的同学都想知道cocos引擎都是如何运行的

    想知道是如何运行的,看懂四个文件即可

    话不多说,上代码:

    1、首先解释 AppDelegate.h

     1 #ifndef  _APP_DELEGATE_H_
     2 #define  _APP_DELEGATE_H_
     3 
     4 #include "cocos2d.h"
     5 
     6 /**
     7 @brief    The cocos2d Application.
     8 
     9 Private inheritance here hides part of interface from Director.
    10 */  //从这里可以看到AppDelegate继承了cocos2d::Application ,而cocos2d::Application是cocos2d-x引擎提供的基类
    11 class  AppDelegate : private cocos2d::Application
    12 {
    13 public:
    14     AppDelegate();
    15     virtual ~AppDelegate();
    16     /*
    17      
    18      */
    19     virtual void initGLContextAttrs();
    20 
    21     /**
    22     @brief    Implement Director and Scene init code here.
    23     @return true    Initialize success, app continue.
    24     @return false   Initialize failed, app terminate.
    25         *游戏启动时调用的函数,在这里可以初始化导演对象和场景对象
    26     */
    27     virtual bool applicationDidFinishLaunching();
    28 
    29     /**
    30     @brief  Called when the application moves to the background
    31     @param  the pointer of the application
    32         *游戏进入后台时调用的函数
    33     */
    34     virtual void applicationDidEnterBackground();
    35 
    36     /**
    37     @brief  Called when the application reenters the foreground
    38     @param  the pointer of the application
    39         *游戏进入前台时调用的函数
    40     */
    41     virtual void applicationWillEnterForeground();
    42 };
    43 
    44 #endif // _APP_DELEGATE_H_

    2、AppDelegate.cpp

    #include "AppDelegate.h"
    #include "HelloWorldScene.h"
    
    USING_NS_CC;//这个是cocos2d-x提供的一个宏,它是用来替换 using namespace cocos2d语句的。
    
    static cocos2d::Size designResolutionSize = cocos2d::Size(480, 320);
    static cocos2d::Size smallResolutionSize = cocos2d::Size(480, 320);
    static cocos2d::Size mediumResolutionSize = cocos2d::Size(1024, 768);
    static cocos2d::Size largeResolutionSize = cocos2d::Size(2048, 1536);
    
    AppDelegate::AppDelegate()
    {
    }
    
    AppDelegate::~AppDelegate() 
    {
    }
    
    // if you want a different context, modify the value of glContextAttrs
    // it will affect all platforms
    void AppDelegate::initGLContextAttrs()
    {
        // set OpenGL context attributes: red,green,blue,alpha,depth,stencil
        GLContextAttrs glContextAttrs = {8, 8, 8, 8, 24, 8};
    
        GLView::setGLContextAttrs(glContextAttrs);
    }
    
    // if you want to use the package manager to install more packages,  
    // don't modify or remove this function
    static int register_all_packages()
    {
        return 0; //flag for packages manager
    }
    
    // 游戏启动时调用的函数
    bool AppDelegate::applicationDidFinishLaunching() {
        // initialize director
        auto director = Director::getInstance();//初始化导演类
        auto glview = director->getOpenGLView();
        if(!glview) {
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
            glview = GLViewImpl::createWithRect("NotesDamo", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
    #else
            glview = GLViewImpl::create("NotesDamo");
    #endif
            director->setOpenGLView(glview);//设置导演类的OpenGL视图
        }
    
        // turn on display FPS
        director->setDisplayStats(true);//设置是否在屏幕上显示帧率信息(一般都是为了测试,实际发布时是不会显示的)
    
        // set FPS. the default value is 1.0/60 if you don't call this
        director->setAnimationInterval(1.0f / 60);//一秒执行60帧
    
        // Set the design resolution
        glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::NO_BORDER);
        auto frameSize = glview->getFrameSize();
        // if the frame's height is larger than the height of medium size.
        if (frameSize.height > mediumResolutionSize.height)
        {        
            director->setContentScaleFactor(MIN(largeResolutionSize.height/designResolutionSize.height, largeResolutionSize.width/designResolutionSize.width));
        }
        // if the frame's height is larger than the height of small size.
        else if (frameSize.height > smallResolutionSize.height)
        {        
            director->setContentScaleFactor(MIN(mediumResolutionSize.height/designResolutionSize.height, mediumResolutionSize.width/designResolutionSize.width));
        }
        // if the frame's height is smaller than the height of medium size.
        else
        {        
            director->setContentScaleFactor(MIN(smallResolutionSize.height/designResolutionSize.height, smallResolutionSize.width/designResolutionSize.width));
        }
    
        register_all_packages();
    
        // create a scene. it's an autorelease object
        auto scene = HelloWorld::createScene();//创建导演类对象scene
    
        // run
        director->runWithScene(scene);//运行该场景(会使游戏进入该场景)
    
        return true;
    }
    
    // This function will be called when the app is inactive. Note, when receiving a phone call it is invoked.
    
    //游戏进入后台时调用的函数
    void AppDelegate::applicationDidEnterBackground() {
        Director::getInstance()->stopAnimation();//停止场景中的动画
    
        // if you use SimpleAudioEngine, it must be paused
        // 停止背景音乐,默认时注释掉的
        // SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
    }
    
    // this function will be called when the app is active again
    // 游戏进入前台时调用的函数
    void AppDelegate::applicationWillEnterForeground() {
        Director::getInstance()->startAnimation();//开始场景中的动画
    
        // if you use SimpleAudioEngine, it must resume here
        // 继续背景音乐的,默认是注释掉的
        // SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
    }

    3、HelloWorldScene.h

     1 #ifndef __HELLOWORLD_SCENE_H__
     2 #define __HELLOWORLD_SCENE_H__
     3 
     4 #include "cocos2d.h"
     5 
     6 
     7 /*
     8  *在这里我们可以看出,HelloWorld类继承了cocos2d::Layer类;它被称为层(layer),这些层被放到了场景(scene)中,场景类是:cocos2d::Scene;
     9     注意:HelloWorld.h虽然命名为场景,但是它内部定义的HelloWorld类是一个层
    10  */
    11 //HelloWorld继承了cocos2d::Layer,HelloWorld是一个层,而不是场景。
    12 class HelloWorld : public cocos2d::Layer
    13 {
    14     
    15 public:
    16     
    17     static cocos2d::Menu* m_pSelectedItem();
    18     
    19     virtual ~HelloWorld(){}
    20     
    21     static cocos2d::Scene* createScene();//声明创建当前的层HelloWorld所在场景的静态函数createScene();
    22     
    23     virtual bool init();//声明初始化层HelloWorld实例函数。
    24     
    25     // a selector callback
    26     void menuCloseCallback(cocos2d::Ref* pSender);//声明菜单回调函数menuCloseCallback,用于触摸菜单事件的回调。
    27     
    28     CREATE_FUNC(HelloWorld);//CREATE_FUNC是cocos2d-x中定义的一个宏(作用是:创建一个静态函数"static create()",该函数可以用来创建层);
    29     
    30     
    31     
    32     // implement the "static create()" method manually
    33     
    34 };
    35 
    36 #endif // __HELLOWORLD_SCENE_H__

    4、HelloWorldScene.cpp

      1 #include "HelloWorldScene.h"
      2 #include "SimpleAudioEngine.h"
      3 
      4 USING_NS_CC;
      5 /*
      6  说明:createScene()函数式是在游戏应用启动的时候,在AppDelegate中的bool AppDelegate::applicationDidFinishLaunching()函数中通过 auto scene = HelloWorld::createScene()语句调用的。
      7     createScene()中做了三件事情,首先创建了HelloWorld层所在的场景对象,其次创建了HelloWorld层,最后将HelloWorld层添加到场景scene中;
      8  */
      9 Scene* HelloWorld::createScene()
     10 {
     11     // 'scene' is an autorelease object
     12     auto scene = Scene::create();
     13     
     14     // 'layer' is an autorelease object
     15     // 当调用到这句创建层的时候,会调用HelloWorld的实例函数init(),达到初始化HelloWorld层的目的。
     16     auto layer = HelloWorld::create();
     17 
     18     // add layer as a child to scene
     19     scene->addChild(layer);
     20 
     21     // return the scene
     22     return scene;
     23 }
     24 
     25 // on "init" you need to initialize your instance
     26 bool HelloWorld::init()
     27 {
     28     //////////////////////////////
     29     // 1. super init first
     30     // 初始化父类
     31     if ( !Layer::init() )
     32     {
     33         return false;
     34     }
     35     
     36     auto visibleSize = Director::getInstance()->getVisibleSize();
     37     Vec2 origin = Director::getInstance()->getVisibleOrigin();
     38 
     39     /////////////////////////////
     40     // 2. add a menu item with "X" image, which is clicked to quit the program
     41     //    you may modify it.
     42 
     43     // add a "close" icon to exit the progress. it's an autorelease object
     44     // 增加一个菜单项,单机的时候退出程序
     45     auto closeItem = MenuItemImage::create(
     46                                            "CloseNormal.png",
     47                                            "CloseSelected.png",
     48                                            CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
     49     
     50     closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
     51                                 origin.y + closeItem->getContentSize().height/2));
     52 
     53     // create menu, it's an autorelease object
     54     auto menu = Menu::create(closeItem, NULL);
     55     menu->setPosition(Vec2::ZERO);//自定义菜单对象的位置
     56     this->addChild(menu, 1);//把菜单对象添加到当前HelloWorld层上
     57 
     58     /////////////////////////////
     59     // 3. add your codes below...
     60 
     61     // add a label shows "Hello World"
     62     // create and initialize a label
     63     
     64     //添加label标签标题
     65     auto label = Label::createWithTTF("Hello World", "fonts/Marker Felt.ttf", 24);
     66     
     67     // position the label on the center of the screen
     68     label->setPosition(Vec2(origin.x + visibleSize.width/2,
     69                             origin.y + visibleSize.height - label->getContentSize().height));
     70 
     71     // add the label as a child to this layer
     72     this->addChild(label, 1);
     73 
     74     // add "HelloWorld" splash screen"
     75     //添加精灵,也就是cocos2d-x的logo,定义到屏幕中央
     76     auto sprite = Sprite::create("HelloWorld.png");
     77 
     78     // position the sprite on the center of the screen
     79     sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
     80 
     81     // add the sprite as a child to this layer
     82     this->addChild(sprite, 0);
     83     
     84     
     85     return true;
     86 }
     87 
     88 // 菜单回调函数(返回主界面)
     89 void HelloWorld::menuCloseCallback(Ref* pSender)
     90 {
     91     //Close the cocos2d-x game scene and quit the application
     92     Director::getInstance()->end();
     93 
     94     #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)//IOS表示iOS平台
     95     exit(0);
     96 #endif
     97     
     98     /*To navigate back to native iOS screen(if present) without quitting the application  ,do not use Director::getInstance()->end() and exit(0) as given above,instead trigger a custom event created in RootViewController.mm as below*/
     99     
    100     //EventCustom customEndEvent("game_scene_close_event");
    101     //_eventDispatcher->dispatchEvent(&customEndEvent);
    102     
    103     
    104     
    105     
    106 //    PhysicsShape物理引擎类精灵(也属于精灵)
    107     
    108     
    109 //    节点
    110     //(1)创建节点
    111     Node * chilNode = Node::create();
    112     //(2)查找子节点
    113     Node *node = node ->getChildByTag(123);
    114     //(3)增加新的子节点
    115     node->addChild(chilNode,0,123);
    116     //(4)删除子节点,并停止该节点上的一切动作
    117     node->removeChildByTag(123,true);
    118     //(5)通过NOde指针删除节点
    119     node ->removeChild(node);
    120     //(6)删除所有子节点,并停止这些节点上的一切动作
    121     node ->removeAllChildrenWithCleanup(true);
    122     //(7)从父节点中删除 node 节点,并停止该节点上的一切动作。
    123     node->removeFromParentAndCleanup(true);
    124     /*Node重要属性*/
    125 //    setPosition; 坐标
    126 //    setAnchorPoint(Vce2(0.5,.05)); 锚点
    127     
    128     
    129     
    130     
    131     //坐标
    132 //    Vec2 touchLocation = touch ->getLocationInView();
    133 //    Vec2 touchLocation2 = Director::getInstance()->convertToGL(touchLocation);
    134     
    135     
    136 }
    137 
    138 
    139 /**
    140  cocos2d-x的事件响应机制:即菜单层最先接收到系统事件,则排在后面的是精灵层,最后是背景层,在事件的传递过程中 ,如果有一个层处理了该事件,则排在后面的层将不再接受到该事件。
    141  */
  • 相关阅读:
    Python 模拟登录几种常见方法
    python 中列表 元组 字典 集合的区别
    Python3(十二) Pythonic与Python杂记
    Python3(十一) 原生爬虫
    Python3(十) 函数式编程: 匿名函数、高阶函数、装饰器
    Python3(九) 闭包
    Python3(八) 枚举详解
    Python3(七) 正则表达式与JSON
    Python3(六) 面向对象
    labix.org/mgo包连接池泄漏问题
  • 原文地址:https://www.cnblogs.com/luorende/p/6980505.html
Copyright © 2020-2023  润新知