文档章节

仿《雷霆战机》飞行射击手游开发--游戏的入口

雁惊寒
 雁惊寒
发布于 2017/01/20 13:36
字数 946
阅读 381
收藏 0

游戏的入口AppDelegate

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

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

bool AppDelegate::applicationDidFinishLaunching()
{
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if (!glview) {
        //定义在Windows下运行窗口的大小
        glview = GLViewImpl::createWithRect("Raiden",
            Rect(0, 0, CONSTANT::DESIGN_RES_WIDTH * CONSTANT::RES_RATIO, CONSTANT::DESIGN_RES_HEIGHT * CONSTANT::RES_RATIO));
        director->setOpenGLView(glview);
    }

    //横屏和竖屏选择不同的缩放模式
    auto frameSize = glview->getFrameSize();
    if (frameSize.width >= frameSize.height)
    {
        director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::SHOW_ALL);
    }
    else
    {
        director->getOpenGLView()->setDesignResolutionSize(CONSTANT::DESIGN_RES_WIDTH, CONSTANT::DESIGN_RES_HEIGHT, ResolutionPolicy::EXACT_FIT);
    }

    //设置帧率为60帧/秒
    director->setAnimationInterval(1.0f / 60);
    //设置搜索路径
    FileUtils::getInstance()->addSearchPath("res");

    //创建第一个要进入的场景
    auto scene = LoadingLayer::scene();

    //进入场景
    director->runWithScene(scene);
    //初始化第三方SDK
    BmobSDKInit::initialize("app_id", "app_key");

    return true;
}

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

创建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<PlaneLayer*>(GameLayer::getPlaneLayer());
    HubLayer* pHubLayer = dynamic_cast<HubLayer*>(GameLayer::getHubLayer());
    if (pHubLayer && pPlaneLayer && !pPlaneLayer->isPause())
    {
        pHubLayer->menuPauseCallback(nullptr);
    }
}

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

 

转载请注明:https://my.oschina.net/u/1986600/blog/828334

项目首页:https://www.oschina.net/p/raiden

© 著作权归作者所有

雁惊寒
粉丝 20
博文 13
码字总数 20195
作品 1
南京
程序员
私信 提问
thorqq/RaidenFree

功能介绍 本游戏是一款基于Cocos2dx开发的纵版飞行射击单机手游。玩家可以控制一架飞机与敌机进行对战,飞机可以发射子弹、导弹甚至激光,除此之外,玩家还能对自己的飞机进行强化改造,提升...

thorqq
2017/01/20
0
0
cocos2d-x支持c++、js、lua开发

作者:左文 链接:https://www.zhihu.com/question/21130385/answer/21789568 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 纯属个人观点 1 Unity3d支...

壹峰
2017/10/18
201
0
写给对 ”游戏开发” 感兴趣的朋友们

我们程序员能为世界带来什么? 有些程序员做出了 淘宝/Amazon,为世界带来了电子商务。 有些程序员做出了 微信/Twitter,为世界带来了社交平台。 而有些程序员做出的东西,虽然无法应用于我们...

程序员小灰
03/05
0
0
仿雷电飞行射击手游--Raiden

游戏介绍 本游戏是一款基于Cocos2dx开发的纵版飞行射击单机手游。玩家可以控制一架飞机与敌机进行对战,飞机可以发射子弹、导弹甚至激光,除此之外,玩家还能对自己的飞机进行强化改造,提升...

雁惊寒
2017/01/20
8K
6
手游开发神器 cocos2d-x editor 教程聚合和代码下载(持续更新中)

一 cocos2d-x editor工具下载和基础教程: 一 手游开发神器 cocos2d-x editor初识 二 手游开发神器 cocos2d-x editor工具下载和安装配置 三 手游开发神器 cocos2d-x editor 之基础工具 inte...

makeapp628
2014/02/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 如果是个帅小伙你愿意和他出去吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《Ghost 》游戏《死亡搁浅》原声 《Ghost 》游戏(《死亡搁浅》原声) - Au/Ra / Alan Walker 手机党少年们想听歌,请使劲儿戳...

小小编辑
50分钟前
84
5
java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部