休闲游戏大白版泡泡堂的设计与实现

2017-04-27 14:11武思齐
电子技术与软件工程 2016年15期

武思齐

摘 要 大白版泡泡堂游戏使用Visual C++和MFC开发,游戏画面精美,用户体验良好,达到Q版泡泡堂的基本功能,并且在原有游戏界面上进行一定改进。但是“关于如何判断玩家当前是否应该运动、当前往哪个方向运动、当前是已经到达目标单元格只需要修正到中间,还是尚未到达目标单元格需要走到目标单元格”的问题未解决。这篇文章针对存在的这些问题,进行了分析,提出了通过设定多个标记变量,像素推导所在单元格的方法的解决问题。最终实现了自动生成地图、武器数量限制、背景音乐、网格吸附、敌人寻找建筑安放炸弹、敌人遇见我方自动安放炸弹,分数自动累加的功能。游戏推出后,用户体验良好。

【关键词】泡泡堂游戏 C++ MFC 炸弹游戏

1 背景

《泡泡堂》是由韩国游戏公司Nexon开发的一款休闲游戏。游戏讲述了在哈巴森林的一个村落的村民们利用神奇的水泡来打猎和采集宝石,故事由为拯救村民和夺回被海盗抢去的宝石而展开。游戏画面精美,功能友好,得到了很多人的欢迎和喜爱,并且风靡一时。我们根据Q版泡泡堂为灵感,以《泡泡堂》为原型,以大白(Baymax)--迪士尼动画《超能陆战队》中的健康机器人为角色,设计开发一款大白版泡泡堂游戏,讲述大白通过采集宝石攻击敌人,摧毁邪恶势力的故事。游戏更加生动有趣,容易上手,可以满足玩家的娱乐需求。

2 游戏需求

2.1 功能需求

(1)游戏需要设定游戏元素,摆阔建筑物、人物、地图、炸弹均为自己构造的类对象;

(2)游戏初始化:以一个二维vector存储建筑物地图并绘制,生成电脑玩家和用户玩家角色的类对象;

(3)安置炸弹:在释放处生成一个炸弹类对象并根据释放者角色配置炸弹和颜色等;

(4)炸建筑、敌人:炸弹以所在位置为原点,向上下左右搜索相应的地图方块,根据地图数组判断攻击范围内有无可炸元素,如有,摧毁之,自己的炸弹伤不到自己;

(5)电脑玩家移动:电脑玩家随机选择一个方向,在该方向前方无障碍的情况下朝该方向移动,遇障碍物则转方向,若任意时刻四周有可炸的建筑物或者敌人,则自动安放炸弹;

(6)分数统计:每个人物对象有数据成员记录分数,炸开一个建筑物+10分,炸死敌人+1000分;

(7)死路规避:生成地图时,若人物被包围在不可炸的建筑物中,则人物处于死路里。解决方案:生成人物时,清空以人物为中心的九宫格内的建筑。

2.2 存在难点及解决方式

在制作游戏的过程中,存在着以下六个较难实现的问题,针对这些问题提出了简单的解决方法。

(1)屏幕上同时需要管理的对象实例很多,比如说有人,建筑物,炸弹等等,但是只要程序逻辑清晰,可以解决;

(2)对象间关系紧密复杂,如炸弹-建筑关系、建筑-人物关系,人物-人物关系,所以要设计好对象之间关联方式;

(3)电脑用户需要一定的智能以自己行动,需要简化行动规律,用简单代码写出活动的算法;

(4)敌我判断,防止误伤:可以炸弹记录主人信息,若是主人则不摧毁;

(5)元素吸附网格、多键响应问题:需要多个标记变量解决问题,通过像素推导所在单元格;

(6)电脑玩家遇见我方知道袭击:通过把我方当做建筑来判断来解决。

3 游戏设计及实现

3.1 游戏设计

游戏以Flash上 Q版泡泡堂为原型复刻一个BayMax版泡泡堂,开发环境使用Visual C++ 6.0,MFC工程;达到Q版泡泡堂的基本功能,包括安置炸弹、炸开建筑、炸死敌人、敌人自动移动等;大致复制Q版泡泡堂的功能:自动生成地图、武器数量限制、背景音乐、网格吸附、敌人寻找建筑安放炸弹、敌人遇见我方自动安放炸弹,分数自动累加等功能。

3.2 游戏实现

大白版泡泡堂要实现游戏角色在自动生成的地图中活动,玩家通过方向键控制角色上下左右移动,空格键释放炸弹,炸弹沿上下左右方向释放爆炸威力,以炸开一些建筑或者炸死敌人。下面介绍游戏主要部分的实现方法。

3.2.1 类及成员

游戏中设置Game、Player、Building、MapOfBuilding、Bomb类,类之间相互联系、相互制约。

Game类中包括drawScore,getcomputerPlayerPointer,getPlayerPointer,theBomb等成员。

Player类中包括moveToNextUnit,getScore,getXpos,getYpos等成员。

MapOfBuilding类中包括drawMap,theVectorMap等成员。

3.2.2 运行流程图

如图1所示。

3.2.3 重点类,函数实现

(1)View类OnDraw函数。为了使贴图思路清晰,所有会改变画面的操作都不立即重新贴图,而是只改变类对象的属性,当Timer事件触发,OnDraw函数根据当前所有存在的类对象的属性值重绘整个画面。这样做可以使凡是与绘图有关的代码改变,只要改OnDraw函数里的内容就行,不用到处找按键消息响应的地方,思路清晰,易于维护。下面介绍函数的实现方法:

Draw Map:

if (玩家用户存活|| 电脑用户存活){

if (玩家的炸弹攻击到电脑){

if (玩家用户存活)-----显示玩家胜利

else显示玩家失败

Draw Bomb:

如图2所示。

(2)解决网格吸附的问题。游戏人物每次必定停在10*10的网格中某一个的正中间,这要求人物在一次按键响应之后的每次Timer激发移动一定像素,而在到达预定单元格中间位置时停止运动。所以,在Timer激发时,如何判断当前是否应该运动、当前往哪个方向运动、当前是已经到达目标单元格只需要修正到中间,还是尚未到达目标单元格需要走到目标单元格,就成了很重要的问题。我们可以通过Player类MoveToNextUnit函数解决网格吸附的问题,函数流程图如图3所示。

4 总结

泡泡堂游戏的风靡全球不仅因为其游戏充满故事性,画面制作精良,还得力于游戏成熟的技术和易于操作的界面。我們开发的大白版泡泡堂借鉴了之中的优点,实现了Q版泡泡堂中的大部分功能,解决了诸如元素网格吸附,多键相应,电脑用户智能运动,以及地图生成等难题,可以为其他爱好者拿来借鉴。但是在游戏界面的制作上,由于我们的绘图能力不够强,在界面的制作上仍有许多改进和完善的地方,我们会继续改进界面,完善功能。

参考文献

[1]刘变莲,刘东波.MFC与Windows程序[J].电脑知识与技术,2015(32).

[2]朱全银,章慧,孙文杰.基于J2ME及J2EE的移动网络游戏关键技术研究[J].计算机工程与设计,2008(20).

[3]赵丽娟,朱全银.基于J2ME的移动网络游戏设计与实现[J].网络与通信技术,2010(12).

[4]马栋,邱烨.泡泡堂游戏开发技术浅析[J].硅谷,Silicon Valley,2009(20).

作者单位

四川大学计算机学院 四川省成都市 610225