谢云山
(湖南科技学院 电子与信息工程学院, 湖南 永州 425199)
最近几年,移动通信和互联网成为当今世界发展最快、市场潜力最大、前景最诱人的两大业务。它们的增长速度是任何预测家都未曾预料到的。迄今,全球移动用户已超过15亿,互联网用户也已逾7亿,中国移动通信用户总数超过3.6亿,互联网用户总数则超过1亿。移动互联网正逐渐渗透到人们生活、工作的各个领域。据ComScore对苹果应用软件店(Apple APP Store)一份全面的研究报告中显示,人们在iPhone和iPod touch上使用最多的软件是游戏。其中,游戏软件中70%~75%为3D游戏软件。
20世纪60年代,战争的硝烟在整个欧洲大陆上弥漫,盟军在大陆上的作战陷入了焦灼状态。为了牵制敌军的行动并最终取得决定性的胜利,玩家的使命就是:尽最大可能消耗敌人的入侵部队,阻止敌人的进攻。面对滩头上潮水一般涌来的敌人,唯一能依靠的就只有身后那门威力无比强大的海防炮台。
抢滩登录游戏的操作很简单,运用上下左右键调整大炮的方位和角度,瞄准敌方坦克,按下空格键就可以发射炮弹来打击敌军。启动游戏后首先进入的是游戏的图标灰度渐变界面;之后自动进入到Logo灰度渐变界面;然后自动进入游戏声音设置界面,单击“是”,则开启游戏声音;单击“否”,则关闭游戏声音;声音设置完毕后,自动切换到游戏开始菜单界面;单击“游戏帮助”,则进入游戏帮助界面;单击“关于游戏”,则进入游戏关于界面;单击“游戏退出”,则退出游戏;当游戏结束后,则进入游戏结束界面;当进入游戏时,会有视角旋转来让玩家浏览场景;接着旋转视角,场景中还有坚固的炮台和威武的大炮,在镇守着海滨要塞;游戏中水上坦克将会逐渐驶向陆地,当其登录后,则会由陆地坦克进行登陆作战;进行游戏时玩家可以用上下左右键来控制大炮的轰击方向和位置,按下空格键发射炮弹;如果玩家轰击陆地,则播放爆炸效果动画;若玩家发射炮弹击中陆地坦克,则播放爆炸效果动画并击毁坦克,同时会有新的敌军来进攻,并且游戏左上角击中坦克计数加1;若玩家发射炮弹击中水上坦克,则播放爆炸效果动画并击毁坦克;如果玩家轰击水面,则播放爆炸效果动画。
随着网络的不断发展,战争类游戏越来越受到玩家的喜爱,可以单机对战,可以联网对战,惊险刺激,惊心动魄。《抢滩登陆》作为一款战争类射击游戏,模拟了登陆战争中激烈的战争场面。只要带着手机,玩家便可以随时随地进入虚拟战争世界,享受轰击敌军带来的游戏快感,满足玩家对游戏娱乐性的要求。
程序中的公司界面、Logo界面、开始菜单界面、声音设置界面、帮助界面、关于界面及结束界面均用2D技术实现。以上界面大部分继承和扩展自SurfacView并重写了其中的onDraw方法,并且所有的按钮均是笔者用贴图实现的,避免了使用Android自带控件,使游戏画面更加绚丽、个性。
游戏时的界面使用3D技术实现,游戏界面继承和扩展了GLSurfaceView并实现了Renderer接口,通过重写onKeyDown方法实现与用户的交互。
游戏开始菜单是游戏的一个重要界面,当一开始进入游戏设置完音乐后,就会进入这个界面。下面阐述一种横屏模式下带有滚动效果的菜单界面。开始菜单SurfaceViewMenu.java类是本设计最主要的类之一,其实现比较复杂。
(1)onDraw绘制方法,用于绘制位图。
@Override
public void onDraw(Canvas canvas){……}
(2)初始化菜单的方法,初始化当前及靠其左右的菜单项的位置大小参数。
public void initMenu(){……}
游戏菜单界面的实现,难点在ThreadMenu.java方法。该方法是用于控制菜单拖动的动画效果的线程,在特定的时间间隔后就会调用一次repaint方法对菜单界面进行重绘。Repaint方法的主要作用是重绘,其中调用了onDraw方法。
游戏中山地、海洋、坦克、大炮、炮弹、炮台、月球、星空及灯塔的创建基础均是根据圆面、圆柱体、圆锥体、长方体、球体中的一个或者几个拼接而成的。关于地图的生成,水面的实现方法,是分别运用了山地生成技术和飘扬的旗帜技术来完成实现的。山地生成中为了使场景更加真实,在生成山地时做了一定的改动。对于场景中的拼装物体,如大炮、坦克、炮台和灯塔,实现方法都比较相似。
关于在场景中物体的运动,包括水上坦克的运动、陆地坦克的运动,以及炮弹的运动,还有光源的旋转、摄像机的旋转、月球的旋转,以及星空的旋转。由于物体的运动实现是有些相似的,所以,我们以炮弹的运动和月球的旋转运动为例来阐述物体运动的实现。
在实现炮弹的运动中,因为炮弹同一时间存在的数量可以很多,所以将场景中存在的炮弹放在一个炮弹列表中,当需要绘制场景时从列表中逐个扫描炮弹,并用一个逻辑类LogicalBullet.java来控制当前扫描到的炮弹的位置、速度的大小和方向并检测是否发生碰撞,若碰撞则发生爆炸并播放爆炸动画,若没有碰撞则引用DrawBall实例来绘制炮弹。
4.5.1 公共类
主类Activity_GL_Demo.java通过继承和扩展基类Activity来实现的,是整个应用程序的入口。主要根据收到的Handler消息的不同切换到不同的界面,并且控制声音播放和场景渲染的暂停和恢复。常量Constant.java类记录程序中所有类需要用到的常量,便于以后的修改。
4.5.2 2D界面类
图标渐变界面 Surfac洳ewTag.java类,该类用于公司图标等的渐变实现。声音设置界面SurfaceViewSound.java类,该类是声音设置界面的实现类,主要负责声音设置界面的绘制,控制游戏中声音的开关。开始菜单界面SurfaceViewMenu.java类,这个类是开始菜单界面的实现类,实现开始菜单界面的绘制,是连接整个程序中各类的一个集中地,能根据单击不同的菜单向Activity_GL_Demo.java发送不同的Handler消息。帮助界面SurfaceViewHelp.java类,游戏帮助界面由这个类实现,用来绘制游戏帮助界面,以显示游戏的规则、操作等信息。关于界面SurfaceViewAbout.java类,该类是游戏关于界面的实现类,主要负责游戏关于界面的绘制,显示游戏相关信息。游戏结束界面SurfaceViewOver.java类,该类是游戏结束界面的实现类,绘制游戏结束界面,显示玩家的得分情况和提供再玩一次的功能。
运用高等数学中的向量理论,运用向量知识解决场景中的碰撞问题,主要包括炮弹与山地的碰撞,陆地坦克与山地的碰撞,陆地坦克与海面的碰撞,以及水上坦克与陆地的碰撞。进行炮弹与山地碰撞检测的最终目的是为了判断炮弹在何时爆炸,已知炮弹的实时位置和速度。思路如下。矩形为陆地平面上的一个网格,因为整个地图都是由类似的这些生成三角形拼接而成的,只是陆地平面中的网格是按像素来划分的,人眼很难辨别,所以看上去像是真实的山地地图场景,所以在此我们将以拼接三角形来阐述炮弹的碰撞检测。
对于炮弹碰撞山地的检测。确定炮弹所在位置对应的陆地平面的行、列。求出炮弹所对应的平面位置所对应的场景中山地的高度。比较炮弹当前位置和对应山地高度的大小。如果炮弹当前位置高于对应山地的高度,则没有碰撞,炮弹继续运动;否则,发生碰撞。
基本算法思想:首先分别求出0号点到1,2号点的矢量,然后由两个矢量求叉积,得到三角形平面的法矢量(B,C),接着通过法矢量和o号点坐标可以写出三角形平面的方程A(x-xo)+B(Y-Yo)+C(z-zo)=0,然后可以推导出在xz平面上的点对应点的y坐标的求值公式y=(C(zo-z)+A(xo-x)/B+Yo,最后通过该求值公式求出指定xz平面上的点对应的地图上点的y的值。
在本游戏中,关于陆地坦克与山地的碰撞检测、陆地坦克与水面的碰撞检测,以及水上坦克与陆地的碰撞检测的方法和炮弹与山地的碰撞检测相似。
如果能在游戏的最后加上游戏成绩的存储与排行,会大大提高玩家对本游戏的体验。另外,游戏应该开发成多种模式,不同的模式带来不一样的体验,单一的模式会让游戏很快失去对玩家的吸引力。同时应该添加游戏难度的选择功能,使玩家根据自己的情况选择不同的等级进行游戏,这样才更加合理。
[参考文献]
[1]吴亚峰,于复兴.Android 3D游戏开发技术详解与典型案例[M].北京:人们邮电出版社,2012.
[2]谢明山,邓艳芳.Android环境下开发五子棋游戏关键技术研究[J].电子世界,2014(14):390.
[3]于宝华,贾于博,谷苏港.基于Android的高校学生毕业设计管理系统设计[J].福建电脑,2017(12):390.