TankWar单机版开发详解

上传人:s9****2 文档编号:488561048 上传时间:2023-04-20 格式:DOCX 页数:22 大小:160.85KB
返回 下载 相关 举报
TankWar单机版开发详解_第1页
第1页 / 共22页
TankWar单机版开发详解_第2页
第2页 / 共22页
TankWar单机版开发详解_第3页
第3页 / 共22页
TankWar单机版开发详解_第4页
第4页 / 共22页
TankWar单机版开发详解_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《TankWar单机版开发详解》由会员分享,可在线阅读,更多相关《TankWar单机版开发详解(22页珍藏版)》请在金锄头文库上搜索。

1、TankWar单机版开发详解1.做这个项目是为了:?为了复习J2SE的内容,综合运用J2SE所学的知识?掌握面向对象的基本思想,了解项目开发的整个过程?掌握MyEclipse开发J2SE程序的基本方法?掌握MyEclipse调试程序的基本方法?掌握编程时一些约定俗称的东西?命名/格式等?掌握一些常用的编程方法?getterssetters?持有对方引用?定义常量?保留版本程序?学会版本比较2 .需求分析:?能够四处移动?能够打击敌人?敌人能够移动?能够模拟爆炸?能够产生障碍?能够增长生命3 .版本0.1新建一个工程,命名为TankWar0.1,然后新建一个类TankClient,这是包含mai

2、n方法的主类。TankClient从Frame类继承,在TankClient类中定义一个方法launchFrame,在该方法中确定窗口的位置和大小。代码如下:importjava.awt.*;publicclassTankClientextendsFramepublicstaticfinallongserialVersionUID=1L;publicvoidlaunchFrame()this.setLocation(400,300);this.setSize(800,600);this.setVisible(true);publicstaticvoidmain(String口args)Tank

3、Clienttc=newTankClient();tc.launchFrame();该版本的功能是:产生一个窗口。掌握:通过MyEclipse建立新的项目;为新的项目指定不同的源代码和输出目录;指定项目所用的JDK版本;通过MyEclipse建立新的类。注意:类名和方法名的命名。要剪名知意;类名首字母大写;方法名,变量名首字母小写;引用驼峰标识。4 .版本0.2该版本要实现的功能:添加窗口关闭的事件处理不允许窗口大小改变掌握:匿名类的用法匿名类使用在类短小,不涉及将来的扩展,不涉及重要的业务逻辑通过MyEclipse重写父类方法添加事件处理需要导入java.awt.event.*;这个包,窗口

4、关闭有两种方法可用,如果TankClient从JFrame继承(当然要导入javax.swing.*),那么在launchFrame方法中只需写这样一条语句就可以了:this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);如果TankClient从Frame继承,添加窗口关闭的方法是:this.addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););不允许改变窗口大小用下面语句:this.setResizable(false

5、);标题栏的文字设置:this.setTitle(TankWar);5 .版本0.3功能:画出代表坦克的实心圆掌握:如何重写paint方法注意:不要改变原来的颜色paint(Graphicsg)方法,窗口重画时自动调用。桌面的左上角为(0,0)位置,向右代表x轴,向下代表y轴,画圆时涉及到4个参数,分别代表起始位置的x值和y值,长度和宽度,圆为该正方形的内切圆。双击TankCLient,点击右键,选择Source,Override/ImplementsMethods,重写paint方法,系统将自动生成一些源码,在paint方法里面,我们添加下面代码:Colorc=g.getC010r();去的

6、当前颜色g.setC010r(Color.red);/设置绘画笔颜色g.f川Oval(50,50,30,30);g.setC010r(c);/设回原来颜色改变一下背景颜色,在launchFrame中添力口:this.setBackground(Co1or.green);6 .版本0.4?功能:?让坦克运动起来?步骤:?将位置改变为变量?启动线程,不断重画?思考:为什么实用线程重画,而不是每按下一个键进行一次重画??线程重画跟均匀,更能控制重画的速度?按键重画不能解决子弹自动飞行的问题?每次重画改变坦克的位置?掌握:?内部类的使用(内部类可以很方便地访问包装类的方法,不方便公开的,只为包装类服务

7、的类应当设置为内部类)?注意:x,y值的含义,指的是小方块左上角点。在TankClient属性中定义左上角的位置,定义为变量,在paint方法里面对变量值进行改变,这样每次重画的时候会自动调用paint方法,如果要每隔一段时间画一次,需要定义线程,在此定义一个PaintThread线程。privateclassPaintThreadimplementsRunnablepublicvoidrun()while(true)repaint();tryThread.sleep(50);catch(InterruptedExceptione)e.printStackTrace();定义好线程后,在lau

8、nchFrame中启动线程:启动线程有两种方法:PaintThreadpt=newPaintThread。;Threadt=newThread(pt);t.start();第二种方法是:newThread(newPaintThread().start();两种方法是等价的。7 .版本0.41?功能:使用双缓冲消除闪烁现象?原因:刷新重画频率太快,paint方法还没有完成,反应现象就是逐条显示?解决方法:将所有东西画在虚拟的图片上,一次性显示出来先在属性域中声明Image对象offScreenImage为null。因为repaint方法在执行的时候会先调用update方法,因此在调用paint方

9、法之前,我们在update方法中进行绘画,然后再传送给paint方法。publicvoidupdate(Graphicsg)if(offScreenImage=null)offScreenImage=this.createImage(800,600);GraphicsgOffScreen=offScreenImage.getGraphics();/获得背后图片画笔Colorc=gOffScreen.getColor();gOffScreen.setColor(Color.green);gOffScreen.f川Rect(0,0,800,600);gOffScreen.setC010r(c);p

10、aint(gOffScreen);/将内容画在图片上g.drawImage(offScreenImage,0,0,null);/将背后图片的内容画在前景图片上8 .版本0.5代码重构:为了方便窗口大小改变,需要将窗口宽度和高度定义为常量,这样定义:publicstaticfinalintGAME_WIDTH=800;publicstaticfinalintGAME_HEIGHT=600;然后将程序中涉及到窗口大小的量用上述常量代替。9 .版本0.6添加键盘的监听,在此定义为内部类。?功能:让坦克听从我们的指挥?添加键盘监听器类KeyMonitor?TankClient添加键盘监听器?针对不同的

11、健改变坦克的位置,与重画线程结合产生不同的方向运动。本段代码如下:privateclassKeyMonitorextendsKeyAdapterpublicvoidkeyPressed(KeyEvente)intkey=e.getKeyCode();switch(key)caseKeyEvent.VK_LEFT:x-=5;break;caseKeyEvent.VK_UP:y-=5;break;caseKeyEvent.VK_DOWNy+=5;break;caseKeyEvent.VK_RIGHT:x+=5;break;当然,现在paint方法里的x与y值变化的语句就不要了。需要在launchF

12、rame里面添加键盘监听事件:this.addKeyListener(newKeyMonitor();10.版本0.7如果要添加100辆坦克进游戏,如何添加?在此考虑使用数组通不过,解决方法是使用面向对象的方法。建立一个坦克类,对当前代码进行简单修改。新建一个Tank类,考虑Tank有哪些属性和方法。属性暂时有:位置x,y。构造方法:利用MyEclipse自动生成构造函数。TankClient里面坦克的坐标就不需要了,定义一个坦克对象:TankmyTank=newTank(50,50);接下来在paint方法里,用面向对象的方法,画坦克的坦克类中的一种方法,在paint中直接调用就行了,所以在

13、Tank类中定义一个draw方法,用来画坦克。publicvoiddraw(Graphicsg)Colorc=g.getC010r();g.setC010r(Color.red);g.f川Oval(x,y,30,30);g.setC010r(c);在TankClient中,这样调用:myTank.draw(g);意思是说,坦克,我给你一支画笔,自己画自己去吧!相应地,键盘监听类里面也需要一些修改。在Tank类中定义两个方法keyPressed(KeyEvente)和keyReleased(KeyEvente),然后进行调用。publicvoidkeyPressed(KeyEvente)intk

14、ey=e.getKeyCode();switch(key)caseKeyEvent.VK_LEFT:x-=5;break;caseKeyEvent.VK_UP:y-=5;break;caseKeyEvent.VK_DOWNy+=5;break;caseKeyEvent.VK_RIGHT:x+=5;break;在KeyMonitor中只要调用即可:publicvoidkeyPressed(KeyEvente)myTank.keyPressed(e);综合来说,该版本的功能:?将坦克单独包装成类?步骤:?建立坦克类?为Tank类添加成员变量xy?添加draw方法,使Tank类独立控制自己的画笔?添

15、加Tank类处理按键的方法?根据Tank类修改TankClient类?掌握:?面向对象的思维方法?细节隐藏、构建单独的类,首先考虑系统中有哪些类?合适的方法应该出现在合适的类中11.版本0.8功能:?让坦克向八个方向行走?步骤:添加记录状态的布尔量?添加代表方向的量,只用枚举?根据按键确定Tank方向?根据方向能够进行下一步的移动在Tank类的属性域中,用四个布尔型来表示四个方向箭头是否按下:true。move方法,privatebooleanbL=false,bU=false,bR=false,bD=false;刚开始的时候全为false,表示没有一个按键按下,当按下一个键的时候,就把当前值设为表示八个方向的枚举:enumDirectionL,LU,U,RU,R,RD,D,LD,STOP;privateDirectiondir=Direction.STOP;/起始不动当按

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号