基于java的坦克大战游戏开发论文.doc

上传人:e****s 文档编号:92377323 上传时间:2023-06-03 格式:DOC 页数:55 大小:402KB
返回 下载 相关 举报
基于java的坦克大战游戏开发论文.doc_第1页
第1页 / 共55页
基于java的坦克大战游戏开发论文.doc_第2页
第2页 / 共55页
点击查看更多>>
资源描述

《基于java的坦克大战游戏开发论文.doc》由会员分享,可在线阅读,更多相关《基于java的坦克大战游戏开发论文.doc(55页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 南 京 工 程 学 院毕业设计说明书(论文)作 者: 超人 学 号: 1 院 系: 康尼学院 专 业: 计算机科学与技术 题 目: 基于java的坦克大战游戏开发 指导者: 实验师 (姓 名) (专业技术职务)评阅者: 讲师 (姓 名) (专业技术职务) 2009 年 6 月 南 京毕业设计说明书(论文)中文摘要J2SE是近年来随着各种不同技术的发展,尤其是编程语言飞速发展而诞生的一项新的开发语言。随着信息技术的飞速发展,计算机的使用也日渐普及,本文从实际应用出发,向大家介绍坦克大战游戏的设计与实现。Eclipse平台模拟器开发调试。玩家坦克的运行是通过键盘响应事件控制,敌方坦克则是自动运行

2、并具有了一定的智能性。程序进行了精简和优化,游戏运行流畅,具有一定的吸引力。论文中介绍了游戏的总体设计思路和开发游戏的多线程、高级、低级图形界面的使用。本论文介绍了坦克大战的历史、java的相关技术及本程序的结构分析和具体功能的实现。游戏是在Eclipse环境下编程。它的主要功能有:能够四处移动、能够发射子弹打击敌人、敌人能够移动、 能够模拟爆炸、能够产生障碍、能够增长生命。关键词 游戏 Java 坦克 智能毕业设计说明书(论文)外文摘要Title Java Tank War Game DevelopmentAbstractJ2SE is a kind of fast developing t

3、echnology implemented on various devices especially equipments.With the rapid development of information technology, computer use has become more popular, the practical application of this paper to introduce the design and implementation of the game Battle City .It transports the classical product t

4、o computer, offering corresponding software for such more popular hardware platform. Eclipse platform simulator. The players tank is controlled by keyboard response events, while the enemys tank is operated automatically and is of intelligence. Having been streamlined and optimized, the game system

5、can run fluently and attract the players.This paper describes the history of Battle City, java related technologies and the procedures of structural analysis and the realization of specific functions. Game programming environment in Eclipse. Its main features are: to move around. capable of firing b

6、ullets against enemy. the enemy can move. to simulate the explosion. to create an obstacle. to increase the life Key words game,Java,tank,Smart目 录前言1第一章 系统开发环境介绍21.1 开发环境21.2 Java语言的特点21.3 关于Eclipse6第二章 软件需求分析82.1 可行性分析82.2 游戏规则和系统功能介绍82.3 程序运行流程9第三章 系统总体设计123.1 主体模块123.2 子弹模块123.3 坦克模块133.4 墙模块133.

7、5 血液模块143.6 爆炸模块14第四章 系统详细设计与实现164.1 游戏窗口与我方坦克164.2 子弹与一辆敌人坦克224.3 爆炸与多辆敌人坦克274.4 墙、坦克互相穿越、超级炮弹和生命值304.5 血块与加入图片33第五章 坦克大战打炮弹功能系统测试365.1 抬CTRL打炮弹的测试要点365.2 坦克大战系统采用的测试方法365.3 功能测试用例36结 论38参考文献39致谢40附录:英文技术资料翻译41前 言如果要从精品云集的FC游戏中找一款经典之作,坦克大战绝对是FC上所有经典中的经典,当年NAMCO的Battle City在国内又称坦克大战,以其极为出色的游戏性令全球众多玩

8、家为之疯狂。该游戏是一款以红白机为平台操作射击游戏,1名玩家可控制自己的坦克进行移动和射击,歼灭对方为胜利目标。每个关卡的地形不同,玩家可利用各种地形对敌人进行打击,并会得到补给。其操作简单且娱乐性强,是一款男女老少皆宜的游戏。游戏附带地图编辑器,玩家可自行编辑地图进行游戏。游戏中的众多经典关卡至今还让许多玩家记忆犹新,在80年代时曾经在无数家庭中带来了无尽的欢乐。JAVA语言是当今最为流行的程序设计语言之一,作为非常优秀和极为健壮的编程语言,它同时有的面向对象,与平台无关,分布式应用,安全,稳定和多线程等优良的特征,使用JAVA语言,不仅可以开发出功能强大的大型应用程序,而且JAVA语言本身

9、突出的跨平台的特性也使得它特别适合于Internet上的应用开发,可以这样说,JAVA的出现使得所开发的应用程序“一次编写,处处可用”的实现成为了可能。网络化的市场让游戏变成人和人的交战,而不是人和电脑的对战,这样可以增加游戏的难度,游戏的时间和游戏的寿命。立体化是为了适应现在越来越3D的趋势,游戏有必要做的更加的完善,趋向3D并且加重环境描写。多样化则是增加游戏的任务,游戏的耐玩性而在坦克大战里增加更多的内容加大其可玩性,比如:装备,对战方式,任务合作模式等等。可以想像,如果坦克大战还是人机对战的模式,并且协作性不提高的化,玩家对该游戏的选择性将大大降低,最终成为历史。本课题就是想对该游戏进

10、行分析研究,借助于它的游戏规则,用JAVA语言模拟开发一个类似的,功能相对简单的小游戏。第一章 系统开发环境介绍1.1 开发环境操作系统:Microsoft Windows 7程序语言:Java 开发工具:Eclipse1.2 Java语言的特点1)平台无关性平台无关性是指Java能运行于不同的平台。Java引进虚拟机 原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与 机器无关,Java虚拟机(Java Virtual Machine)是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能, 提供于不同平台的接口的。

11、2)安全性Java的编程类似C+,学习过C+的读者将很快掌握Java的精髓。Java舍弃了C+的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。3)面向对象Java吸取了C+面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使用父类的方法。在Java中,类的继承关系是单一的非多重的,一个子类

12、只有一个父类,子类的父类又有一个父类。Java提供的Object类及其子类的继承关系如同一棵倒立的树形,根类为Object类,Object类功能强大,经常会使用到它及其它派生的子类。4)分布式Java建立在扩展TCP/IP网络平台上。库函数提供了用 和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易, 使用其相关技术可以十分方便的构建分布式应用系统。 5)健壮性Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自己操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能,这些功能特征大大提高了开发

13、Java应用程序的周期。并且Java还提供了Null指针检测、数组边界检测、异常出口、Byte code校验等功能。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。6)简单性Java删除了许多极少被使用、不容易理解和容易令人混淆的C+功能。剔除的功能主要包括运算符重载、多重继承以及广泛的自动强迫同型。与C+相比,Java语言也提供重载函数,不过它重载的对象是函数而非变量或是运算符。Java还增加了自动内存收集功能,从而简化了Java程序的工作,不过同时也让系统变得稍微复杂了一些。Java的目标之

14、一是要协助开发能独立地在小型机器上顺利执行的软件。Java的基本解释器和对象类支持约占40KB空间,而若增加基本的标准程序库和线程支持则需增加约175KB。体积小对于在嵌入式系统中的使用是很重要的,正因为这样,Java才能够通过网络轻易下载。7)中立性Java的设计目标是要支持网络应用程序。一般而言,网络是由许多不同的平台系统构成,包括各种CPU与操作系统结构。为了让Java应用程序能够在网络上任何地方执行,其编译器将会生成一种具备结构中立性的目标文件格式。编译后的程序码可以在提供Java运行系统的多种不同处理器上面执行。Java的这种中立性结构不仅对网络应用很有帮助,而且也很适合单一的系统软

15、件流通。Java编译器是通过生成与某一特定电脑结构无关的字节代码指令,以达到上述功能的。这些字节代码指令能很容易在任何机器上解释执行。结构中立性是确保程序可移植的最重要部份,不过除此之外还需很多必须配合的条件和C与C+不同的是,Java规范中并无任何与机器结构相依存的陈述存在。它指定了基本数据类型的大小,及其算术运算元的执行行为。例如:“int”代表一个有符号的二进制补码32Bit整数,而“float”代表一个32BitIEEE754浮点数。这些选择在今天的环境很适用,因为几乎所有CPU都具备这些特性。程序运行库属于系统的一部份,它定义了一些可移植的程序接口。例如,它包括一个抽象的Window

16、s类,并且提供了该类在Unix、Windows和Macintosh平台上的实现。8)解释执行性Java解决器可以直接在任何已移植该解释器的机器上解释、执行Java字节代码。再者,由于其链接过程比较倾向于逐步增量与轻量过程,因此程序开发更快、更精密。9)高效能性虽然解决过的字节代码性能已相当不错,不过有些情形下还是要求程序达到更高执行效能。字节代码可以动态地解释为执行应用程序特定CPU的机器码。这对于习惯使用一般编译器与动态载人器的程序设计者而言,有点类似将最终的机器码生成器放到动态载入器之内。字节代码格式在设计上即已考虑了机器码的产生,因此实际的机器码生成程序相当简单。其生成的机器码是有效的,

17、编译器自动分配寄存器,而在生成字节代码期间也会进行一些优化。我们以解决码在一台Sun Microsystem SPARC Station10上执行时,达到每秒三十万个函数调用速率。字节代码转换至机器码的速度性能,几乎和直接生成机器目标代码的C或C+没有什么两样。10)多线程性Java拥有一组复杂的同步化基本单元,它们是以广泛使用的C.A.R.Hoare监视器与条件变量图为基础的。将这些概念融合到语言中之后,它们就变得更容易使用且更为健壮。这种融合方式大部分来自Xerox的Cedar/Mesa系统。多线程所带来的其它好处包括更好的交互式回应能力与实时运行能力。然而这会受到底层平台的限制:独立执行

18、的Java运行环境有着很好的实时执行能力,而若在其他系统例如Unix、Windows、Macintosh或WindowsNT等平台上执行时,则会由于底层平台的原因而使实时响应能力受到影响。11)动态特性就各方面而言,Java是一种比C或C+更具动态特性的语言。它在设计上强调为不断发展的运算环境提供支持。 Java能了解由Objective C引用过来的接口概念。简单地说,接口就是规范一组与对象相对应的成员函数,但对象如何实现这些成员函数则亟待解决。一个类实现一个接口是要提供这个接口所包含的所有成员函数的实现,与此相反,派生子类则从父类继承了一组成员函数以及它们的实现。一个Java类可以实行多个

19、接口,但只能从一个父类继承。接口告诉连接对象它可以做什么而不是怎么做,使得它在代码上更具有灵活性和可复用性。在C或C+程序中,如果你有一个指针指向一个对象,但你不知道该对象的类型是什么,那么你将没有办法找出它。然而,在Java中根据运行类型信息进行查找是很直截了当的,因为在编译阶段和运行阶段都会检查数据类型转换。所以你在Java中完全可以信任这种转换,而C与C+的编译器则只是相信你自己已做了正确的处理。12)有关绘图的一些技术Graphics类提供了简单的2D绘图功能。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用Graphics绘制,G

20、ameCanvas可调用getGraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。其对象会被传给Canvas的paint()函数,以便最终显示。在没有MIDP2.0前,进行游戏绘图一般需要手动编程使用双缓冲。需要在paint()方法内所想要画的图形画在一张预先准备好的背景,等所有绘图操作都完成后再将背景的数据拷贝到实际的屏幕上。Image类提供了一个建立背景的静态方法createImage(int width, int height),再利用getGraphics()方法取得属于这个背景的Graphics对象,所进行的绘图操作都会作用在背景上,等到全部的绘图操作完成后,再

21、调用drawImage()方法将背景的数据复制到实际显示的屏幕上。这样的技术在绘制动画时特别有用。绘制动画时经常需要不断地更新画面,而更新画面的操作就是先将屏幕以fillRect()的方式清除,再将下一张图片画在屏幕上,然而反复的清除及重绘会造成屏幕的闪烁现象(flicker),因此使用双重缓冲的好处就是在背景进行这个清除及重绘的操作,再将完成的绘图拷贝到屏幕上,由于用户看不到清除的操作,因此就不会出现闪烁的现象了。不过在某些MIDP的实现上已经加上了双重缓冲的支持,因此在处理前应先利用Canvas类的isDoubleBuffer()方法来判断。1.3 关于EclipseEclipse最初是由

22、IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(Eclipse Foundation)管理。 2003年,Eclipse 3.0选择OSGi服务平台规范为运行时架构。 2007年6月,稳定版3.3发布。2008年6月发布代号为Ganymede的3.4版。2009年7月发布代号为GALILEO的3.5版。2010年6月发布代号为Helios的3.6版。Eclipse是著名的跨平台的自由集成开发环境(IDE)。最初主要用来Java语言开发,但是目前亦有人通过插件使其作为其他计

23、算机语言比如C+和Python的开发工具。Eclipse的本身只是一个框架平台,但是众多插件的支持使得Eclipse拥有其他功能相对固定的IDE软件很难具有的灵活性。许多软件开发商以Eclipse为框架开发自己的IDE。Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM提供了最初的Eclipse代码基础,包括Platform、JDT 和PDE。目前由IBM牵头,围绕着Eclipse项目已经发展成为了一个庞大的Eclipse联盟,有150多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat

24、及Sybase等。Eclipse是一个开发源码项目,它其实是 Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注。近期还有包括Oracle在内的许多大公司也纷纷加入了该项目,并宣称Eclipse将来能成为可进行任何语言开发的IDE集大成者,使用者只需下载各种语言的插件即可。虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Develop

25、ment Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。基于Eclipse的应用程序的突出例子是IBM的WebSphereStudioWorkbench,它构成了IBM Java开发工具系列的基础。例如,WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、We

26、b 服务和数据库访问的支持。Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一

27、个工具功能在哪里结束,而另一个工具功能在哪里开始。Eclipse SDK(软件开发者包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以 GPL发布,第三方组件有各自自身的许可协议。第二章 软件需求分析2.1 可行性分析1).游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒

28、都会运行成千上万行程序,绘图事件、健盘事件都会以极高的频率在后台等待循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件各意外情考虑在设计中。2).游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,屏幕刷新的双缓冲等都有较好的解决方案。3).我方的坦克的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定的智能性;同时,出现在屏幕上的敌方可能性会有较多的数量,这需要为每个敌方开辟一个线程以便能让其独立运行。Java的多线程能力为实现这样的游戏提供了可能。4).对于双方坦克发出的子弹的控制也需要对其跟踪控制,子弹也需要处在独立的线程中。敌方子弹仅需要扫描用户坦克,

29、而用户坦克需要在每一步扫描所有的敌方坦克。这需要对所有的对象有较好的控制。另外,子弹在运行过程中也需要实时扫描是否碰撞到了相关障碍物或屏幕边界。如此过多的线程同时在本来效率就不高的机器上运行,也许会导致程序的缓慢。5).双方坦克在前进时也考虑到是否碰撞到相关物体或对方坦克,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。6).是基于虚拟机的半解释型编译系统,其执行效率较C+等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。开发过程中要对结构的控制、注意变量的使用。2.2 游戏规则和系统功能介绍游戏中坦克能向八个方向移动,和友方坦克碰到后不能穿越。坦克能向八个方

30、向发射子弹,子弹击中坦克产生爆炸,玩家坦克还能发射同时向八个方向发射集束炸弹。地图上有障碍物,坦克和子弹都不能穿越障碍物。玩家坦克有生命数,还有生命值,被敌人子弹击中后生命值减少,生命值为后坦克爆炸,开始新坦克的操作按2。地图上有随机出现的加生命值的血块,吃恢复生命值满,游戏的目的是操作自己的坦克消灭敌人坦克,消灭所有敌人坦克后游戏结束。基于Java语言的各种特性,本软件使用Java语言进行开发,并最终完成当初的设计要求,所有的程序以及程序功能如表3-1所示表3-1程序功能表程序名程序功能游戏的主窗口坦克的数据和方法炮弹的数据和方法爆炸的数据和方法墙的数据和方法血块的数据和方法2.3 程序运行

31、流程2.3.1 程序中炮弹的运行和流程炮弹继承了Missile,运行在独立的线程中,它拥有一个很重要的变量,good。它标识了子弹是属于玩家的还是敌人的,这样可以控制子弹再脱离坦克后的运行状态中的行为,其中主要功能流程图见图3-1流程图当击中了需要做出反应的物体时,就分别采取措施:击中墙时,子弹生命就结束,不再继续画.如果没有击中物体,就继续检测是否击中了坦克,这根据子弹的来源分为两种情况.当来自玩家时,检测是否与敌人碰撞,发生碰撞时,将敌人从List中移走,并置为空,产生爆炸效果,敌人数量减少一位,敌人屏幕上数量减少一位。如果是来自敌人的子弹,将同样检测与玩家坦克的碰撞,如有碰撞,玩家生命就

32、减少,当生命值为0时,就死亡了。下图为炮弹运行的主要流程:开始是否出界击中墙,不再画子弹击中物体玩家子弹击中敌人敌人子弹击中玩家开始YYNNNNNN消除敌人消除玩家YYYY图2-1炮弹运行流程图2 文字描述敌方坦克运行流程是否碰墙开始可否前进前进是否开炮是否已死换向开炮结束NNYYNNY图2-2敌方tank运行流程图第三章 系统总体设计3.1 主体模块,负责调用各个类。创建游戏窗口。该类中的变量如表3-1所示。表3-1 Tankclient类中成员变量表成员变量描述变量类型名称整个游戏的宽度intGAME_WIDTH整个游戏的高度intGAME_HEIGHT该类中包括lauchFrame( )

33、,paint( ),update( )三个方法,其功能表如表3-2表3-2 Tankclient类中方法表方法功能备注lauchFrame()显示坦克主窗口无备注paint(Graphics g)重画时调用无备注update(Graphics g)使用双缓冲消除闪烁现象无备注3.2 子弹模块,实现子弹的各个功能,实现打坦克,实现子弹是否活着的功能。该类中的变量如表3-3所示。表3-3 Missile类中成员变量表成员变量描述变量类型名称子弹在X方向上的速度intXSPEED子弹在Y方向上的速度intYSPEED子弹的高度intHEIGHT该类中包括hitTank( ),Islive( )二个方

34、法,其功能表如表3-4表3-4 Missile类中方法表方法名功能备注hitTank(Tank t)实现子弹撞坦克的功能无备注Islive()实现判断子弹是否活着的功能无备注3.3 坦克模块,创建坦克,打子弹,打多发子弹。处理坦克和墙相撞的问题。坦克不能相互穿越。加入主战坦克的生命值。击毙敌人坦克。让坦克更加智能。该类中的变量如表3-5所示表3-5 Tank类中成员变量表成员变量描述变量类型名称坦克在X方向上的速度intXSPEED坦克在Y方向上的速度intYSPEED坦克的高度intHEIGHT该类中包括collidesWithWall( ),Eat( )二个方法,其功能表如表3-6表3-6

35、 Tank类中方法表方法名功能备注collidesWithWall(Wall w)处理坦克和墙相撞的问题无备注Eat(Blood b)坦克吃血,增长生命无备注3.4 墙模块,添加两堵墙,处理坦克和墙相撞的问题。该类中的变量如表3-7所示。表3-7 Wall类中成员变量表成员变量描述变量类型名称坦克在X方向上的速度intXSPEED坦克在Y方向上的速度intYSPEED坦克的高度intHEIGHT该类中包括collidesWithWall( )一个方法,其功能表如表3-8表3-8 Wall Tank类中方法表方法名功能备注collidesWithWall(Wall w)处理坦克和墙相撞的问题无备

36、注3.5 血液模块,添加必要的方法,让血块按照一定轨迹运动,并在一定时间消失。该类中的变量如表3-9所示。表3-9 Blood类中成员变量表成员变量描述变量类型名称血块在X轴的坐标IntX血块在X轴的坐标IntY血块的宽度IntW血块的高度IntH该类中包括Move(),islive()二个方法,其功能表如表3-10所示。表3-10 Blood Tank类中方法表方法名功能备注Move()处理血块移动的问题无备注islive()判断血块是否活着无备注3.6 爆炸模块,击毙一辆坦克后产生爆炸。该类中的变量如表3-11所示。表3-11 Explode类中成员变量表成员变量描述变量类型名称坦克生死的

37、描述booleanLive主类的变量TankClientTc该类中包括GetDefaultToolkit(),Draw(Graphics)二个方法,其功能表如表3-12表3-12 Explode类中方法表方法名功能备注GetDefaultToolkit()拿到的工具包无备注Draw(Graphics)画爆炸现象无备注第四章 系统详细设计与实现4.1 游戏窗口与我方坦克1)窗口产生一个窗口,添加关闭窗口的事件处理,不允许窗口的大小改动。通过如下代码实现。 图4-1游戏窗口import java.awt.*;t.*;public class TankClient extends Frame pub

38、lic void lauchFrame() this.setLocation(400, 300);this.setSize(800, 600);this.setTitle(TankWar);this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0););this.setResizable(false);setVisible(true);public static void main(String args) TankClient tc = new TankC

39、lient();tc.lauchFrame();2)画出代表坦克的实心圆重写paint方法。注意:不要改变原来的前景色图4-2 单个坦克 public void paint(Graphics g) Color c = g.getColor();g.setColor(Color.RED);g.fillOval(50, 50, 30, 30);g.setColor(c);3)让坦克动起来将位置改变为变量,启动线程不断重画,线程重画更均匀,更能控制重画的速度。按键重画不能解决子弹自动飞行的问题。每次重画改变Tank位置。注意:x, y值得含义,指的是小方块的左上角点。图4-3单个坦克移动privat

40、e class PaintThread implements Runnable public void run() while(true) repaint();try Thread.sleep(100); catch (InterruptedException e) e.printStackTrace();4)使用双缓冲消除闪烁现象原因:刷心重画频率太快,paint方法还没有完成,逐条显示。解决:将所有东西画在虚拟图片上,一次性显示出来。图4-4消除闪烁public void update(Graphics g) if(offScreenImage = null) offScreenImage

41、 = this.createImage(800, 600);Graphics gOffScreen = offScreenImage.getGraphics();Color c = gOffScreen.getColor();gOffScreen.setColor(Color.GREEN);gOffScreen.fillRect(0, 0, 800, 600);gOffScreen.setColor(c);paint(gOffScreen);g.drawImage(offScreenImage, 0, 0, null);5)让坦克听从我们的指挥添加键盘监听类KeyMonitor,TankCli

42、ent添加键盘监听器,针对不同的键改变坦克位置,与重画线程结合产生不同方向运动。注意:switch case语句中break语句的运用图4-5手动移动坦克private class KeyMonitor extends KeyAdapter public void keyPressed(KeyEvent e) int key = e.getKeyCode();switch(key) case KeyEvent.VK_LEFT :x -= 5;break;case KeyEvent.VK_UP :y -= 5;break;case KeyEvent.VK_RIGHT :x += 5;break;

43、case KeyEvent.VK_DOWN :y += 5;break;6)将坦克单独包装成类建立Tank类,为Tank类添加成员变量x y,添加draw方法,使Tank类独立,制自己的画法,添加Tank类处理按键的方法,根据Tank类修改TankClient类。7)让主战坦克向8个方向行走添加记录按键状态的布尔量,添加代表方向的量(使用枚举),根据按键状态确定Tank方向,根据方向进行下一步的移动(move)。处理键抬起的消息修改TankClient相关代码。图4-6八方向移动public void keyPressed(KeyEvent e) int key = e.getKeyCode(

44、);switch(key) case KeyEvent.VK_LEFT :bL = true;break;case KeyEvent.VK_UP :bU = true;break;case KeyEvent.VK_RIGHT :bR = true;break;case KeyEvent.VK_DOWN :bD = true;break;locateDirection();4.2 子弹与一辆敌人坦克1)添加子弹类添加Missile类,添加x,y,dir等属性以及常量.添加构造方法, draw方法等必要方法,根据不同方向,进行不同的运动,在TankClient中模拟一颗子弹注意:不一定一次写到位。图4-7打一发子弹import java.awt.*;public class Missile public static final int XSPEED = 10;public static final int YSPEED = 10;int x, y;Tank.Direction dir;public Missile(int x, int y, Tank.Direction dir) this.x = x;this.y = y;this.dir =

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

当前位置:首页 > 技术资料 > 工程图纸

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com