Java游戏编程初步.doc

上传人:dwx****52 文档编号:2229664 上传时间:2019-05-02 格式:DOC 页数:15 大小:68KB
下载 相关 举报
Java游戏编程初步.doc_第1页
第1页 / 共15页
Java游戏编程初步.doc_第2页
第2页 / 共15页
Java游戏编程初步.doc_第3页
第3页 / 共15页
Java游戏编程初步.doc_第4页
第4页 / 共15页
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()方法播放出来就可实现动画图片的播放.Image backImage; / 加载图片文件for (int i=4,ibackImage.length,i+)backImgagei = getImage (getCodeBase (), “t1“+i+“.gif“);大家可参考 JDK 包中的 Animation 例子,它就是一个很好的播放一组图片文件的例子。事件处理 鼠标监听技术

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。