APP下载

智能设备中跨平台游戏框架的设计与实现

2014-01-03石倩倩

电子测试 2014年2期
关键词:手纸跨平台管理器

石倩倩

(武汉邮电科学研究院,430074)

0 引言

目前的智能终端的应用开发技术作为移动互联网链上的关键环节,其关键技术的突破对于整个产业链健康和快速发展具有重要意义。智能终端应用开发技术基本都是针对具体操作系统平台提供针对性的开发语言和工具进行开发,开发者针对一个操作系统开发应用后,需要花费大量的时间和精力进行跨平台移植工作,导致开发周期长,开发门槛高。对于一个公司,甚至会有不同的部门去开发不同操作系统上的应用。而对于开发应用的公司来说,这些主流的操作系统都是不能舍弃的,谁也不能预测未来到底会朝向哪里发展,同时用户对于不同操作系统有不同的偏爱,我们无法说明哪一个更好或者更加优质。以开发游戏公司为例,要去为每个操作系统分别,单独的去开发游戏应用来说,代价太高。而基于跨平台引擎去开发应用能够大大减少开发的工作量,成本,以及开发周期。

1 跨平台引擎介绍

1.1 什么是跨平台游戏引擎

如果不使用跨平台的游戏引擎去开发游戏,那么必须在不同的平台,例如android,iOS,blackberry,windows phone 上单独的去编写代码。跨平台的优势就在于,它大大减小了开发人员的工作量。在开发过程中,可以只是用一种语言,同时进行一次编写工作,再在不同的编译环境下去编译,编译完成后生成不同运行环境的文件,就可运行在这些操作系统只上了。

1.2 什么是Cocos2d-x 游戏引擎

Cocos2d-x 提供的框架外,游戏可以写在C++或者LUA 中,使用API 和Cocos2d-iPhone 完全兼容。Cocos2d-x 项目可以很容易地建立和运行在iOS,Android,黑莓Blackberry 操作系统和更多操作系统之上。Cocos2d-x 还支持Windows、Mac 和Linux 等桌面操作系统,因此,我们可以编写的源代码很容易在桌面操作系统中编辑和调试,也可以很方便的移植进PC,平板,和智能电视中。

1.3 Cocos2d-x 游戏引擎的优势

作为Cocos2d 的C++版本,目前有大量Cocos2d 的经验分享。C++版本对于非本行业出身的人来说可能是一种福音。支持iOS、Android、Windows 等平台,跨平台开发者的福音。它是开源免费、易学易用、庞大的工具链支持。

1.4 Cocos2d-x 游戏引擎的劣势

每个平台有自己的特点,因此开发过程中有很多需要注意的地方。首先对于开发语言,Cocos2d-x 目前维护三种语言,C++,JS,C#。C#是专门为Windows phone7 设计的,这将导致原本用C++写的代码,在移植到Windows phone7 上需要做一个简单的语言翻译工作,JS 虽然可以跨平台,但是HTML5 还不够成熟,在PC 上效率完全很好,但是在手机,平板,智能电视上上则还有很多难题需要解决。

2 基于Cocos2d-x 游戏的设计

2.1 游戏的目标

这里给出一款游戏,名为“手指手纸”。该游戏基于Cocos2d-x 来设计游戏的框架。其思想是以厕所为主题,主页面就是厕所的场景,不同的设施就是对于不同的场景的按钮,当点击马桶是进入了模式的选择。在模式场景中,“小试牛刀”、“娱乐自身”和“挑战极限”对应于不同的模式。当用户点击任意一个模式后将进入游戏主体,出来一定张数的纸片,“小试牛刀”和“娱乐自身”模式中会记录消除所有的纸片的时间。时间越少排名将越靠前。在“挑战极限”模式中是指定的29s 内消除的张数,张数越多排名越靠前。

2.2 中心管理器类

如上图所示,一个简单小游戏,却有着很复杂的场景切换,例如结束场景,会根据不同情况切换到不同其他场景。如果这种切换工作都交由当前场景来完成,也就是在当前场景的类的方法中切换到其他场景,调用方法为“pDirector->replaceScene(pScene)”,显然,这样会更加复杂。而在这里,“手指手纸”游戏使用了一个负责管理整个游戏的管理器类。中心管理器帮助我们完成所有的工作。每个场景只负责加载层。在每个场景中不需要关心要切换到哪个场景。

2.2.1 中心管理器类的设计

下图为“手指手纸”游戏主体框架的设计:

图1“手指手纸”游戏主体框架的设计

游戏进入中心管理后进行的动作顺序为:

加载配置文件。得到关于声音的开或关,游戏模式的默认选择,和金币的数量等等配置。

进入logo 场景。首先需要加载所有的图片。

根据用户的选择,切换到不同的场景接口方法。

切换到下一个场景。

场景的返回方法。

存储和更新所有改变的数据。

在3 到6 中进行循环,直到用户退出游戏。

很显然,在这个设计框架中,中心管理器类相当于调度器或分发器,同网络互联设备中路由器的功能一样。它根据得到的信号或者值,去判断进入哪个场景。这样简化了场景设计的复杂度。也方便了游戏软件的再度利用。

在AppDelegate.cpp(Cocos2d-x 游戏的通用入口文件)中通过以下代码进入管理类中,实现进入整个游戏的分发中心。

在run 方法里面不停的根据情况调用切换不同的场景。以下是run 方法实现内容:

在这个方法中,首先根据给定不同的场景ID 去判断进入不同的场景,然后再在MainScenseRun()等这类方法中进行切换工作。

2.2.2 中心管理器框架设计的优点

通过中心管理器类去调度和分发游戏的场景,实现了游戏的可扩展性。当需要升级游戏版本,或者添加更多的场景时,利用这样的管理器类,方便了开发人员的维护。开发人员不需要再在其他的场景中进行再次添加和修改,只需要在中心管理器中添加场景的切换借口。

同时,由于很多的游戏都有类似处,例如同样的logo 场景,类似的排行榜,商店等,当开发另一款游戏时,通过这个中心管理器框架,可以很方便的调用以前已经实现好的场景功能,便于后续游戏的制作,和移植。

2.3 游戏主体场景中层的设计

2.3.1 层的概念

CCLayer 是处理玩家触摸事件的CCNode 子类。它隶属于场景之下的游戏元素,同时知道怎样渲染自己。可以修改它的透明度,游戏玩家就可以看到当前层下面的其他层。由于CCLayers 在我们定义游戏的外观和行为方面非常有用,所以,需要花很多编程时间编写CCLayer 子类。

2.3.2 游戏中层的设计

以“手指手纸”游戏为例,场景大致可以分为三层: 背景层:背景图片

菜单层:中间的各种菜单项

触摸动作层:实现触摸以及动作事件

层次结构如图2 所示:

图2“手指手纸”游戏场景中层的设计

当手指在屏幕上滑动,如果滑动的是最上面的一个精灵(手指在最上层纸片内滑动),精灵跟随手指的滑动而滑动,如果是纸片滑动一定距离,它将飞速划出屏幕,并消失。

在场景中,添加了3 个层,定义backGroundLayer 为背景层,buttonLayer 为菜单层,spriteLayer 为触摸动作层。如下调用是添加了这三个层次。

this->addChild(backGroundLayer);

this->addChild(buttonLayer);

this->addChild(spriteLayer);

把所有同类型的实现放在同一层次,不同类型的放在不同层次,方便了层与层的隔离。使得了复杂的场景简单化。

2.4 游戏部分呈现

2.4.1 智能手机中的呈现

“手指手纸”游戏在在经过框架的设计,代码的编写,以及3大主流平台的编译,生成后,可有效的运行在智能设备当中。以下是游戏在智能手机中运行时的呈现画面,智能电视,和平板中的运行效果并没有太大差异。图3 是游戏的最终实现画面。其他的排行榜和商店这里没有列出具体呈现。

图3“手指手纸”游戏呈现

2.4.2 其他智能设备的移植

若要呈现在智能电视中和平板电脑中,不同的只是分辨率上的差异,Cocos2d-x 2.0 以上的版本提供了多分辨率的适应。因此可以不需要使用多套图片资源,即能自适应进各种分辨率设备。setDesignResolutionSize()。

这个函数用于指定一个 OpenGL 视图,然后将这个视图映射到设备屏幕上。根据不同的设定,视图会自动缩放显示内容,为 Cocos2d-x 自适应多种分辨率提供了基本支持。

3 总结与展望

本文以一款游戏为例,介绍了如何使用跨平台游戏引擎开发,并且提供了基于它开发游戏的框架。本文使用的跨平台引擎为Cocos2d-x 游戏引擎。针对不同类型的游戏,通常只需要单独实现最上层的游戏逻辑系统,而剩余的模块完全可以复用。本文所提供的游戏框架方便再次使用,同时也更具扩展性。同时还实现了游戏的跨平台运行,该游戏能良好的运行在iOS, windows phone ,以及android 系统上。读者可在各平台应用商店下载。

[1] 陆钢,朱培军,李慧云,文锦军:智能终端跨平台应用开发技术研究.电信科学[J],2012,(05)

[2] 百度文库. 2013Q1 智能手机操作系统的市场排行榜.http://wenku.baidu.com/view/1b9c2e10b52acfc789ebc969.html

[3] 刘剑卓 .Cocos2d-x 游戏开发技术精解[M].北京:人民邮电出版,2013.105-108F

猜你喜欢

手纸跨平台管理器
跨层级网络、跨架构、跨平台的数据共享交换关键技术研究与系统建设
一款游戏怎么挣到全平台的钱?
启动Windows11任务管理器的几种方法
应急状态启动磁盘管理器
喷火的手纸
Windows文件缓冲处理技术概述
跨平台APEX接口组件的设计与实现
基于B/S的跨平台用户界面可配置算法研究
韦建昭
皇帝的丝绸手纸