java技术在游戏开发的应用本科毕业论文.doc_第1页
java技术在游戏开发的应用本科毕业论文.doc_第2页
java技术在游戏开发的应用本科毕业论文.doc_第3页
java技术在游戏开发的应用本科毕业论文.doc_第4页
java技术在游戏开发的应用本科毕业论文.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科毕业论文题 目 java技术在游戏开发中的应用华中师范大学汉口分校学位论文原创性声明本人郑重声明:所呈交的学位论文是本人在导师指导下独立进行研究工作所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。学位论文作者签名: 日期: 年 月 日学位论文版权使用授权书本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。本学位论文属于1、保密 ,在_年解密后适用本授权书。2、不保密 。(请在以上相应方框内打“”)学位论文作者签名: 日期: 年 月 日导师签名: 日期: 年 月 日目录java技术在游戏开发中的应用11. 绪论11.1问题的提出及研究意义11.2 java技术在游戏开发中的应用分析11.3课题的主要研究内容22. 相关的理论、技术基础32.1 java简介32.2 面向对象32.3 平台无关性42.4 可靠性和安全性52.5 多线程53 . java技术在游戏开发中的应用73.1 applet中的绘图技术73.2 游戏开发中的交互103.3 基于awt及swing的游戏界面开发133.4 多线程技术的应用153.5 java 2d技术的应用193.6 java网络技术的应用223.7 人工智能244. 总结与展望25参考文献26致谢.2830内容摘要:j2me是随着移动通信设备的飞速发展而诞生了一项新开发技术。它定位在消费性电子产品的应用上,对设备的智能化、多样化,提供了革命性的解决方案,并因其“write once, run anywhere”的java特性而提高开发的效率。 随着手机的日益普及、java功能在移动设备上的实现,java应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。本文简单的介绍了java技术在游戏开发中的应用,并以选取各个游戏中的实例对技术进行阐述。文章主要介绍了广泛应用于游戏开发中的一下技术:applet,java io流,多线程,事件处理,绘图,gui的设计等。关 键 词:java j2me 游戏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 write once, run 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 peoples 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 development1 绪论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在游戏开发上的应用有着很大的优势,凭借其“无平台相关性”,它可以实现“一处编写,多处运行“,占领了可移动设备游戏开发的重大比例;它的网络技术,为游戏开发中的网络连接也提供了技术保证;而随着java 2d 、java 3d技术的流行,游戏中的图形开发,为游戏提供了完美的画面;awt,swing技术则广泛应用与gui的开发,为用户提供友好的界面;多线程技术则为游戏流畅的画面作出了贡献。java的其他技术也深入的应用在游戏开发中,在此不一一列举了。1.3课题的主要研究内容 java技术面庞大复杂,应用广泛,深入各种领域。基于java的游戏开发技术很多,不管是个人计算机、网络、还是移动设备,都可以看到java游戏的存在。本论文着眼于java技术在游戏开发中的应用,选取java游戏开发最流行和重要的技术进行讨论,对广泛应用于java游戏开发的绘图技术,io技术,交互界面开发技术,多线程技术,java2d技术,网络技术进行了介绍,并引用具体的实例进行分析。其多线程技术、java 2d技术、网络技术为重点介绍的技术,其在java游戏开发中占有很重要的地位,是游戏开发中不可或缺的一环。而对于人工智能技术,由于水平有限、篇幅问题,在此只做简单的介绍。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也不例外。现实世界中的对象均有属性和行为,映射到计算机程序上,属性则表示对象的数据,行为表示对象的方法(其作用是处理数据或同外界交互)。所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。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所示)。另外,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 多线程线程是操作系统的一种新概念,它又被称作轻量进程,是比传统进程更小的可并发执行的单位。c和c+采用单线程体系结构,而java却提供了多线程支持。java在两方面支持多线程。一方面,java环境本身就是多线程的。若干个系统线程运行负责必要的无用单元回收,系统维护等系统级操作;另一方面,java语言内置多线程控制,可以大大简化多线程应用程序开发。java提供了一个类thread,由它负责启动运行,终止线程,并可检查线程状态。java的线程还包括一组同步原语。这些原语负责对线程实行并发控制。利用java的多线程编程接口,开发人员可以方便得写出支持多线程的应用程序,提高程序执行效率。必须注意地是,java的多线程支持在一定程度上受运行时支持平台的限制。例如,如果操作系统本身不支持多线程,java的多线程特性可能就表现不出来。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:applet的awt绘制:class arccanvas extends canvas /类arccanvasint 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);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;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接口;windonevent类对应windonlistener接口-即发生了xxxevent类型的事件,那么处理该事件的接口为xxxlistener);它们的父类为eventobject类。5)事件编程的基本原则:事件处理的类代码要对某一类事件加以处理,则应实现它们所对应的接口,并且给出该接口中定义的全部事件响应函数的功能实现(重写其函数体);然后在创建组件时注册该事件的监听器(响应者)。6)事件注册:事件源通过对特定的事件进行注册,以指定该事件的监听器(响应者)是谁。7)事件注册函数:函数名由“add + 事件类型对应的监听器接口名称”组成;函数参数为监听器对象(实现事件响应的类的对象,如容器组件自身响应该事件,则监听器对象应用this代表)。8)事件编程步骤:实现某一事件的监听器接口(定义事件处理类并实现监听器接口)。在事件处理类中重写(实现)其事件处理的函数体。在创建awt组件时注册事件处理代码以指定该事件的监听器(响应者)是谁。3.事件适配器由于事件监听器接口是abstract类型,意谓着实现该接口的类应全部实现其各个成员函数,但实际应用中可能只需处理某些事件响应代码;此时再采用实现事件监听器接口可能会导致编程复杂。jdk中提供事件适配器方式来实现事件编程。1)每一种监听器接口有相应的适配器类,程序员只需让事件处理类从某一适配器类派出而不采用实现监听器接口的方式,这样仅需重写用户感兴趣的相应函数体代码。2)在事件注册时,应将监听器设为适配器的派生类(子类)对象,该适配器类中事件响应函数将被执行。实例34:事件触发实例:/侦听器对象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);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:9windows经典游戏扫雷gui构造代码:package ly.java.game; import java.awt.*; import java.awt.event.*; import javax.swing.*; import ly.java.extendbutton; public class game extends jframe implements actionlistener private container mycontainer; private gridlayout mylayout; extendbutton mybutton = new extendbutton81; 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+) mybuttoni = new extendbutton(); mybuttoni.setpostion(i); mycontainer.add(mybuttoni); mybuttoni.addactionlistener( this ); system.gc(); this.setbomb(13); show(); 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)每个线程执行其代码的方式都是一次顺序执行的。 3) 一个线程执行其代码是与其他线程独立开来的。如果诸线程之间又相互协作的话,就必须采用一定的交互机制。4)线程是共享地址空间的,如果控制不当,这里很有可能出现死锁。 各线程之间是相互独立的,那么本地变量对一个线程而言就是完全独立,私有的。所以呢,线程执行时,每个线程都有各自的本地变量拷贝。对象变量(instance variable)在线程之间是可以共享的,这也就是为什么在java中共享数据对象是如此的好用,但是java线程不能够武断地访问对象变量:他们是需要访问数据对象的权限的。 实例51: 某游戏中利用多线程技术消除闪烁public void init() currentimage = 0; /指定目前图像为第一张图像 animation = new image8; /与使用八张动画图像 mt = new mediatracker(this); for(int i=0;i8;i+) /注意此循环中的程序代码 animationi = getimage(getdocumentbase(),”images/freedom” + (i+1) + “.gif”);mt.addimage(animationi,0); try showstatus(“图像加载中.”); /在状态列显示信息mt.waitforall(); /等待所有图像下载 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(animationcurrentimage,50,10,250,250,this); public void run() 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; /指定目前图像为第一张图像elsecurrentimage = currentimage + 1; /指定图像为下一张图像 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 packagesjdk1.2中关於2d api的packages如下所述15: java.awtjava.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)等布林运算。最后, affinetransform类别则提供图形物件做scale、shear 、rotate等座标上的转换。java.awt.font java.awt.font中定义了textlayout类别,负责建构text shape、执行适当的text operations,如碰撞侦测与打光 (highlighting)等,以及决定text的适当位置与顺序。 java.awt.imagejava 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.colorpackage java.awt.color定义了class colorspace。此class提供programmer转换色盘的method。 java.awt.printjava printing api提供programmer列印awt和java 2dgraphics的method。并可让user设定print的属性,如双面列印等。实例61: 利用java 2d技术对图像进行处理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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论