作为游戏的主程入口,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");
}
网友评论