万鹏 2005911037 java技术在游戏开发的应用

更新时间:2024-06-27 08:10:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

分类号 密级 UDC 编号

华中师范大学汉口分校

本科毕业论文

题 目 JAVA技术在游戏开发中的应用

院 (系) 信息科学与技术学院 专 业 计算机科学与技术 年 级 2005级 学生姓名 万 鹏 学 号 2005911037 指导教师 宾云峰、杨健

二〇〇九 年 五 月

华中师范大学汉口分校 学位论文原创性声明

本人郑重声明:所呈交的学位论文是本人在导师指导下独立进行研究工作所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。

学位论文作者签名: 日期: 年 月 日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

本学位论文属于

1、保密 □ ,在_____年解密后适用本授权书。 2、不保密 □。

(请在以上相应方框内打“√”)

学位论文作者签名: 日期: 年 月 日 导师签名: 日期: 年 月 日

2

目录

Java技术在游戏开发中的应用 ................................................ 错误!未定义书签。 1. 绪论......................................................................................................................... 3

1.1问题的提出及研究意义.................................................................................. 3 1.2 Java技术在游戏开发中的应用分析............................................................ 3 1.3课题的主要研究内容...................................................................................... 4 2. 相关的理论、技术基础 ........................................................................................ 5

2.1 Java简介........................................................................................................ 5 2.2 面向对象......................................................................................................... 5 2.3 平台无关性..................................................................................................... 6 2.4 可靠性和安全性............................................................................................. 7 2.5 多线程............................................................................................................. 7 3 . Java技术在游戏开发中的应用 ............................................................................ 9

3.1 Applet中的绘图技术.................................................................................... 9 3.2 游戏开发中的交互....................................................................................... 12 3.3 基于AWT及SWING的游戏界面开发........................................................... 15 3.4 多线程技术的应用........................................................................................ 17 3.5 Java 2D技术的应用.................................................................................... 21 3.6 Java网络技术的应用.................................................................................. 24 3.7 人工智能....................................................................................................... 26 4. 总结与展望 .......................................................................................................... 27 参考文献 ..................................................................................................................... 28 致谢……….................................................................................................................. 30

3

内容摘要:J2ME是随着移动通信设备的飞速发展而诞生了一项新开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“Write Once, run anywhere”的Java特性而提高开发的效率。 随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。

本文简单的介绍了Java技术在游戏开发中的应用,并以选取各个游戏中的实例对技术进行阐述。文章主要介绍了广泛应用于游戏开发中的一下技术:APPLET,Java IO流,多线程,事件处理,绘图,GUI的设计等。

关 键 词:Java J2ME 游戏

1

Abstract:J2ME is a mobile new technology,which birth with the rapid development communications equipment. Its position in consumer electronics applications, intelligent equipment, diversification, provides a revolutionary solution, and because of its \anywhere\nature of Java to increase the efficiency of development. With the increasing popularity of mobile phones, Java function in the realization of mobile devices, Java applications mobile value-added services generated by the gradual manifestation of its influence, to enrich the content of people's lives, providing easier access to information.

This article describes a simple Java technology in the game development application, and to select examples of the various games on the technology on. The main article on the widely used in game development technology of click: APPLET, Java IO stream, multi-threaded, event handling, graphics, GUI design, etc.

Key words:Java J2ME Game Development

2

1 绪论

1.1问题的提出及研究意义

J2ME(Java 2 Micro Editio)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“Write Once, run anywhere”的Java特性而提高开发的效率。 随着手机的日益普及、Java功能在移动设备上的实现,Java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。

而Java游戏在手机软件中占有很大的比例。Java游戏成为IT产业中增长最快的部分之一.纵观IT产业的历史,计算机游戏已经成为技术创新背后的动者,渴望更加强大的硬件计算能力,渴望不受不同的软件的限制。游戏开发者和玩家常常是前沿计算机技术的最早的采用者。随着技术对游戏经验的促进,游戏市场持续增长。计算机游戏和金钱,从而提高了我们的工作水平,我们因此花费更多的时间和金钱在游戏上,来改善生活的整体质量。甚至在当今困难的经济时代,游戏仍保持快速增长,他仍然是盈利行业的组成部分。

对Java游戏开发技术的研究,不仅可以促进Java移动开发的发展,而且可以创造出更多的游戏,为用户提供更多的娱乐和体验。

1.2 Java技术在游戏开发中的应用分析

Java技术自1995年问世以来,在我国的应用和开发也得到了迅速普及,总体来看,这些应用主要集中于企业应用开发。据有关单位调查显示,从开发领域的分布情况上看Web开发占了一半以上,为57.9%,JavaME移动或嵌入式应用占15%,C/S应用占11.7%,系统编程占15.4%。近30%的开发者用Java从事C/S应用或系统级应用的开发。在桌面应用上,尽管Java在桌面GUI方面尚有不尽如人意之处,但仍然有很多开发者用来开发运行在多种操作系统平台上的桌面应用

而Java在游戏开发上的应用有着很大的优势,凭借其“无平台相关性”,

3

它可以实现“一处编写,多处运行“,占领了可移动设备游戏开发的重大比例;它的网络技术,为游戏开发中的网络连接也提供了技术保证;而随着Java 2D 、Java 3D技术的流行,游戏中的图形开发,为游戏提供了完美的画面;AWT,SWING技术则广泛应用与GUI的开发,为用户提供友好的界面;多线程技术则为游戏流畅的画面作出了贡献。Java的其他技术也深入的应用在游戏开发中,在此不一一列举了。

1.3课题的主要研究内容

Java技术面庞大复杂,应用广泛,深入各种领域。基于Java的游戏开发技

术很多,不管是个人计算机、网络、还是移动设备,都可以看到Java游戏的存在。

本论文着眼于Java技术在游戏开发中的应用,选取Java游戏开发最流行和重要的技术进行讨论,对广泛应用于Java游戏开发的绘图技术,IO技术,交互界面开发技术,多线程技术,Java2D技术,网络技术进行了介绍,并引用具体的实例进行分析。其多线程技术、Java 2D技术、网络技术为重点介绍的技术,其在Java游戏开发中占有很重要的地位,是游戏开发中不可或缺的一环。而对于人工智能技术,由于水平有限、篇幅问题,在此只做简单的介绍。

4

2 相关的理论、技术基础

2.1 Java简介

Java 是 Sun 公司推出的一种编程语言。它是一种通过解释方式来执行的语言,语法规则和 C++ 类似。同时, Java 也是一种跨平台的程序设计语言。用 Java 语言编写的程序叫做 “Applet” (小应用程序),用编译器将它编译成类文件后,将它存在 WWW 页面中,并在 HTML 档上作好相应标记,用户端只要装上 Java 的客户软件就可以在网上直接运行 “Applet” 。 Java 非常适合于企业网络和 Internet 环境,现在已成为 Internet 中最受欢迎、最有影响的编程语言之一。 Java 有许多值得称道的优点,如简单、面向对象、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、多线程、动态性等。

Java 摈弃了 C++ 中各种弊大于利的功能和许多很少用到的功能。 Java 可以运行与任何微处理器,用 Java 开发的程序可以在网络上传输,并运行于任何客户机上。 Java的特点Java是一种跨平台,适合于分布式计算环境的面向对象编程语言。具体来说,它具有如下特性:简单性、面向对象、分布式、解释型、可靠、安全、平台无关、可移植、高性能、多线程、动态性等。

2.2 面向对象

面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。所有面向对象编程语言都支持三个概念:封装、多态性和继承,Java也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。

5

Java语言的封装性较强,因为Java无全程变量,无主函数,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。多态性就是多种表现形式,具体来说,可以用\一个对外接口,多个内在实现方法\表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。运算符重载(operator overload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。

继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的\父亲\,而这些子实体则是汽车的\孩子\。Java提供给用户一系列类(class),Java的类有层次结构,子类可以继承父类的属性和方法。与另外一些面向对象 编程语言不同,Java只支持单一继承。

2.3 平台无关性

Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。Java主要靠Java虚拟机(JVM)在目标码级实现平台无关性。JVM是一种抽象机器,它附着在具体操作系统之上,本身具有一套虚机器指令,并有自己的栈、寄存器组等。但JVM通常是在软件上而不是在硬件上实现。(目前,SUN系统公司已经设计实现了Java芯片,主要使用在网络计算机NC上。另外,Java芯片的出现也会使Java更容易嵌入到家用电器中。)JVM是Java平台无关的基础,在JVM上,有一个Java解释器用来解释Java编译器编译后的程序。Java编程人员在编写完软件后,通过Java编译器将Java源程序编译为JVM的字节代码。任何一台机器只要配备了Java解释器,就可以运行这个程序,而不管这种字节码是在何种平台上生成的(过程如图1所示)。

6

另外,Java采用的是基于IEEE标准的数据类型。通过JVM保证数据类型的一致性,也确保了Java的平台无关性。Java的平台无关性具有深远意义。首先,它使得编程人员所梦寐以求的事情(开发一次软件在任意平台上运行)变成事实,这将大大加快和促进软件产品的开发。其次Java的平台无关性正好迎合了\网络计算机\思想。如果大量常用的应用软件(如字处理软件等)都用Java重新编写,并且放在某个Internet服务器上,那么具有NC的用户将不需要占用大量空间安装软件,他们只需要一个Java解释器,每当需要使用某种应用软件时,下载该软件的字节代码即可,运行结果也可以发回服务器。目前,已有数家公司开始使用这种新型的计算模式构筑自己的企业信息系统。

2.4 可靠性和安全性

Java最初设计目的是应用于电子类消费产品,因此要求较高的可靠性。Java虽然源于C++,但它消除了许多C++不可靠因素,可以防止许多编程错误。首先,Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,Java不支持指针,这杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,Java提供了异常处理机制,程序员可以把一组错误代码放在一个地方,这样可以简化错误处理任务便于恢复。由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。当Java字节码进入解释器时,首先必须经过字节码校验器的检查,然后,Java解释器将决定程序中类的内存布局,随后,类装载器负责把来自网络的类装载到单独的内存区域,避免应用程序之间相互干扰破坏。最后,客户端用户还可以限制从网络上装载的类只能访问某些文件系统。上述几种机制结合起来,使得Java成为安全的编程语言。

2.5 多线程

线程是操作系统的一种新概念,它又被称作轻量进程,是比传统进程更小的

7

可并发执行的单位。C和C++采用单线程体系结构,而Java却提供了多线程支持。Java在两方面支持多线程。一方面,Java环境本身就是多线程的。若干个系统线程运行负责必要的无用单元回收,系统维护等系统级操作;另一方面,Java语言内置多线程控制,可以大大简化多线程应用程序开发。Java提供了一个类Thread,由它负责启动运行,终止线程,并可检查线程状态。Java的线程还包括一组同步原语。这些原语负责对线程实行并发控制。利用Java的多线程编程接口,开发人员可以方便得写出支持多线程的应用程序,提高程序执行效率。必须注意地是,Java的多线程支持在一定程度上受运行时支持平台的限制。例如,如果操作系统本身不支持多线程,Java的多线程特性可能就表现不出来。

8

3 Java技术在游戏开发中的应用

3.1 Applet中的绘图技术

Applet程序中所采用的AWT的绘图机制主要涉及三个方法:paint()方法、update()方法和repaint()方法,update()方法和paint()方法都有一个Graphics类参数。Graphics是画图的关键,它可以支持两种绘图:一种是基本的绘图,如:画线、矩形、圆等;另一种是画图象,主要用于动画制作。 要进行绘图,首先要找到一个Graphics类的对象。update()方法和paint()方法所传递的参数都是Graphics类的对象,因此主要是通过重载它们来进行绘图,这是在动画程序中经常使用的方法。我们还可以通过getGraphics()方法得到一个Graphics类的对象,这个对象和update()方法和paint()方法中所传递的对象一样,都是该成员所对应的Graphics类的对象。得到了Graphics类的对象,就可使用各种绘图方法。

Graphics中提供的图形绘制方法有:

paint( ) //进行绘图的具体操作,必须有程序员重写

update( ) //用于更新图形,先清除背景、前景,再调用paint() repaint( ) /*用于重绘图形,在组件外形发生变化,即大小改变或位置移动时,repaint( )方法立即被系统自动调用,而实际上repaint()方法是自动调用update()方法*/

下面的方法支持基本的绘图和画图像: void drawLine( ) void drawArc( ) void drawPolygon( ) void drawRect( ) void drawRoundRect( ) void fill3DRect( ) void fillOval( ) 实例1:

9

Applet的AWT绘制:

class ArcCanvas extends Canvas{ //类ArcCanvas int startAngle=0; int endAngle=45; boolean filled=false; Font font;

public void paint(Graphics g){

//paint方法,该方法的作用是在Canvas上画图 Rectangle r=getBounds(); int hlines=r.height/10; int vlines=r.width/10; g.setColor(Color.pink); for(int i=1;i<=hlines;i++) {

g.drawLine(0,i*10,r.width,i*10); }

for(int i=1;i<=vlines;i++) {

g.drawLine(i*10,0,i*10,r.height); }

g.setColor(Color.red); if(filled) {

g.fillArc(0,0,r.width-1,r.height-1,startAngle,endAngle); } else { g.drawArc(0,0,r.width-1,r.height-1,startAngle, endAngle); }

g.setColor(Color.black); g.setFont(font);

g.drawLine(0,r.height/2,r.width,r.height/2); g.drawLine(r.width/2,0,r.width/2,r.height); g.drawLine(0,,0,r.width,r.height);

10

g.drawLine(r.width,0,0,r.height); int sx=10;

int sy=r.height-28;

g.drawString(“S=”+startAngle,sx,sy); g.drawString(“E=”+ednAngle,sx,sy+14); }

public void redraw(boolean filled,int start,int end){ //重画方法 this.filled=filled; this.startAngle=start; this.endAngle=end;}

11

3.2 游戏开发中的交互

一个优秀的游戏必定是与玩家不断的沟通,给予玩家充分的操作时间,而游戏又必须快速地,正确的对玩家的动作作出反映,否则这样的游戏,不能称为一个好游戏。所以说,游戏开发中的交互与其他技术有着相同的地位,是一个游戏必备的核心。在Java游戏的开发中,往往使用事件处理器来进行设计。 1.事件:用户对程序的某一种功能性操作。

Java中的事件[3]主要有两种: 1)组件类事件

componentEvent、ContainerEvent、WindowEvent、FocusEvent、PaintEvent、MouseEvent共六大类,

它们均是当组件的状态发生变化时产生。 2)动作类事件

ActionEvent、TextEvent、AdjustmentEvent、ItemEvent共四类。 它们均对应用户的某一种功能性操作动作。

Java中的事件类都包含在JDK的Java.awt.event包中。 2.事件编程:

用户编程定义每个特定事件发生时程序应做出何种响应,并且这些响应代码会在对应的事件发生时由系统自动调用。 事件委托授权处理模型

JDK1.1以上版本实现了事件委托授权处理模型的机制。 1) 事件源:产出事件的组件。

2)监听器:对组件所产生的事件作出具体响应的代吗,即事件产出与处理分别由两个不同类(它们可以分别放在不同的程序中)加以编程实现。

3) 事件处理机制:AWT组件自身不编程处理相应的事件,面是交由事件监听器(它可以是组件所在的容器类或另外的Java程序类,只要它们实现了相关的事件监听器接口即可)处理(事件授权处理模型)。

4)事件处理的包:Java.awt.event包,它提供AWT事件所需的类和接口 ActionEvent类对应ActionListener接口;

MouseEvent类对应MouseMotionListener接口和MouseListener接口;

12

WindonEvent类对应WindonListener接口---即发生了XXXEvent类型的事件,那么处理该事件的接口为XXXListener);它们的父类为EventObject类。

5)事件编程的基本原则:

事件处理的类代码要对某一类事件加以处理,则应实现它们所对应的接口,并且给出该接口中定义的全部事件响应函数的功能实现(重写其函数体);然后在创建组件时注册该事件的监听器(响应者)。

6)事件注册:

事件源通过对特定的事件进行注册,以指定该事件的监听器(响应者)是谁。

7)事件注册函数:

函数名由“add + 事件类型对应的监听器接口名称”组成;函数参数为监听器对象(实现事件响应的类的对象,如容器组件自身响应该事件,则监听器对象应用this代表)。

8)事件编程步骤:

①实现某一事件的监听器接口(定义事件处理类并实现监听器接口)。 ②在事件处理类中重写(实现)其事件处理的函数体。

③在创建AWT组件时注册事件处理代码以指定该事件的监听器(响应者)是谁。 3.事件适配器

由于事件监听器接口是Abstract类型,意谓着实现该接口的类应全部实现其各个成员函数,但实际应用中可能只需处理某些事件响应代码;此时再采用实现事件监听器接口可能会导致编程复杂。JDK中提供事件适配器方式来实现事件编程。

1)每一种监听器接口有相应的适配器类,程序员只需让事件处理类从某一适配器类派出而不采用实现监听器接口的方式,这样仅需重写用户感兴趣的相应函数体代码。

2)在事件注册时,应将监听器设为适配器的派生类(子类)对象,该适配器类中事件响应函数将被执行。

13

实例3[4]:

事件触发实例:

//侦听器对象ButtonEventHandler(用来侦听按钮的点击操作) class ButtonEventHandler implements ActionListener { //窗体对象

private EventDemo form = null; //通过构造体传入窗体对象,

//作用在于让侦听器对象明白事件源处于 //哪个窗体容器中

public ButtonEventHandler(EventDemo form) { this.form = form; }

//委托方法

public void actionPerformed(ActionEvent e) { //该方法将会把事件的处理权交给窗体容器类的 //btnPress_Click方法处理。 this.form.btnPress_Click(e); } }

14

3.3 基于AWT及SWING的游戏界面开发

抽象窗口工具包AWT (Abstract Window Toolkit) 是API为Java程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,AWT可用于Java的applet和applications中。它支持图形用户界面编程的功能包括: 用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。

AWT是Swing的基础。Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。AWT设计的初衷是支持开发小应用程序的简单用户界面。随着发展的需要,Swing出现了,Swing组件几乎都是轻量组件,与重量组件相比,没有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。Swing采用了一种MVC的设计范式,即”模型-视图-控制”(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。Swing外观感觉采用可插入的外观感觉(Pluggable Look and Feel,PL&F)

实例4:[9]

Windows经典游戏扫雷GUI构造代码: package ly.Java.game;

import Java.awt.*; import Java.awt.event.*; import Javax.swing.*; import ly.Java.ExtendButton;

15

public class Game extends JFrame implements ActionListener{ private Container myContainer; private GridLayout myLayout;

ExtendButton[] myButton = new ExtendButton[81];

private Game() {

this.setTitle(“Game”); this.setSize( 500,500 ); this.InitButton(); }

private void InitButton() {

myContainer = getContentPane();

myLayout = new GridLayout( 9, 9, 1, 1 ); myContainer.setLayout( myLayout ); for(int i=0; i < 81; i++) {

myButton[i] = new ExtendButton(); myButton[i].SetPostion(i); myContainer.add(myButton[i]);

myButton[i].addActionListener( this ); }

System.gc(); this.SetBomb(13); show(); }

16

3.4 多线程技术的应用

线程简介[15]

进程就是程序的运行时的一个实例。线程可以看作单独地占有CPU时间来执行相应的代码的。对早期的计算机(如DOS)而言,线程既是进程,进程既是进程,因为它是单线程的。当然一个程序可以是多线程的,多线程的各个线程看上去像是并行地独自完成各自的工作,就像一台一台计算机上运行着多个处理机一样。在多处理机计算机上实现多线程时,它们确实可以并行工作,而且采用适当的分时策略可以大大提高程序运行的效率。但是二者还是有较大的不同的,线程是共享地址空间的,也就是说多线程可以同时读取相同的地址空间,并且利用这个空间进行交换数据。

将顺序执行程序和采用多线程并行执行程序相比,效率是可以大大地提高的。比如,有五个线程thread1, thread2, thread3, thread4, thread5,所耗的CPU时间分别为4,5,1,2,7。(假设CPU轮换周期为4个CPU时间,而且线程之间是彼此独立的)顺序执行需要花费19个CPU时间,而并行需要的时间肯定少于19个CPU时间,至于具体多少时间要看那些线程是可以同时执行的。这是在非常小规模的情况下,要是面对大规模的进程之间的交互的话,效率可以表现得更高。 Java实现多线程的过程

与其他语言不一样的是,线程的观念在Java是语言中是重要的,根深蒂固的,因为在Java语言中的线程系统是Java语言自建的, Java中有专门的支持多线程的API库。在使用Java创建线程的时候,你可以生成一个Thread类或者他的子类对象,并给这个对象发送start()消息(程序可以向任何一个派生自Runnable接口的类对象发送start() 消息的),这样一来程序会一直执行,直到run返回为止,此时该线程就死掉了。 在Java语言中,线程的特点:

1)在一个程序中而言,主线程的执行位置就是main。而其他线程执行的位置,程序员是可以自定义的。值得注意的是对Applet也是一样。 2)每个线程执行其代码的方式都是一次顺序执行的。

17

3) 一个线程执行其代码是与其他线程独立开来的。如果诸线程之间又相互协作的话,就必须采用一定的交互机制。

4)线程是共享地址空间的,如果控制不当,这里很有可能出现死锁。 各线程之间是相互独立的,那么本地变量对一个线程而言就是完全独立,私有的。所以呢,线程执行时,每个线程都有各自的本地变量拷贝。对象变量(instance variable)在线程之间是可以共享的,这也就是为什么在Java中共享数据对象是如此的好用,但是Java线程不能够武断地访问对象变量:他们是需要访问数据对象的权限的。

实例5[1]:

某游戏中利用多线程技术消除闪烁 public void init() {

currentImage = 0; //指定目前图像为第一张图像 Animation = new Image[8]; //与使用八张动画图像 MT = new MediaTracker(this);

for(int i=0;i<8;i++) //注意此循环中的程序代码 { Animation[i]

= getImage(getDocumentBase(),”Images/Freedom” + (i+1) + “.gif”);

MT.addImage(Animation[i],0); } try {

showStatus(“图像加载中...”); //在状态列显示信息 MT.waitForAll(); //等待所有图像下载 }

18

catch(InterruptedException E) //若捕捉到例外 {

try //建立错误页面的URL {

ErrorHTML = new URL(getCodeBase().toString() + “ErrorHTML.html”); }

catch(MalformedURLException ME){ }

getAppletContext().showDocument(ErrorHTML); //转移页面 } }

public void start() //start()函数 {

//建立与启动新线程

newThread = new Thread(this); newThread.start(); }

public void stop() //stop()函数 {

newThread = null; //将线程设为null }

public void paint(Graphics g) //已将差劲的动画循环抽离 {

//绘制目前图像

g.drawImage(Animation[currentImage],50,10,250,250,this); }

public void run() {

19

while(newThread != null) {

repaint(); //重新绘制图像 try {

Thread.sleep(125); //暂停程序执行125毫秒 } {

ErrorHTML = new URL(getCodeBase().toString() + “ErrorHTML.html”); }

catch(MalformedURLException ME){ }

getAppletContext().showDocument(ErrorHTML); //转移页面 }

if(currentImage == 7) //如果已经播放到最后一张图像

currentImage = 0; //指定目前图像为第一张图像

else

currentImage = currentImage + 1; //指定图像为下一张图像 } }

20

3.5 Java 2D技术的应用

Java 2D API是JFC (Java Fundation Classes)的一员,加强了传统AWT( Abstract Windowing Toolkit )的描绘功能。在JDK1.2中已经支援Java 2D的使用。透过Java 2D API ,Programmer可以轻松地描绘出任意的几何图形、运用不同的填色效果、对图形做旋转( rotate)、缩放( scale)、扭曲(shear)等。如图一所示,Programmer透过2D API所提供的功能,简单地利用不同类型的线或是填色效果绘出统计图,以区分出不同的资料。当然, 2D API还有许多增强AWT能力的部分,像是处理影像档案可以有不同的滤镜(filter)效果、对於任意的几何图形亦能做碰撞侦测(hit detection)、图形重叠混色计算(composite)等功能。文中将会对这些技术做概略性地介绍。 Java 2D API Packages

JDK1.2中关於2D API的Packages如下所述[15]: Java.awt

Java.awt包含了一些新增的2D API类别(classes)和介面(interfaces )。其中Graphics2D继承自 Java.awt.Graphics ,是描绘2D图形的物件(object)。如同前版本的JDK所使用的绘图模式一样,当有物件 要被描绘时,paint或是update method会自动根据适当的Graphics Context来做绘图的工作。所谓的Graphics Context是与Graphics Object相关状态属性(state attribute)的集合。在Graphics2D中新增了许多状态属性,像是Stroke、 Paint、Clip、 Transform等。 Java.awt.geom

Java.awt.geom则包含可以勾勒任何形状的GeneralPath类别。它可以由许多不同种类的subpath构成,像是lines和quadratic curves等。为了兼顾方便性,此package中更定义了许多基本几何图形,包括Arc2D 、CubicCurve2D、Line2D等。这些类别都有两种型态,分别是Float precision Doubleprecision。此外,还有一种特别的图形类别:Area,它支援Constructive Area Geometry(CGA)。CGA是对既有图形物件做布林运算(Boolean Operation)而产生新图形物件的过程。如图二所示, Areas支援联集( union)、交集(intersection)、差集(subtraction )、Exclusive OR (XOR)等布林运算。最后,

21

AffineTransform类别则提供图形物件做Scale、Shear 、Rotate等座标上的转换。

Java.awt.font

Java.awt.font中定义了TextLayout类别,负责建构text shape、执行适当的text operations,如碰撞侦测与打光 (highlighting)等,以及决定text的适当位置与顺序。 Java.awt.image

Java 2D API支援三种影像模式。包括producer/consumer (push) model、 immediatemode model和 pipeine(pull) model。Push model在前版本的JDK中支援。而Pull model则在即将出现的Java Advanced Imaging AP中会支援。於此,我们只探讨JDK1.2中出现的Immediate mode imaging model。在此model下,Programmer可以透过2D API对image data( BufferedImage or Raster)做滤镜的效果。在Package Java.awt.image中,immediate mode imaging APIs可以被归为六大类: interfaces、image data classes、 image operation classes、sample model classes、 color model classes和 exceptions。其中operation classes即定义了许多filter ,包括了AffinTransformOp BandCombineOp、 ColorConvertOp、 ConvolveOp、 LookupOp、 RescaleOp等。透过以上所提之滤镜,可以做到 geometrically transform、blur、 sharpen、enhance contrast、 threshold和color correct images等效果。如图三所示,source image经过filter,产生出新的图形。 Java.awt.color

Package Java.awt.color定义了class ColorSpace。此class提供Programmer转换色盘的method。 Java.awt.print

Java Printing API提供Programmer列印AWT和Java 2Dgraphics的method。并可让User设定print的属性,如双面列印等。

实例6[1]:

利用Java 2D技术对图像进行处理

22

float[] elements = {0.0f, -1.0f, 0.0f,-1.0f, 4.f, -1.0f,0.0f, -1.0f, 0.0f};

Image img = Toolkit.getDefaultToolkit().getImage(“boat.gif”); int w = img.getWidth(this); int h = img.getHeight(this); BufferedImage bi = new

BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

Graphics2D big = bi.createGraphics(); big.drawImage(img,0,0,this); BufferedImageOp biop = null;

AffineTransform at = new AffineTransform(); BufferedImage bimg = new

BufferedImage(img.getWidth(this),img.getHeight(this),

BufferedImage.TYPE_INT_RGB);

Kernel kernel = new Kernel(3,3,elements); ConvolveOp cop = new

ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);

cop.filter(bi,bimg); biop =

newAffineTransformOp(at,AffineTransformOp.TYPE_NEAREST_NEIGHBOR);

g2 = (Graphics2D)this.getGraphics(); g2.drawImage(bimg,biop,0,0);

23

3.6 Java网络技术的应用

Java最初是作为一种网络编程语言出现的,它能够使用网络上的各种资源和数据,与服务器建立各种传输通道,将自己的数据传送到网络的各个地方。你可以用Java很轻松地完成这些,因为Java类库提供了很强大的网络功能。

Java中有关网络方面的功能都定义在Java.net程序包中。Java所提供的网络功能可大致分为三大类:

1)URL和URLConnection这是三大类功能中最高级的一种。通过URL的网络资源表达方式,很容易确定网络上数据的位置。利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端。 2)Socket所谓Socket,可以想像成两个不同的程序通过网络的通道,而这是传统网络程序中最常用的方法。一般在TCP/IP网络协议下的客户服务器软件采用Socket作为交互的方式。

3)Datagram是这些功能中最低级的一种。其他网络数据传送方式,都假想在程序执行时,建立一条安全稳定的通道。但是以Datagram的方式传送数据时,只是把数据的目的地记录在数据包中,然后就直接放在网络上进行传输,系统不保证数据一定能够安全送到,也不能确定什么时候可以送到。也就是说,Datagram不能保证传送质量。

实例6[8]:

某游戏中利用Sockt类进行联机的过程 import Java.net.*; import Java.io.*;

public class SocketConnect {

public static void main(String args[]) { try {

String data, host; int port = 80; // HTTP服务器预设连接站 PrintStream theOutputStream;

24

host = args[0];

Socket skt = new Socket(host, port);

theOutputStream = new PrintStream(skt.getOutputStream()); // 发出HTTP指令,此指令可取得首页数据 theOutputStream.println(“GET /”);

BufferedReader(new InputStreamReader(skt.getInputStream())); // 取得联机资料 while((data = buf.readLine()) != null) System.out.println(data); skt.close(); // 关闭Socket }

catch (UnknownHostException e) { // 无法解析地址 System.out.println(e.getMessage()); }

catch (ArrayIndexOutOfBoundsException e) { System.out.println(“没有指定地址”); }

catch (IOException e) {

System.out.println(e.getMessage()); } }

25

3.7 人工智能

人工智能(Artificial Intelligence) ,英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式作出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。“人工智能”一词最初是在1956年Dartmouth学会上提出的。从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。例如繁重的科学和工程计算本来是要人脑来承担的,现在计算机不但能完成这种计算, 而且能够比人脑做得更快、更准确,因之当代人已不再把这种计算看作是“需要人类智能才能完成的复杂任务”, 可见复杂工作的定义是随着时代的发展和技术的进步而变化的, 人工智能这门科学的具体目标也自然随着时代的变化而发展。它一方面不断获得新的进展,一方面又转向更有意义、更加困难的目标。目前能够用来研究人工智能的主要物质手段以及能够实现人工智能技术的机器就是计算机, 人工智能的发展历史是和计算机科学与技术的发展史联系在一起的。除了计算机科学以外, 人工智能还涉及信息论、控制论、自动化、仿生学、生物学、心理学、数理逻辑、语言学、医学和哲学等多门学科。人工智能学科研究的主要内容包括:知识表示、自动推理和搜索方法、机器学习和知识获取、知识处理系统、自然语言理解、计算机视觉、智能机器人、自动程序设计等方面。

26

4 总结与展望

本文介绍了大量的在游戏开发中的各种Java技术,有的是基于PC的,有的是基于移动设备,并对每种技术都举了相关的游戏实例进行分析。通过此次论文设计,我受益匪浅,不仅体会到了Java技术的广范与强大,而且使我学习到了许多课堂上学习不到的东西,也深入的了解了J2ME开发的各种技术。

相信随着移动电子设备的迅速发展,以及Java技术的快速更新,在未来的时间了,Java技术会多的应用到游戏与其他开发中。随着移动设备的性能的日益提升,过去简单的游戏应用已经不能满足用户的要求,这就要求我们不断学习新的技术,利用硬件上的提升,开发出更加逼真与复杂的游戏应用。

而随着其他移动设备开发技术的提高,很多新的技术加紧了追赶Java的脚步,Java比以往有更加沉重的负担,希望在未来的时间里,Java能不断给我们带来新的东西。

在本论文的写作过程中,不断的出现一些新的问题,我又不断的解决遇到的问题,一步一步地前进。虽然J2ME不是我主学的方向,但随着论文的逐步完善,我对以前所学知识的领悟程度得到了提升,也让我了解了许多J2ME方面的知识。由于本人水平有限,各种技术只是浅尝辄止,并未深入研究。文章难免有错误的地方,望请谅解

27

参考文献

[1]荣钦科技.Java2游戏设计. 2004年11月第1版. 清华大学出版社 [2]Bruce Eckel.侯捷译.Java编程思想. 2005年3月第1版. 机械工业出版社出版社

[3]王森著.Java手机/PDA程序设计入门.2005年2月第3版.电子工业出版社.

[4]James Keogh著.潘颖 王磊译.J2ME开发大全.2004年2月第1版清华大学出版社.

[5]Ian Sommerville著.程成等译.软件工程.2003年1月第1版.机械工业出版社.

[6] 程成、陈霞等.软件工程机械工业出版社.2004年11月第一版 [7]陈立伟 张克非 黎秀红著.精通Java手机游戏与应用程序设计.中国青年出版社.2005年5月

[8]飞思科技产品研发中心.精通Jbuilder9.电子工业出版社.2004年 [9]袁海燕 王文涛著.Java实用程序设计100例.人民邮电出版社.2005年5月

[10] David Wallace Croft. 彭晖译..Java游戏高级编程. 2005年8月第1版. 清华大学出版社

[11]SUN ONE.JbuilderX无线应用开发.电子工业出版社.2004年1月第一版

[12]闻怡洋.J2ME MIDP 1.0/2.0.北京大学出版社.2004年1月第一版 [13] Leopold Lee. J2ME手机编程基础.清华大学版社, 2003年7月第一版

[14]王怀东 李建平等 .JbuilderX程序设计教程清华大学出版社,2005. 电子工业出版社.2005年3月第一版

[15]王伯欣.J2ME无线.Java应用开发电子工业出版社.2004年7月第一版

[16]Nokia website (2003a). Device Details,

28

http://www.forum.nokia.com/main/ 06566016-134500.html.

[17]Sun website (2001). MIDP APIs for Wireless

Applications.http://Java.sun.com/products/midp/midp-wirelessapps-wp.pdf.

[18] Cay S.Horstmann, GaryCornell著.候国峰等译Core Java 2. 电子工业出版社,2002年6月第一版

29

致谢

本课题在选题及研究过程中得到宾云峰老师和杨健老师的悉心指导。、宾老师、杨老师多次询问研究进程,并为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励。宾老师和杨老师在教学上一直保持着一丝不苟的作风,严谨求实的态度,踏踏实实的精神,是我顺利完成此次论文的出发点。感谢杨老师为我提供的大量的参考资料和文献,是我在论文开发上得到很重要的思想和强有力的理论依据。

最后我要感谢四年来教育过我的老师们,四年来我在java技术方面有了一定的掌握,并对软件开发有了很大的兴趣。我也要感谢帮我修改论文的其他老师,你的细心,严格和对我的建议使我在论文的修改上更加谨慎。我还要感谢在论文开发和修改上给我帮助的同学。

30

本文来源:https://www.bwwdw.com/article/ql83.html

Top