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

游戏的入口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,这时游戏会弹出暂停场景。上面函数中的一些类和方法,我们会在后面讲到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值