美文网首页Cocos2dx
cocos2dx AppDelegate源码分析

cocos2dx AppDelegate源码分析

作者: 凉拌姨妈好吃 | 来源:发表于2018-05-15 12:12 被阅读0次

作为游戏的主程入口,AppDelegate十分重要,它用于游戏程序的逻辑初始化,创建运行程序的入口界面
先来看看AppDelegate.h定义了什么样的成员函数

//导演和场景的初始化
 bool applicationDidFinishLaunching()
{
    //初始化一个导演类
    auto director = Director::getInstance();
    
  //这里拿变量来存储导演类的GLView,如果没有GLView就设置GLView属性
    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)
        
        //牵扯到一些小数据的问题,可以使用UserDefault来存储,存储为xml格式文件 
        std::string count = cocos2d::UserDefault::getInstance()->getStringForKey("account");
       
       //初始化程序窗口标题
        glview = GLViewImpl::createWithRect(utility::a_u8("游戏名称") + count, cocos2d::Rect(0, 0, 860,480));
#else
        glview = GLViewImpl::create(utility::a_u8("游戏名称"));
#endif

        //OpenGLView里包含了很多配置信息,包括设置的屏幕分辨率的配置信息
        director->setOpenGLView(glview);
    }

    //不开启状态显示
    director->setDisplayStats(false);

    //刷新频率,每秒60帧
    director->setAnimationInterval(1.0f / 60);
    
    //屏幕适配,在这里设置游戏的分辨率,有五种适配方式,下面说
    glview->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, ResolutionPolicy::EXACT_FIT);

    //使用包管理者去安装更多的包
    register_all_packages();

    reLoad();

    //创建一个场景
    auto scene = GQFlashScene::createScene();
    //运行该场景
    director->runWithScene(scene);

    return true;
}

总结一下上面的初始化函数:

  • 初始化导演类
  • 查看导演类的OpenGLView是否设置
  • 若无,设置窗口初始化、赋值给导演类的OpenGLView
  • 设置刷新频率、屏幕适配
  • 创建场景、运行
屏幕适配的五种方式(下节再细讲)
  • EXACT_FIT:拉伸变形,铺满屏幕
  • NO_BORDER:按比例伸缩,全屏展示无黑边(大图裁剪、小图无黑边)
  • SHOW_ALL:按比例伸缩,全屏展示(大图铺满屏幕,小图留有黑边)
  • FIXED_WIDTH:按照 窗体(手机)分辨率宽度/设计分辨率宽度 的比例,缩放设计分辨率画面。这种设计分辨率,适合于竖版游戏。美术出底图资源时,要保证高度足够,否则会穿帮。
  • FIXED_HEIGHT :按照 窗体(手机)分辨率高度/设计分辨率高度 的比例,缩放设计分辨率画面。这种设计分辨率,适合于横版游戏。美术出底图资源时,要保证宽度足够,否则会穿帮。

// 切换到后台
//下面这个成员函数是在应用闲置时调用,比如:用户接电话时

void AppDelegate::applicationDidEnterBackground() {
    //暂停游戏
    Director::getInstance()->stopAnimation();

    if (GameManagerBase::pInstanceBase())
    {
              //这是一个空函数。。。写了估计是为了和下面的Enter进行对照
              GameManagerBase::InstanceBase().applicationDidEnterBackground();
    }
}

// 切换到前台

void AppDelegate::applicationWillEnterForeground() {
    Director::getInstance()->startAnimation();

    if (GameManagerBase::pInstanceBase())
    {
        //当接完电话,重新进入该应用,会调用下面的函数,进行断线重连
        GameManagerBase::InstanceBase().applicationWillEnterForeground();
    }

    bool isExitPage = UserDefault::getInstance()->getBoolForKey("exit_upgrade_scene", true);
    if (!isExitPage) __NotificationCenter::getInstance()->postNotification("UPGRADE_NOTI");
}

相关文章

网友评论

    本文标题:cocos2dx AppDelegate源码分析

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