何向文
(湖南科技学院 电子与信息工程学院,湖南 永州 425199)
街头篮球机是一项源于美国流行世界的现代体育竞枝项目,属于街头篮球文化的一部分,是一项适合全民健身、老少皆宜的具有较强竞技性、趣味性的运动新项目。投篮机是把篮球运动中的投篮动作独立出来,设计成一种专门用于投篮的练习设备。其种类很多,有“儿童篮球机”“双人篮球机”和“单人篮球机”等。由于其时尚的外形和动感的音乐效果,很快就流行到了世界各地。
“疯狂投篮”游戏的操作很简单,只需用手指轻触屏幕上的篮球并将其甩出,通过控制甩的力度和方向来调整球的速度和球的走向,进行投篮,在规定时间内得尽可能多的分数即可。该游戏的运行步骤如下。
(1)启动游戏后首先进入的是公司图标界面。(2)自动进入游戏声音设置界面,单击“是”链接,则开启游戏声音;单击“否”链接,则关闭游戏声音。(3)声音设置完毕后,自动切换到游戏开始菜单界面,该界面共有4个菜单,分别是开始游戏、帮助、关于及退出。(4)在开始菜单界面若单击“帮助”按钮,则进入游戏帮助界面,该界面介绍了本游戏的游戏规则和游戏控制方法。(5)在开始菜单界面若单击“关于”按钮,则进入游戏关于界面,该界面介绍了关于本游戏的相关信息。(6)在开始菜单界面若单击“退出”按钮,则退出游戏。(7)在开始菜单界面若单击“开始游戏”按钮,则首先切换到游戏加载画面,加载游戏,由此开始“疯狂投篮”游戏之旅。(8)游戏加载成功后,则进入游戏界面。一开始,屏幕下方有3个篮球,静止于地板,屏幕左上方的数字用来记录玩家得分,右上方的数字表示倒计时的时间。玩家可以通过手指甩动篮球进行投篮。(9)游戏中,一旦玩家投出去了球,则开始倒计时。(10)游戏中,如果玩家投出去的球进了篮筐,则相应地增加玩家得分。(11)游戏中,如果玩家投出去的球没有进入篮筐,则不增加玩家得分。(12)游戏中,玩家投出去的球落到地面后便自动回滚到屏幕下方。(13)游戏中,如果倒计时到0,则此轮游戏结束,进入游戏结束界面。游戏的功能阐述完毕。本游戏只有一种快速游戏模式,后续开发中可自行添加如限分模式、剧情模式等,以增加游戏难度,提高游戏的可玩性。
现代社会人们工作日益繁忙,通过参加体育活动来放松的时间越来越少。因此,“疯狂投篮”作为一款体育类游戏,模拟了现实世界的体育活动,只要带着手机,玩家便可以随时随地进入虚拟体育世界,享受体育带来的乐趣,满足玩家对体育娱乐性的要求。
“疯狂投篮”的可玩性强,需要玩家在规定时间内得尽可能多的分数。游戏过程中玩家不仅需要控制投篮的方向,还要恰到好处地掌握好投篮的力度,只有协调好这两个因素,才能将球顺利投进篮筐,这也是游戏的魅力所在[1]。
如果程序中需要对图片进行不等比例的拉伸时,可使用Android sdk安装目录下tools文件夹中的draw9patch工具对图片进行处理,以达到更好的拉伸效果。
2.2.1 游戏中用到的主要技术
程序中声音设置界面、开始菜单、帮助界面、关于界面、加载界面及结束界面均用2D技术实现。以上界面均继承和扩展自SurfaceView并重写了其中的onDraw方法,所有的按钮均为笔者用贴图实现,避免了使用Android的自带控件,使游戏画面更加绚丽、个性。
游戏时的界面使用3D技术实现,游戏界面继承和扩展了GLSurfaceView并实现了Renderer接口,通过重写onTouchEvent方法实现与用户的交互。
本游戏开发中使用的碰撞检测是一大难点,运用到了数学中的向量知识和相关的物理知识。实际商业化游戏开发中,往往使用的碰撞检测算法更效率、更准确、更成熟。而这些算法都是由数学家研究的。
2.2.2 游戏的框架与游戏界面类的设计与实现
(1)启动游戏后,首先在BasketballActivity中初始化,闪过界面。(2)在BasketbalLActivity中初始化SoundView,将用户界面切换到声音设置界面。(3)设置完游戏声音后,SoundsView通过重写其onTouchEvent方法,向BasketbaIIActivity中的消息管理器发送消息,初始化MenuView,并通过调用MenuThread线程绘制开始菜单界面,将界面切换至开始菜单界面。(4)在开始菜单界面MenuView中,单击不同的按钮,将向BasketballActivity中的消息管理器发送不同的消息,进入不同界面。如单击“帮助”按钮,则向消息管理器发送消息,进入帮助界面。(5)当单击“开始游戏”按钮时,先向消息管理器发送消息,初始化LoadView,将开始菜单切换至游戏加载界面。(6)在加载界面加载动画完成时,向消息管理器发送消息,初始化GLGameView,进入游戏界面。首先GLGameView会初始化背景类、球类等场景类来绘制场景。同时将启动线程BallGoThread来改变球运动的位置及其状态,刷新游戏界面,进行动画的绘制,同时通过调用CollisionUtil类来进行碰撞检测。(7)游戏界面类需要初始化的类为:BackWall,LeftWall,RightWall,Floor,Roof,Board,Ring,Cylinder,Assemble,Panel,Score,Deadtime,BallForDraw,LogicalBall,BallGoThread。(8)在MenuView中一旦单击“开始游戏”按钮则启动线程DeadTimeThread来实时判断倒计时是否到零。如果到零则向消息管理器发送消息,初始化OveView,进入结束界面。(9)在结束界面,如果触摸屏幕的“再玩一次”字样,则向消息管理器发送消息,将结束界面切换到开始菜单界面。
本游戏中的界面有很多,包括游戏主菜单、帮助界面、关于界面、加载界面及结束界面。但实现方式类似,均继承了SurfaceView。
游戏开始菜单是游戏的一个重要界面,当一开始进入游戏,设置完音乐后就会进入这个界面,而游戏胜利后,依然回到该界面。开始菜单MenuView类是本程序最主要的类之一,其实现比较复杂。
本游戏为3D游戏,游戏界面继承了GLSurfaceView,游戏界面的主要作用是组装各个已经实现了的部件,并进行游戏结束的判断。
本游戏场景由较多部件组成,由于篇幅有限,笔者在这里只给出较为典型的部件的绘制。游戏中的墙壁、地板、屋顶、仪表板和计分均采用矩形贴纹理的方式实现,即绘制一个矩形,然后对其贴背景或者地板的纹理,然后进行平移和旋转,把背景和地板放置到游戏界面合适的位置。
篮板的实质是一个正六面体,其正面贴有篮板的纹理。正六面体的中心点与其坐标原点重合,这样在以后调用时会很方便。真实篮板的整体绘制需要非常复杂的数学模型,包括圆环、圆柱和六面立方体。用圆环知识构造篮环,用圆柱知识构造篮筐支架,用六面立方体的知识构建篮板。
由于倒计时的纹理是采用分割位图来获得的,并且倒计时的变化是通过特定的DeadtimeThread.java来控制的。
为了实现真实的篮球运动效果,本游戏中篮球的运动抛物线完全模拟现实中的篮球运动的拋物线轨迹[2]。
进行篮球与篮筐的碰撞检测的最终目的是为了判断篮球是否投进篮筐,编写CollisionUtil.java主要考虑的是篮球与篮筐碰撞的情况,即已知篮球碰撞前的速度、篮球撞击时的位置、篮球撞击时的撞击点,得出篮球撞击后的反弹速度。思路如下:(1)求篮球碰撞后的反弹速度。(2)求篮球的撞击点。
在整个游戏当中,篮球不仅会和篮筐发生碰撞,还会与墙壁、地板和屋顶发生碰撞,所以同样要对其进行碰撞检测。由于将速度分成了沿XYZ轴的分速度Vx,Vy,Vz,所以每次碰撞时,只是垂直于碰撞面的分速度的方向变成它的相反方向,其余分速度方向不变。
在2D游戏中,触屏游戏的物体拾取只需判断所触屏幕点的坐标与所要拾取的物体所在点的坐标(物体投影到屏幕上的坐标)的关系,如果所触点坐标在物体所在坐标范围内表示拾取到物体,则可以进行下一步操作,反之则不执行拾取操作。
在3D游戏中,同样要判断所触屏幕点的坐标与所要拾取的物体所在点坐标的关系,但所要考虑的就不光是屏幕触控点的问题了。3D物体处于三维立体空间中,不同物体不一定处于同一平面,这时候就要从手指所触屏幕点对应的3D空间中的点沿目光方向向远处发出一条射线,第1个与射线相交的物体即是要拾取的物体[3]。
在玩家眼中,好的游戏总会是有声有色、丰富多彩的,离开了生动的音效,游戏的体验就会大打折扣,所以对音效的处理是游戏开发中必不可少的。本游戏中,对音效的处理并不够完善,有能力的玩家可以在适当的地方添加上音效,以提升玩家的体验感。
[参考文献]
[1]吴亚峰.Android3D游戏开发技术详解与典型案例[M].北京:电子工业出版社,2012.
[2]吴志霞.基于Android平台的“战斗士”游戏软件案例设计及实现[J].九江学院学报,2016(1):67-69.
[3]弋改珍,赵丹.基于Android平台的飞机游戏的设计与开发[J].计算机技术与发展,2016(7):183-186.