博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
仿《雷霆战机》飞行射击手游开发--游戏的入口
阅读量:5079 次
发布时间:2019-06-12

本文共 3315 字,大约阅读时间需要 11 分钟。

转载请注明: 

项目首页:

游戏的入口AppDelegate

    游戏启动后,首先实例化的是AppDelegate这个类,这这个类里,我们需要修改两个函数:applicationDidFinishLaunching和applicationDidEnterBackground。

    首先介绍applicationDidFinishLaunching(),游戏启动后,首先进入的就是这个方法,这里,我们可以设置游戏的分辨率、帧率、第三方SDK的初始化,以及第一次要出现的场景。

1 bool AppDelegate::applicationDidFinishLaunching() 2 { 3     auto director = Director::getInstance(); 4     auto glview = director->getOpenGLView(); 5     if (!glview) { 6         //定义在Windows下运行窗口的大小 7         glview = GLViewImpl::createWithRect("Raiden", 8             Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO)); 9         director->setOpenGLView(glview);10     }11 12     //横屏和竖屏选择不同的缩放模式13     auto frameSize = glview->getFrameSize();14     if (frameSize.width >= frameSize.height)15     {16         director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::SHOW_ALL);17     }18     else19     {20         director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::EXACT_FIT);21     }22 23     //设置帧率为60帧/秒24     director->setAnimationInterval(1.0f / 60);25     //设置搜索路径26     FileUtils::getInstance()->addSearchPath("res");27 28     //创建第一个要进入的场景29     auto scene = LoadingLayer::scene();30 31     //进入场景32     director->runWithScene(scene);33     //初始化第三方SDK34     BmobSDKInit::initialize("app_id", "app_key");35 36     return true;37 }

      这里需要注意下面这几点:

创建Windows窗口

glview = GLViewImpl::createWithRect("Raiden", Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO));

  这里是为在windows下运行的时候创建一个窗口。为了调试方便,我们在开发游戏的时候会先在windows下编译调试,等到windows版本调试通了,再编译android版本。Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO)定义了窗口的大小,其中的几个宏的定义如下:

const float DESIGN_RES_WIDTH = 540;    //宽度	const float DESIGN_RES_HEIGHT = 960;   //高度	const float RES_RATIO = 0.75f;

  由于本人的笔记本的高度小于960的,所以这里使用RES_RATIO来进行同比例缩小。如果这里不缩小窗口,则游戏窗口则会显示不全,而且更为严重的,是会出现鼠标点击定位不准的问题。

缩放模式

    我们使用了setDesignResolutionSize这个函数来设置缩放模式,其中,ResolutionPolicy的取值范围如下:

  • ResolutionPolicy::SHOW_ALL 屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。保证了设计区域全部显示到屏幕上,但可能会有黑边。
  • ResolutionPolicy::EXACT_FIT  屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高 与 设计高比 作为Y方向的缩放因子。保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸。
  • ResolutionPolicy::NO_BORDER  屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。保证了设计区域总能一个方向上铺满屏幕,而另一个方向一般会超出屏幕区域。
  • ResolutionPolicy::FIXED_HEIGHT和ResolutionPolicy::FIXED_WIDTH都是会在内部修正传入设计分辨率,以保证屏幕分辨率到设计分辨率无拉伸铺满屏幕。

    在本程序中,我们根据屏幕的宽高获知当前是横屏还是竖屏。如果是竖屏,则采用EXACT_FIT,以保证无黑边的全屏模式;如果是横屏,则采用SHOW_ALL,以防止游戏界面缩放变形。

 

游戏转入后台的处理逻辑

    当用户接了一个电话,或者按了home键使得游戏进入后台后,就会触发applicationDidEnterBackground()这个函数。

void AppDelegate::applicationDidEnterBackground() {    Director::getInstance()->stopAnimation();    //判断当前是否在游戏中,如果是,则使游戏暂停    PlaneLayer* pPlaneLayer = dynamic_cast
(GameLayer::getPlaneLayer()); HubLayer* pHubLayer = dynamic_cast
(GameLayer::getHubLayer()); if (pHubLayer && pPlaneLayer && !pPlaneLayer->isPause()) { pHubLayer->menuPauseCallback(nullptr); }}

这里我们只需要知道我们做了暂停游戏的动作,即menuPauseCallback,这时游戏会弹出暂停场景。上面函数中的一些类和方法,我们会在后面讲到。

 

转载请注明: 

下一篇,我们将进入LoadingLayer类探究游戏资源载入机制

转载于:https://www.cnblogs.com/thorqq/p/5638701.html

你可能感兴趣的文章
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
ES6内置方法find 和 filter的区别在哪
查看>>
Android实现 ScrollView + ListView无滚动条滚动
查看>>
java学习笔记之String类
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
硬件笔记之Thinkpad T470P更换2K屏幕
查看>>
蓝桥杯-分小组-java
查看>>
Android Toast
查看>>
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>
设计器 和后台代码的转换 快捷键
查看>>
STL容器之vector
查看>>
数据中心虚拟化技术
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>