标题 | 基于JAVA设计炮台打飞机小游戏的问题分析 |
范文 | 田如柏 符传锐 王瑞婷 摘要:近年来,JAVA以其简单性,可移植性和平台无关等特点,广泛应用于Android应用、金融业应用、网站、嵌入式领域等,所以JAVA成了许多编程者的主要选择。像炮台打飞机、贪吃蛇,五子棋等一些小游戏是初学者实战的很好例子。 关键词:JAVA;炮台打飞机;编程;游戏 炮台打飞机的游戏我们经常玩,所以对大家来说都不陌生,对于初学者来说确实是一个不错的选择。但是对初学者来说确实会遇到很多问题,所以我们在这里做一些简单的介绍。 1 游戏世界 现在的游戏,能够在正确的位置绘制出正确的图形,使用屏幕空间和游戏空间是必不可少的。我们需要一个空间,用来保存整个游戏世界里面的数据,在每一次游戏更新画面的时候,取出要进行更新的那一部份数据,将其绘制在屏幕上。在游戏世界中一般使用笛卡儿坐标系,而在绘制图像中一般使用屏幕坐标系。在游戏世界中使用笛卡儿坐标系是因为处理方便。而绘制图像使用屏幕坐标系是因为很多的标准绘图函数提供的接口都是使用屏幕坐标系,包括C,JAVA,OPENGL和DIRECTX。所以,这项代码的编程难度,就是坐标空间的转换。具体的实现方式有很多,也有很多前辈封装好的转换函数,大都用矩阵的乘法来进行运算。我们自己写了一套平移,旋转,翻转和缩放的代码。这个CLASS的实现,方便了我对于坐标的理解,有了这个CLASS的帮助,只需要在笛卡尔坐标系下对游戏中运动的物体进行每帧位置的更新即可,而不需要把使用屏幕坐标系进行位置更新。这样不仅代码简单,也利于游戏的移植。 2 飞机刷新 游戏之所以有趣,就在于其变数,俗称随机性。每一次开始游戏,都可以遇到不同的事件,这会引起玩家不断挑战的欲望。一般的游戏,都会配备一个地图编辑器,就像魔兽争霸的世界编辑器。这些东西的存在很好的划分的了游戏引擎和游戏内容,而且允许玩家創建属于自己的游戏世界也会让游戏能存活得更久。说来惭愧,我们只是创建了一种生成飞机的方式。具体的做法是:用一个值timePass保存已经逝去的时间,当然他的初始值为0。在每一次游戏循环中,不断的读取当前的时间time,让timePass+=time。在每一关里面,都有一个生成飞机的控制:当当前时间大于x秒的时候,消耗y秒,生成一个z类型飞机,每一次生成飞机之后,timePass=y。这样做主要是防止出现不断的刷新飞机的情况。 3 主动刷屏 FPS是每个即时游戏的基础,也是游戏和软件最大的不同之处。软件倾向于被动刷新,即等待系统的REPAINT消息,而游戏则要求主动刷新。由于人眼睛每秒钟最多捕捉24张画面和滞留效应,电视的制作得以成为可能。而电子游戏的成功也离不开。对于一般的智益类游戏来说,FPS大于24即可,这也是老式DOS游戏的标准刷新频率。而对于动作类游戏来说,要求FPS达到60甚至更高。现在的机器的性能都非常的高,如果不加入SLEEP,那么一秒钟内可以进行过百甚至过千次的游戏循环。虽然可以不加入SLEEP让游戏以全速的方式运行下去,但是,这样只会造成不必要的资源浪费,CPU使用也会出现居高不下的情况。以FPS60为例,SLEEP具体的算法是:当本画面开始更新时,记录一次当前的时间。然后,通过不停的等待,检测下一次更新的时间(1/60秒)是否到来。如果到来,就纪录当前的时间,然后对画面进行更新,继续检测下一次更新的时间。我们写了一个比较完美的代码在TIMER.JAVA中。 4 键盘响应 游戏必须要的就是和玩家的交互。可惜的是,WINDOWS系统提供的键盘消息,根本满足不了游戏每秒60FPS的要求。所以,必须主动获取当前键盘的状态。在老式的DOS平台上,软件可以直接读取键盘的缓冲区,然后对缓冲区中的信息进行分析,提取出所需的数据。使用C语言WIN32编程,主要是通过调用GetKeyState和GetSynsKeyState这两个比较底层的函数查询当前键盘中某个游戏感兴趣的按键的状态。不过,JAVA没有直接读取键盘缓冲区的方法,也没有检测键盘状态的函数。不过,最后我还是找到了一个解决方案。具体的原理是:开一个THREAD,这个THREAD不断监听键盘消息,将所有的键盘消息保存到一个STACK中。每当游戏循环一次的时候,游戏引擎复制一份THREAD中STACK中的数据,不断的访问他们,以获取当前键盘的状态。这样也不会发生在一秒钟内,快速点击键盘而发生漏掉消息的情况。而游戏引擎还要为每个KEY保存一份他们上一次的状态。如果这一次STACK中,某个KEY没有KeyUp的消息,而上一次这个KEY状态中是KeyDown的,那么,引擎要告诉游戏,这个KEY连续一直被按下且没有被释放过。 5 粒子效果 虽然我读过相关的知识,也曾经在魔兽争霸3的平台上使用T语言进行过粒子效果的编写,不过在C,C++,JAVA平台上,我都没有尝试过制作这样子的效果。所以我对我能否制作出这样子的效果是带有疑问的。不过我尝试着去做了,最后我发现自己做得也可以。我在飞机的爆炸,战舰移动的波浪,子弹的弹道都使用了粒子效果都使用了自己写的粒子效果。虽然它只是一个简单的点的绘制,在生命周期结束之后自动释放。具体的时间方法是:创建一个粒子(Particle)对象,里面有粒子当前的坐标,已经存活的时间,移动的方向,还有粒子的颜色。然后用一个粒子表(ParticleList)来管理所有的粒子。每一次游戏循环,更新所有粒子的位置,然后减少粒子的生命。如果粒子此时的剩余生命小于0,则从粒子表中删除之。否则,在粒子当前所在的位置,用粒子颜色的笔绘制一个点。后来,我还使用了Graphics中的透明度,绘制的粒子还拥有透明度效果,让粒子效果更加的逼真。具体的做法是,检测粒子当前的生命值(cur)和最大的生命(max),设置创建的笔的透明度为cur/max。 |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。