(最新版)基于JAVA的游戏毕业设计论文(4)

2019-04-21 11:54

不能永远不出现,那就应采取其他的办法,否则两辆坦克将因为都处在碰撞状态中而无法移出。

在运行的线程中,需在每前进的一步骤中循环做下列事件: 如果坦克已死亡,立刻退出。(由boolean值destroyed决定)。

如果不是刚出现(由isBeginner决定),判断是否与将其他坦克发生碰撞,就向当前方向前进一步骤,否则,将需要循环检测的当前随机步数减少为原先的23(为了加速离开的时间)。如果刚出现,就直接走一步,具体如何行走将在go()函数中决定,并且此go()与UserSprite中的有所区别。

当随机发炮数减少到0时,就进行发炮的动作。发炮后应立即重新赋值给随机发炮数,以便重新倒数计算。

当所有的步骤走完后,因为需要转动方向,于是,调用一次随机取得方向的函数再次获值。其他的随机值也应当重置。

在go()函数中首先检测是否正处于碰撞状态中,如果不是,就需要取消Beginner的状态,因为不需要Beginner这样的特殊身份,让别的坦克不检测了。

在运行在某个方向上,当确定为canPass时,应再检测是否为Beginner。如果是,就不应该受到其他坦克的影响而直接改变坐标,但若不是,就应当远地不动。

4.5 子弹的运行和控制

子弹继承了Runnable,运行在独立的线程中。它拥有一个很重要的变量,isFromEnemy。它标识了该子弹是属于玩家的,还是敌人的,这样可以控制子弹在脱离坦克管束后的运行状态中的行为。其主要功能流程图如图4.3所示。

checkHit(int x,int y)调用了getTileIndex(x,y)获取当前子弹击中的是什么障碍物,如果返回了false就表示没有击中任何东西。当击中了需要作出反映的物体时,就分别采取措施:击中草时,由于没有定义相关函数,就不会有任何反映,会重合在草上正常通过;击中砖块时,将产生爆炸,调用setCell将当前块置为空,并产生爆炸效果。爆炸效果由tileExplode(x,y)根据需要爆炸的坐标点生成,其中将一个Sprite图片在界面上闪现150毫秒。爆炸效果需要将图片insert进第0层,这样才不至于被其他景物所覆盖,爆炸结束后layerManager会自动相应调整。击中钢筋时,将只产生爆炸效果。

16

setShootCheck(EnemySprite enemySprite[]);setUserSprite(UserSprite userSprite);

setEnemySprite(EnemySprite enemySprite)都是将相关的坦克传入到子弹类里来,以便确认来源或攻击目标。

在线程的循环中while ( (x < 155) && (x >=5) && (y >=5) && (y < 171))作为循环的条件可以控制子弹出界的范围。这几项参数在编写时很容易出错。它们反映了象素级处理的技巧。如果程序在子弹已经到达X轴的155坐标时仍允许子弹继续运行,子弹将一次性向右运行2个象素,到达157点。在随后的checkHit(RIGHT)调用中,它将检测它是否在x+3点,即160点击中了某个障碍物,但是1608=20。地图的tiledLayer对象中并不存在序号为20的块,最大只为19。此时ArrayOutOfBoundException异常就会抛出,程序终止运行。

子弹运行中,将用collidesWith(tiledLayer,true)测试是否碰撞上了地图。如果为真,就继续检测碰撞上了什么样的物体。这将针对四个不同的方向分别以象素级检测。如果击中了某样物体,那么checkHit自然会处理,子弹的生命周期结束,以break退出循环。

如果没有击中物体,就继续检测是否击中了某辆坦克。这根据子弹的来源分为两种情况。当来自玩家时,将首先检测所有的敌人发出的子弹,当发生子弹间的碰撞时,用户的子弹将被移除,虽然按照道理敌人的子弹同时也应被移除,但敌人子弹是运行在另一线程中的,应当由它自己来控制为好,用户的子弹只需要管理好自己的状态就可以了。如果没有和子弹发生碰撞,就检测是否与敌人碰撞,发生碰撞时,将敌人从layerManager中移除,并置为null,产生爆炸效果,敌人数量减少一位,敌人屏幕上数量减少一位。

如果是来自敌人的子弹,将同样检测与玩家子弹的碰撞,及与玩家坦克的碰撞如有碰撞,玩家生命数减少一位,位置重置。如果玩家生命已死亡殆尽,就需要在进行以上操作的同时将玩家坦克的位置放置到屏幕外的部分。因为layerManager的remove函数并不会真正将层移除。只是用户看不见而已。如果不放置到屏外,敌人坦克仍会被阻挡,子弹仍会再次击中用户坦克。这将会是很荒唐的场面。

为了能控制一辆坦克在同一时间只能发射一发子弹,在子弹生命运行结束时候,将调用userSprite.enableShoot()恢复坦克继续发炮的能力。因为在发炮期间,坦克的

17

再次发炮的功能是被锁定的。

18

结论

本程序设计实现使用J2SE为工具的坦克大战游戏的开发,采用从外部文件读取配置文件、自动控制敌人坦克运行的方式进行控制,具有一定的可玩性和复杂性。经过了细心的调试和排错解决了绝大部分的问题。

但几乎每一个计算机程序都会有这样那样的不足,尤其是未经过精心维护的非商业软件。即使是作为操作系统的各种版本的Windows也时常会发生许多类型的错误和漏洞。本游戏程序对于初涉此领域的毕业设计课题来说,尤其在开始初期,感觉逻辑复杂,难以控制,因此至今还有一些未能解决的bug。 目前发现的bug和未完善的功能列表如下:

1、敌人的人工智能变化较少,不够理想。

2、子弹和敌人经常会与画面的刷新的线程不同步,造成画面闪烁。

3、 由于每次子弹发射和每次坦克的移动的一个像素都会对所有坦克和所有子弹进行一次循环检查,并由于同时开的线程比较多,使得本来运行效率就不高的JVM运行异常缓慢。即使刷屏没有间隔也不会提高速度。尤其在坦克比较多,炮弹比较多情况下尤为明显。

4、有的时候开始LOGO不能正常显示。 已经解决的重要bug:

1、当发出子弹到达边界并同时还在草丛中时会抛出数组边界异常。 2、有时会莫名其妙的死机。

本科期间做过很多课程设计,大多规模很小。在各种应用软件和游戏中,我仍觉得对游戏的设计有极大的热情。因为其各个模块间的联系十分紧密,代码重复执行率高,当经过无数次的调试、修改后,能最终看到成品,有无比自豪的心情。大学期间做过银行取款机、图书馆管理程序等简单的数据库管理系统的课程设计,思想大致相似,变化范围有限,没有太多自己可发挥的余地。大家作品的最终结果都离不开同一个模式。相比一些数据库软件,游戏的设计有很多人情色彩和艺术思想的发挥,正式商业的软件的人性化界面和各个游戏间迥异的结构每每会让人有去开发的冲动。

19

游戏程序最大限度的利用了硬件条件,因此展现出的画面往往多彩绚丽、效果惊人。成功的游戏融合了三维运算、人工智能、音效处理等计算机多媒体的精华部分。本毕业设计建立在Java平台上,是本人以前未曾接触过的领域。凭着探索新知识的热情,我选择了该设计题目。

学习该平台背景和功能的时间远远超出了我想象的时间。在设计初期,为了画出一个简单的图形,需要花费一天的时间,为了使图形产生动态效果又会花费几天的努力。很多相关的技术,如需要使用到的线程、设计模式、Game包的新功能、高级、低级图形界面的使用、时钟的控制、贴图,每一项都需要花一定的时间去掌握和熟悉。更为困难的是,JAVA虽然是现在的主流技术,但是其应用主要形成在WEB开发领域,GUI的开发还是相对较少的,参考资料不是很多,在发觉中文资料的稀少后,为了进一步探索深层次的技巧,我花费了大量时间在sun的Java主页上,阅读了几十篇英文的技巧和代码样例。并经常在各大论坛出没提出遇到的问题。

在终于可以照猫画虎的写出一小段动画的代码时,已经过去了相当长的准备时间。我原以为这样的速度将无法完成毕业设计,但当掌握了大部分应用技巧时,剩下的游戏思路的设计就显得不是最大的障碍了。指导老师说Java的上手比较困难,需要配置的环境和掌握的背景比较多。现在看来的确是这样。

我在一星期内写了1500行代码,经过了几百次的调试,终于完成了现在的程序。原先认为不可能的事,我发现,如果有不畏困难的信心和肯钻研的勇气,就一定会完成,甚至达到意想不到的效果。

本程序打包后体积6M多,运行时如进行gc()内存回收可将运行时堆内存控制在50K以内,然而,回首80年代的红白机上的坦克大战原始游戏,将惊叹那样的商业软件的巧夺天工。华丽的界面,出色的人工智能,流畅的运行效果、多音效、双人操作控制,其二进制程序体积仅仅为24K。运行在12MHz,8K内存的硬件机器上仍不失流畅性和可玩性。而许多游戏程序需要大量的运行内存空间、1GMHz以上的处理器,仍运行不够流畅。机器代码级和基于虚拟机的半解释性处理的程序在这里得到了最大的对比。

20


(最新版)基于JAVA的游戏毕业设计论文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:淮南艺考文化课补习班哪家好

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: