收藏 分享(赏)

success_Java游戏编程初步.doc

上传人:dreamzhangning 文档编号:2275397 上传时间:2018-09-09 格式:DOC 页数:15 大小:122.40KB
下载 相关 举报
success_Java游戏编程初步.doc_第1页
第1页 / 共15页
success_Java游戏编程初步.doc_第2页
第2页 / 共15页
success_Java游戏编程初步.doc_第3页
第3页 / 共15页
success_Java游戏编程初步.doc_第4页
第4页 / 共15页
success_Java游戏编程初步.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

1、Java 游戏编程初步现在流行的游戏似乎都是用 C 或 C+来开发的。在 java 平台上几乎没有很大型及可玩的流行游戏。由于 java 是个新生语言,他的许多特性还有待大家的发掘,但是我们不能否认Java 在游戏编程方面的强大性。本文将带领大家一步一步学习编写 Java 游戏。最终打造属于自己的 Java 游戏。在开始之前我们得确认你已经安装了 Java JDK,并已经安装了浏览器软件如 IE。本章是以 Internet 为开发对象,一步一步教大家认识 Java 的 Thread、Applets.以及游戏编程要注意的一些方方面面。并在每一小部分附上了相应的源代码以供大家参考,最后我们还会对我

2、们的游戏程序进行指导性的提示。在文章中我们还穿插了很多建设性的问题,让读者参与到我们的开发中来。但是由于本章指在带领大家进入这个门槛,大部分知识并不会很详细说明,有兴趣的读者可查阅相关的资料补充。在开始之前我们还得确认你已经知道类,继承和 java 语言的一些基本属性了。基本 appletApplets 是一种 Web 浏览器上的小程序,由于 applet 对系统而言绝对安全,所以它做的事比 aaplication 有限,但是对于客户端的程序,applets 仍然是个很强大的工具。为了浏览和运行方便,我们就以 applet 为开发对象。开发 Applets 程序,我们得继承 Applet 类,

3、并覆写必要的函数,下面几个函数控制了Web 页面上的 applet 生成与执行。函数 作用Init() 这个函数会被自动调用,执行 applet 的初始化动作包括组件在版面上的分配,你一定得覆写它Start() 每当浏览器显示 applet 内容时,都会调用它,让 applet 开启其正规工作(尤其是那些被 stop()关闭的工作) ,调用 init()之后也会调用这个函数Stop() 每当浏览器不显示内容时,都会调用它。让 applet 关闭某些耗资源的工作,调用destory()之后也会调用这个函数Destroy() 浏览器将 applet 自网页移除之际,便会调用它,以执行”applet

4、 不再被使用”应该做的最后释放资源等动作Paint() 让你在 Applet 界面上进行相应的绘画动作,每次刷新时都会重画所有的 applet 文件源文件名和 java 应用程序一样都是.java 为扩展名,编译后的执行文件扩展名为.class,由于在 applet 中已经没有了 main()函数,它是和 html 自动集成,所以我们要执行 applet,要在 html 源文件中放入一特定的标签(tag),才能告诉网页如何装载并执行这个 applet,这里有一点要注意,我们执行的网页必须能执行 java 程序。普通 Html 源码格式HTMLAPPLET CODE=“HelloWorld.cl

5、ass“ WIDTH=300 HEIGHT=500/APPLET/HTMLapplet code =“HelloWorld.class“ width=300 height=500这行即 applet 的执行处。applet 执行文档为 =“HelloWorld.class“ 告诉网页”applet ”扩展文件为HelloWorld.classwidth 和 height 告诉浏览器这个显示的 applet 的大小 有关标签(tag)的说明,大家可在网上找到很多相关的说明文档。线程由于 apllet,java 应用程序的执行都和线程有关。我们来大概了解一下线程的概念。线程也称为轻型进程 (LWP

6、)。每个线程只能在单个进程的作用域内活动、协作和数据交换,并且在计算资源方面非常廉价。线程需要操作系统的支持,因此不是所有的机器都提供线程。Java 编程语言,作为相当新的一种语言,已将线程支持与语言本身合为一体,这样就对线程提供了强健的支持。Thread 类是一个具体的类,即不是抽象类,该类封装了线程的行为。要创建一个线程,程序员必须创建一个从 Thread 类导出的新类。程序员必须覆盖 Thread 的 run() 函数来完成有用的工作。用户并不直接调用此函数;而是必须调用 Thread 的 start() 函数,该函数再调用 run()。但是使用 Thread 类实现线程,增加了程序的类

7、层次,所以一般程序员都由另一个java 线程接口 Runnable 接口来实现,Runnable 接口只有一个函数 run(),此函数必须由实现了此接口的类实现。线程中有几个重要的方法是我们得了解:Thread.start(): 启动一个线程Thread.stop(): 停止一个线程Thread.sleep(time in milliseconds): 暂停线程在一个等待时间内。动画技术 自由降落动画了解了一些基本概念后,下面我们就开始我们的实质性的工作。我们设计一个球从屏幕顶上降落到屏幕下面,程序实现比较简单,但是这是游戏动画中不可少的一部分。在开始之前我们来看看我们的 applet 开始语

8、句。import java.awt.*;import java.applet.*; public class Ball extends Applet implements Runnable public void init() public void start() public void stop() public void destroy() public void run () public void paint (Graphics g) 在开始函数中我们要新建程序的主线程,并启动这个线程。一旦做好这些准备工作以后,当 applet 第一次被显示时,就会创建线程对象的一个实例,并把 th

9、is 对象作为建构方法的参数,之后就可以启动动画了public void start ()/ 定义一个新的线程Thread th = new Thread (this);/ 启动线程th.start (); 现在我们来看看线程的 run 方法,它在循环 while(),中每隔 20 毫秒重画动画场景。sleep 这个方法很重要,如果在 run 循环中没有这部分,圆的重画动作将执行得很快,其他方法将得不到有效执行,也即我们在屏幕上将看不到球的显示。public void run ()/while (true)/ 重画 applet 画面repaint();try/ 暂停线程 20 毫秒Threa

10、d.sleep (20);catch (InterruptedException ex)我们接着读下去之前,有几个问题需要回答。你也许会问,浏览器调用 Java 小程序的 start 和 stop 方法吗? run 方法是如何被调用的? 情况是这样的,当浏览器启动了一个内部线程时,就相应地启动了 applet 的运行。当网页显示时,就启动了 applet 的 start 方法。Start 方法创建一个线程对象,并把 applet 自身传送给线程,以实现 run 方法。此时,两个线程在运行:由浏览器启动的初始线程,以及处理动画的线程。快速查看applet 的 start 方法,可以知道它创建了线

11、程,并启动了它。类似地,当网页被隐藏后,applet 的 stop 方法就调用了线程的 stop 方法。注意:在 Applets 和 Threads 中的 start/stop 子程序在 Applet 和 Thread 两个类中都有 start 和 stop 方法,但它们的功能不同。一旦Applet 显示时,就调用 applet 的 start 方法,一旦 applet 隐藏时,就调用 applet 的 stop 方法。相反,线程的 start 方法将调用 run 方法,线程的 stop 方法将停止正在执行的线程。public void paint(Graphics g); paint() 方

12、法所传入的参数 java.awt.Graphics 对象将是一个经裁剪的相关显示区的图像代表(而不会是整个显示区)。我们对圆球图形元素的绘制就是在通过重写 paint()方法,在其中对传入的 Graphics 对象 g 进行操作完成的。 当我们应用程序的逻辑要对系统界面进行更新时,调用 repaint() 方法来通知 AWT 线程进行刷新操作。repaint() 方法实际会让 AWT 线程去调用另外一个方法,update。update 方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其 paint()方法完成实际绘制工作。paint 、repaint、update 三个方法关系如图所

13、示: 但是如何让我们的圆运动呢?这里我们利用函数 Graphics 类的 fillOval 函数来设置了圆的起始位置 x,y。现在我们只要在线程 run 方法中每单位时间增大 y 的值,线程将在每一个单位时间内重画圆的位置。每单位时间 y 值越大,下降的速度就会越快。在屏幕上我们就将看到这个圆球做自由降落运动。 如下代码所示:while (true) / 设置动画移动速度 y +=1;public void paint (Graphics g)/设置球的颜色g.setColor (Color.blue);/ 从 x,y 位置处画一个实心的圆g.fillOval (x , y, 2 * r, 2

14、 * r);在这之前我们需要在开始处设置一些变量,定义好 x,y 的默认位置值。r 在此处是我们画的圆的半径大小。int x = 100;int y = 20;int r = 10; 我们的自由降落的动画就完了。是不是很简单,如果还有地方不明白,大家可在此处下载完整的代码及应用程序。看看真实的演示效果和代码。下面每一部分我们也将在最后附上相应的源代码及应用程序下载。如果大家有兴趣,可改变 y 的值,及 x 的值,你会得到不同的下降效果。双缓冲,消除闪烁 大家可能注意到了上面例子中的我们下降的圆看起来不是很清晰,带着很严重的闪烁。这种现象在写游戏程序中是普遍存在的现象。这是由于我们的 repai

15、nt()函数导致的结果,由于它在调用 paint()函数前会自动清除屏幕,所以在一个毫秒内我们会看到一个空白的屏幕,在快速的变换操作中就出现了闪烁现象。解决这种闪烁现象有几种方法,下面是两种方法的列举说明,其他的方式大家可以自己尝试。第一种:我们始终不清除屏幕显示,但是这个方法会带来个附作用,我们下降的圆不在是一个圆了,而是一条直线,因为它的下降过程中没有了断点,保留了所有的圆球的影象。我们只要在 Ball.java 内加上如下代码 update(Graphics g) paint(g),你就会看到一条很长的线拉出来。有兴趣的朋友可以试试。第二种:使用双缓冲机制(Double bufferin

16、g)现在大部分的游戏都是采用双缓冲机制来解决屏幕的闪烁现象,我们就以此为例来进行说明,有关缓冲区及相关缓冲机制的概念,大家可参考附录的缓冲说明。而我们的程序中简单的说就是在显示我们想要的图画之前,把所有的图画先在后台绘制好并存放到相应的图像变量中去。当需要显示时直接复制到前台屏幕就可以了。具体实现:1.首先我们用 createImage 方法新建一后台图像类变量2.然后使用 getGraphics()方法得到当前图像的图形关联3.在后台处理所有相关的处理,如清除屏幕,后台绘画等等当完成所有的后台工作后,复制已经绘制好的图像到前台,并覆盖前台的存在图像。这样我们的所有操作都是在后台前行,在屏幕显

17、示新的图像前,这些内容都已经存在于后台了。所以你也将在任何时刻都看不到空屏幕的存在。也即代表闪烁消除了。下面我们来看看相关的代码说明: 在开始之前我们得先在程序的开始部分声明两个实例变量用来存储后台图画。如下:private Image bgImage;private Graphics bg; 然后我们利用 update()方法来实现双缓冲机制。Update()方法要实现下面三个步骤:1.清除屏幕上的组件2.设置相关联组件的前景色3.调用 paint 方法重画屏幕public void update (Graphics g)/ 初始化 bufferif (bgImage = null)bgIm

18、age = createImage (this.getSize().width, this.getSize().height);bg = bgImage.getGraphics ();/ 后台清屏,即设置圆球组件和后台一样的颜色,大小bg.setColor (getBackground ();bg.fillRect (0, 0, this.getSize().width, this.getSize().height);/ 绘制相应的元素组件bg.setColor (getForeground();paint (bg);/ 在屏幕上重画已经绘制好的圆g.drawImage (bgImage, 0

19、, 0, this);此处 g 为屏幕图形,bg 为 g 的后台关联。而 bgimage 包含了 bg 图形。请于此处来看看我们的源代码例子及演示效果。改变运动方向我们已经解决了动画的两个很重要的问题,移动动画和闪烁消除。但是我们很快会发现一个问题,球从屏幕顶上落下来后,就不见了。这可不是我们所需要的。我们要的是一个生动的画面。如何让我们的球不穿过屏幕而始终在屏幕上活动呢?在开始之前,我建议大家自己想办法解决,如果你能自己处理好了。你的水平将会有一个很大的提高。如果没有想出好办法,没关系,下面我们将很详细的说明球的方向改变的技术。不知道大家注意了没有,在上面我们说到球的移动时,我们是通过增加

20、y 的值,让线程重画新的圆位置和图形。如果改变 y 的值的大小球的下降速度也会改变。不错,这就是我们的解决方法 ,我们只要用一个变量来存储这个速度的大小而不用固定的值。在线程执行也即 run 方法处我们用代码改变速度的方向,球的方向也会改变。即设置这个变量”speed”为”-1”。当然在设置值前我们要进行判断,你是想让球穿过屏幕从别一边开始显示,还是来回反弹呢!如果想来回反弹,我们只要不让球的半径值超过 applet 屏幕显示区域就可以了。此处我们用 r/2 来表示球的半径。/反弹下落球if (y appletsize_y r/2)/ 改变方向x_speed = -1;/ 反弹上升球else

21、if ( r/2)/ 改变方向x_speed = +1;至于如何让球穿过从屏幕顶上重新下降,我们在此没有说明,也不会说明了。留给大家自己去想想,已经很简单了。在下面我们附上了两种方式的源代码和执行文件。如果大家运行程序,大家可能会发现,我们的球的大小和速度有一些改变。这里是为了更好的反应演示效果。多媒体 使用多媒体声音多媒体功能在游戏中是必不少的一部分,优美的音乐,漂亮的界面往往是一个成功游戏必需具备的条件。在开始之前我们先了解一下主要的小型声音文件类型:AU - (扩展名为 AU 或 SND)适用于短的声音文件,为 Solaris 和下一代机器的通用文件格式,也是 JAVA 平台的标准的音频

22、格式。 AU 类型文件使用的三种典型音频格式为: 8位 -law 类型(通常采样频率为 8kHz), 8 位线性类型,以及 16 位线性类型。WAV - (扩展名为 WAV)由 Microsoft 和 IBM 共同开发 ,对 WAV 的支持已经被加进Windows 95 并且被延伸到 Windows 98. WAV 文件能存储各种格式包括 -law,a-law 和 PCM (线性) 数据。他们几乎能被所有支持声音的 Windows 应用程序播放。AIFF - (扩展名为 AIF 或 IEF)音频互换文件格式是为 Macintosh 计算机和 Silicon Graphics (SGI)计算机所

23、共用的标准音频文件格式。AIFF 和 AIFF-C 几乎是相同的, 除了后者支持例如 -law 和 IMA ADPCM 类型的压缩。MIDI - (扩展名为 MID)乐器数字接口 MIDI 是为音乐制造业所认可的标准,主要用于控制诸如合成器和声卡之类的设备。在 JDK1.0 上,java 只支持*.au 格式的声音文件,但是 java2 的 API 以及声音包提供了很强大的对声音技术的支持。而此部分为了让大家快速掌握游戏编程的基本知识,我们仅使用了 AudioClip 接口类来实现播放“*.wav“。如果大家有兴趣可参考 sun java 网站的声音 sapmle,上面提供了完备的实例和教程说

24、明。使用 AudioClip 接口比较简单,我们只要实例对象,加载声音文件后,再在任何地方播放即可。恢复和播放声音最简单的方法是通过 Applet 类的 play()方法。AudioClip 接口1.播放 play2.循环 loop3.停止 stop启动和停止声音文件,或循环播放 ,你必须用 applet 的 getAudioClip 方法把它装载进入 AudioClip 对象,getAudioClip 方法要用一个或两个参数,当作播放的指示。第一个或唯一的一个参数是 URL 参数,用来指示声音文件的位置,第二参数是文件夹路径指针。下列代码行举例说明加载声音文件进入剪贴对象: 下面的“gun.

25、wav“ 是指当前目录下的声音文件。我们也可用*.au 格式的文件代替。AudioClip co = getAudioClip(getCodeBase(), “gun.wav“); getAudioClip()方法仅仅能被 applet 内调用。随着 JAVA2 的引入,应用程序也能用Applet 类的 newAudioClip 方法装入声音文件。前一例子可以改写如下以用于 Java 应用程序:AudioClip co = newAudioClip(“gun.wav”)我们现在可在任何地方使用方法 play()播放我们的声音了。play()一旦被调用立刻开始恢复和播放声音。但这有一点要注意:如

26、果声音文件不能被查找,将不会有出错信息, 仅仅是沉默。源代码及应用程序请于此处下载.图片处理技术图片的处理和声音的处理在一样简单。设置图片变量,得到图形,最后绘制图形。我们就直接从代码来分析。在此我们绘制一幅 applet 的背景图。开始绘制前,我们先要声明图形变量,用来存放图形文件。Image backImage; / 加载图片文件backImgage = getImage (getCodeBase (), “black.gif“);下面在我们的 paint()方法中利用函数 drawImage 绘制我们图形。g.drawImage (backImage, 0, 0, this);DrawI

27、mage 参数中的 blackImage 即我们得到的图形,而后面的 0,0 分别代表图形的x 坐标和 y 坐标.this: 为图形代表的类,这里指的即 picture 类。在这里建议大家使用*.gif 格式的图片文件。因为如果是 internet 网上,文件的大小也决定了你的 applet 加载时的快慢,没有人很愿意等很长时间来玩你的游戏,即使你的游戏比较出色。源代码及演示程序下载.大家在玩游戏时是不是见过人物图像行走?动物来回跑动的动画?这些都是基于图形技术来实现的。我们只要把上面的代码稍微修改,用数组变量来存储我们得到的图形文件组,再利用 drawImage()方法播放出来就可实现动画图

28、片的播放.Image backImage; / 加载图片文件for (int i=4,ibackImage.length,i+)backImgagei = getImage (getCodeBase (), “t1“+i+“.gif“);大家可参考 JDK 包中的 Animation 例子,它就是一个很好的播放一组图片文件的例子。事件处理 鼠标监听技术玩游戏时,不管是小型的扑克牌和大型的 RPG 游戏,都要参与者溶入到游戏的角色当中。不错,交互,游戏有了交互的功能才可以说是一个完整的游戏。即使是编程游戏如机器人足球,Robocode 都要程序员参与编写代码,观察比赛。有两种主流方法可实现游戏的

29、交互:鼠标和键盘。当然还包括手操杆等,但现在大部分 Pc 机上使用的还是鼠标和键盘。我们就以这两项为基础来说明游戏中事件的响应过程。要判断相应的鼠标所进行的动作:是点击,还是移动。我们必须对我们鼠标进行监听。要监听鼠标事件就必须调用这些接口之一,或扩展一个鼠标适配器(mouse adapters) 类. AWT 提供了两种监听接口(listener interface): java.awt.event.MouseListener 和 java.awt.event.MouseMotionListener.现在我设计一个鼠标事件,当点击 applet 屏幕时,下降的球向反方向运动。以实现了对游戏的

30、简单控制。MouseListener 一共有 5 个方法, 主要用来实现鼠标的点击事件。这里要注意一点:由于 MouseListener 是接口我们要在实现的类中重载它的所有方法. Mouse 点击事件 mousePressed() 当用户按下鼠标按钮时发生. mouseReleased() 当用户松开鼠标按钮时发生. mouseClicked() 当用户按下并松开鼠标按钮时发生. 用户在选择或双击图标的时候通常会点击鼠标按钮. 用户如果在松开鼠标之前移动鼠标, 点击不会导致鼠标相应事件出现. 因为点击鼠标是按下鼠标和松开鼠标的结合, 在事件分配给 mouseClicked() 方法之前, m

31、ousePressed() 和 mouseReleased() 方法已同时被调用.鼠标状态处理:mouseEntered() 当鼠标离开当前组件并进入你所监听的组件时激活事件.mouseExited() 当鼠标离开你所监听的组件时发生.Mouse 移动事件鼠标移动主要通过接口 MouseMotionListener 来实现:mouseDragged() 当用户按下鼠标按钮并在松开之前进行移动时发生.在mouseDragged() 后松开鼠标不会导致 mouseClicked().mouseMoved() 当鼠标在组件上移动而 不时拖动时发生.依据我们的游戏设计,我们在这要使用到 MouseLi

32、stener 接口。实现接口后。我们要在 init()函数加入监听器 addMouseLisener(),来监听对 applet 的响应事件。知道了鼠标事件的处理,我们再来回顾一下上面提到的球反弹设计,现在我们要如何处理了球的控制呢?让我们想一想,不错,可能你已经发现了,我们照样可通过改变speed 方向来实现回弹控制操作。在 mousePressed()事件中加入下面的代码, 我们的回弹控制就设计完成。speed = -4记得在释放 applet 资源时,我们要释放 mouseListener 资源。在 destory()中加入removeMouseListener(this);可能有些朋友

33、会使用 mouseDown()方法,mouseDown()在此我建议大家不要再使用这个方法了,它已经是被淘汰的产品。是为了兼容 JDK1.0 而带到 JDK1.4 中来的。键盘监听技术 知道了鼠标的操作处理,键盘的操作处理就很简单了。我们只要实现 keyListener 接口,并在相应的事件中加入我们要实现的代码。KeyPressed: 当按键时发生KeyReleased:当翻译键时发生KeyTyped:当打击键时发生由于在后面我们设计的游戏中我们不会使用到键盘操作,键盘事件处理我们就交给大家自己去实现。现在我们来回顾一下我们能做什么了?移动一个物体,加载声音和图片,用鼠标对游戏进行一定的控制

34、。哦,我的天,我们已经可以做自己的很简单的游戏了。是的,你可以了,我认为在此,大家可以放下教程,把自己小时候一直想玩的游戏,把自己学程序时一直想做的游戏自己进行设计实现,这对你的帮助将是非常大的。对你的编程水平也是一个很大的提高。当然如果你仍然认为自己认识还不是很深,下面让我们来设计一个完整的游戏。这将是一个很有意思的过程。第一个游戏-“保卫者“主线思路:真正做自己的游戏是总是很兴奋。在开始任何事情之前,我们都要有个好的设计,游戏更不例外。下面我们就以上面的例子为本。设计一个”保卫者”的游戏。游戏思路本身很简单,从屏幕的顶端不断的有炸弹落下来,而我们这些”保卫者” 要在它们着地之前,用鼠标点击

35、让它反弹回去,不让它落到地面上来,但是球在上升过程中我们也要注意不让它撞到顶上。如果撞到顶上或地画,你的生命点数都会减少。每点中一个炸弹你的分数就会增加。当你的生命点数为零。”Game Over”。设计结构:1.模块设计:游戏的结构很简单,由三个模块组成。Denfen 类:Denfen 类控制整个游戏主线程,初始化炸弹类,并绘制屏幕上的炸弹数量及处理炸弹的移动,并监听鼠标事件Bomb 类:主要是判断炸弹的速度,方向,是否撞到地面和点击事件Denfense 类:主要用来处理游戏者的记分和生命点数2.方法实现:Denfen:init(): 初始化所有对象,包括声音文件的加载, Bomb 类的生成r

36、un(): 处理炸弹的下降运动paint(.):绘制炸弹及相关的数据记录显示update(.): 实现屏幕图像的双缓冲 ,消除闪烁mouseProcess (.): 利用 mouseEvent 事件监听来处理鼠标按下事件,并根据鼠标当时的 x 坐标和 y 坐标判断是否点中炸弹。addBomb():利用默认值来动态实现 bomb 的生成,这里我们利用了数组来记录的。默认值是 3,大家可依据自己的爱好增加或减少记录。Denfenser:Score:积分Life:生命点AddScore():增加游戏者的积分Death():减少游戏者的生命点数getScore(): 获得当前的积分数getLife()

37、:获得当前的生命点数Bomb:Bomb(.): 构造函数,初始化炸弹的位置,声音,颜色等相关变量的值.down():处理 bomb 的下降isRebound ():反向回弹炸弹的方向,并根据积分来加快炸弹的下降速度userHit (int x, int y):游戏者是否点中炸弹。wasHitEarth(): 判断炸弹是否撞击到地面或顶面,如果是生命点将减少。DrawBomb(Graphics g): 绘制 Bomb 图象。3.工作原理:首先我们在 init()方法中加载所有游戏必要的资源,包括声音,鼠标事件的监听、背景等相关设置。利用 addBomb()方法增加 bomb 的数量、初始位置及初

38、始化颜色。再利用start()启动线程。线程调用 run()方法,处理炸弹下降运动 down()。Repaint()会在每一个单位时间调用 paint()方法不断的刷新屏幕,paint() 调用 Bomb.addBomb()绘制炸弹。当游戏者按下鼠标,mousePress() 事件激活,判断是否点中了炸弹。如果点中 addScore()自动加1 分。如果没有点中炸弹,炸弹继续下降,当撞到屏幕 wasHitEarth()方法激活,其内调用death()方法,减少 Denfenser.life 生命点,同时 audio.play()处理声音的播放,用以提示游戏者。当你的生命点数小于 0 时”Gam

39、e Over”。这个游戏并不是很完善。下面提到一些改进方法,大家可以动手试试。做出适合自己的游戏风格来。具体的源代码及实现过程请大家从这里下载.4.游戏的改进:背景的替换,本例的背景用的是函数 setBackground(),大家可用相应的图形来代替。炸弹数量的增加,为了减少复杂度,例子用到的炸弹数量是固定值 3,我们可根据积分的多少,在游戏中动态的增加炸弹的数量。等级的设置,本游戏中没有等级的功能。如果大家在游戏中加入等级,依据不同的等级不断的变换游戏的模式,这将是很有意思的过程。模式改变。我们可以在游戏中实现自己的模式。如消灭炸弹。点一个炸弹,就让炸弹从屏幕上消灭。我们还可以增加一个游戏者

40、,加大游戏的可玩性。增加键盘的处理功能。加大游戏的灵活性。还有很多很多的处理和玩法,这都等着你去发掘。相信 java 游戏编程将会是一个很有意思的学习过程。附录:缓冲机制 . 缓冲区 缓冲区用来储存着色的像素(影像)在视频内存中的区域。缓冲区的大小由解析度和色深决定,例如 800x600,16bit 色的缓冲区就占用 800x600x2(16bit=2bytes)的内存区域。(1) 前置 Buffer 是当前显示在萤幕上的缓冲区,后置 Buffer 是尚未显示在萤幕上的缓冲区。(2) Single Buffering 使用一个前置缓冲区,在着色的同时影像立即显示在萤幕上。因此当萤幕更新影像时会

41、出现闪烁的现象。Single Buffering 在目前的程序中已很少使用。(3) Double Buffering 则使用两个缓冲区,一个前置 Buffer,一个后置 Buffer。所谓前置和后置是相对而言的。前置缓存的像素在屏幕上显示的同时,显卡正在紧张地着色后置缓存中的像素。后置缓存的像素上色完毕后是以 Vsync 信号的形式等待。在前置缓存和后置缓存交换后,新一轮的着色工作又重新开始。这正如舞台话剧中前台和后台的演员一般。在前台演员表演时,后台的演员仍在进行最后的排练。前台的演员下场时正是后台演员登场的时间。唯一不同的是前置和后置缓存是循环轮番上阵,而演员表演完毕一般都不再出场。目前大多数游戏内定都使用 Double Buffering。(4) Triple Buffering 使用一个前置缓存和两个后置缓存。在着色完第一个后置缓冲区的数据后,立即开始处理第二个后置缓冲区。今天,不少新游戏都采用的是 Triple Buffering,Trible Buffering 正逐渐成为发展的趋势,因为它没有 Vsync(萤幕的垂直刷新频率)等待的时间,游戏也将更加流畅。Triple Buffering 也是 3Dmark2000 测试的内定值设定。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报