java综合编程——坦克大战(15.1.5)剖析

上传人:今*** 文档编号:106862804 上传时间:2019-10-16 格式:PPT 页数:87 大小:803KB
返回 下载 相关 举报
java综合编程——坦克大战(15.1.5)剖析_第1页
第1页 / 共87页
java综合编程——坦克大战(15.1.5)剖析_第2页
第2页 / 共87页
java综合编程——坦克大战(15.1.5)剖析_第3页
第3页 / 共87页
java综合编程——坦克大战(15.1.5)剖析_第4页
第4页 / 共87页
java综合编程——坦克大战(15.1.5)剖析_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《java综合编程——坦克大战(15.1.5)剖析》由会员分享,可在线阅读,更多相关《java综合编程——坦克大战(15.1.5)剖析(87页珍藏版)》请在金锄头文库上搜索。

1、Java综合编程坦克大战,贾克,用到的知识点,Java图形界面 Java绘图技术 Java事件处理 Java多线程编程 Java I/O,版本一、绘制坦克,Java绘图功能介绍 绘制一辆坦克 形成坦克类Tank,及我方坦克类MyTank和敌方坦克类EnemyTank 分别根据这些坦克类绘制出一辆我方坦克,五辆敌方坦克,基础知识,图形用户界面 Java绘图技术,1、图形用户界面,创建一个用户界面JFrame,取名为MainFrame 在其上添加一个JPanel,显示一个圆。,编程思路(构建坦克大战主窗口),坦克大战的主窗口是由一个JFrame构成的,因为需要在上面作图,但是JFrame没有这个功

2、能,所以我们要在JFrame上再加上一个JPanel,在JPanel上绘图。 我们在这里没有直接用JFrame和JPanel类,而是定义另外两个类MainFrame和MainPanel,这个两个类分别继承了JFrame和JPanel,然后再由这两个类分别生成对象mf和mp,我们要在mp对象上作图,步骤一、创建MainFrame,创建类MainFrame让该类继承JFrame(创建时加上主函数) 在该类的构造方法中做初始化的工作。 在main主方法中实例化一个对象mf 运行看效果,第二步:向MainFrame中添加组件,定义类MyPanel (继承JPanel) 重写paint方法时调用父类的p

3、aint方法。 在MainFrame中声明MyPanel 对象mp, 并在MainFrame的初始化方法中 创建该对象mp,并将这个组件添加进入MainFrame中。 设置窗口大小400,,300(最好用变量) 关闭后释放内存(this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);)设置可视化 设置可视化(this.setVisible(true);),基础知识Java绘图,X轴,Y轴,(x,y),(0,0),绘图类Graphics,所有的绘图方法都在该类中 draw3DRect(int x, int y, int width, int hei

4、ght, boolean raised) 绘制指定矩形的 3-D 高亮显示边框。 drawLine(int x1, int y1, int x2, int y2) 在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线。 drawOval(int x, int y, int width, int height) 绘制椭圆的边框。 drawString(String str, int x, int y) 使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。 fill3DRect(int x, int y, int width, int

5、height, boolean raised) 绘制一个用当前颜色填充的 3-D 高亮显示矩形。 fillOval(int x, int y, int width, int height) 使用当前颜色填充外接指定矩形框的椭圆。,如何实现绘图,如果需要画图就需要根据绘图类Graphics生成一个实例对象,该对象就相当于一支笔,有了这支笔就可以画出想要的图形(调用该类已经定义好的一些绘图方法)。 但是,使用Graphics类必须依赖于某个组件。 所有组件都是Component类的子类,在Component类中定义了三种方法: Public void paint(Graphics g) Publi

6、c void repaint(); Public void update(Graphics g) 如果声明的类是组件类Component的子类,则可以通过覆盖父类的paint()方法获得Graphics对象g。然后在paint()方法中用该对象g绘制图形,如何通过paint()方法画圆,在MyPanel中(200,200)位置绘制出一个半径为100的圆 在MyPanel的paint方法中,g.drawOval(200, 200, 100, 100);,何时调用paint()方法?,当该组件在显示时系统自动调用该组件的paint()方法,或者从隐藏变成显示时。 从缩小图标还原为正常显示之后。 正

7、在改变窗口大小时。 在paint方法中用System.out.println(“调用paint“);,画直线:g.drawLine(10, 10, 40, 40); 画矩形边框:g.drawRect(60, 60, 100, 200); 画填充矩形:g.fill3DRect(50, 50, 30, 30, true); 设置颜色:g.setColor(Color.red);,在MyPanel上面绘制坦克图形,(x,y),在画出一辆坦克之前,需要先定义坦克类,及两个子类:我方坦克类和地方坦克类,需要知道该坦克所处的位置(x,y) 定义一个坦克类Tank 坦克的位置、 坦克的类型(以后要考虑是敌方

8、坦克还是我方坦克) 坦克的方向(向上、下、左、右) 定义我方坦克类MyTank 定义地方坦克类EnemyTank,在JPanel上画坦克,5,30,10,20,9,10,(x+5,y+5),(x+5,y+10),(x+15,y),(x+10,y+15),(x+10,y+1),方法的封装,将上面代码封装到一个方法中paintTank(Graphics g) 该方法应该放置在什么地方? 放在Tank类中,或者在MyPanel中,坦克有方向, 画出所有方向的坦克,3、形成Tank类的子类,敌人坦克(EnemyTank)和我方坦克(MyTank) 在这两个方法中覆盖父类的构造方法 将敌人坦克的颜色设置

9、成蓝色 我方坦克设置成红色,4、,在MyPanel中绘制出一辆我方坦克,方向向上 绘制出五辆敌人坦克,方向向下,MyPanel中绘制坦克,敌人坦克保存到一个向量表中,方便以后管理,版本一效果图,版本二,事件监听知识 让我方坦克可以根据键盘控制移动 定义子弹类 当用户按下J键后生成一颗子弹对象,并在面板上绘制出该子弹。,事件源对象,监听器对象,事件对象,注册,产生,作为参数传入,监听,AWTEventListener,Component,实现,Instance of,AWTEvent,Instance of,触发事件,Button b,Monitor bh,ActionEvent e,b.add

10、ActionListener(bh),产生事件对象,作为参数传入,监听,按下按钮,actionPerformed(ActionEvent e) System.out.println(); ,实现事件监听三步:,确定事件源 确定监听类 监听对象的注册,举例练习1,在一个JFrame中加入一JButton,当该按钮被按下后,系统给出提示 事件源JButton对象 监听器: 单独创建一个类负责监听 让JFrame负责监听 把监听器加入到事件源中(注册监听) *事件对象,系统自动产生,第一种方法,单独生成监听器类,注册监听,第二种方法:让Jframe作为监听器,练习2:JFrame中加入两个JButt

11、on,当任何一个被按下后,系统提示哪个被按下,实例:,在Jframe上加入MyPanel,在MyPanel上绘制一个小球,控制上下左右按钮让小球移动。,坦克要运动起来,在父类Tank中增加相应方法,坦克动起来,由谁监听?JPanel 此类实现相应方法,创建子弹类,子弹类现在需要完成的功能 定义子弹出现的位置:x,y 定义子弹的构造函数 子弹属于哪一个类:我的坦克类,定义子弹类,每颗子弹有位置,还可以沿着 某个方向继续走,所以,每颗子弹 都具有一定的功能,需要创建子弹 类来进行管理。 Bullet类 属性: int x,y;/子弹的位置 int direct;/子弹的方向 int speed=3

12、;/控制子弹速度 boolean isalive=true;/子弹是否还活着 方法: 构造方法Bullet(int x,int y,int d)/根据坦克炮筒的位置创建子弹的起始位置,并将子弹方向设置为坦克当时的方向,让我方坦克可以发射子弹,发射子弹的方法应该放到什么地方? 我方坦克可以发射子弹,敌人坦克也可以,因此发射子弹的功能应该定义在他们的父类TankClass中,定义该方法:fire()方法。其子类MyTank和EnemyTank均可以调用此方法向外发射子弹。,2、用户在按下J键后显示生成一颗子弹,每辆坦克都有自己的子弹,所以,在父类TankClass中需要定义内部属性 Bullet

13、b; 判断用户按下J键后就可以调用坦克的fire()方法,在该方法中就可以创建子弹类的对象,让坦克生成一颗子弹对象 用户按下J键后虽然创建了子弹对象,但是此时并没有将该子弹在面板上绘制出来,所以看不见.如果想看到此子弹,需要在JPanel的 paint()方法中将该子弹绘制出来。绘制的前提条件是abullet!=null&abullet.isIsalive(),何时产生子弹?当按下J键时产生子弹,所以坦克有发射子弹的功能(我们把它封装到fire方法中),当按下J键时便调用fire方法产生子弹。,绘制出子弹,版本三、让我方坦克可以发射子弹,让子弹动起来 解决子弹死亡 解决只能发一颗子弹,3、让子

14、弹动起来,线程知识 创建线程的两种方法 通过继承Thread类 通过传递Runnable对象,创建线程的两种方法,1、通过继承Thread类 从Thread类派生出一个新类 覆盖run()方法 创建派生类的对象,调用start()方法 2、通过传递Runnable对象 定义一个类如MyTask,它实现了Runnable接口 创建一个MyTask对象 将该对象作为Thread构造方法的参数,实例,创建一个线程,使其每隔1秒输出一个helloworld 让该线程输出10次后退出。,用Thread接口实现上面例题,实现两个线程的并发执行,一个线程计算1+2+3+。+n,每加一次输出一次中间结果。另外

15、一个线程输出n次helloworld,编写定时炸弹程序,倒计时10秒,在此过程中如果没有从键盘输入quit则爆炸,如果在10秒内键盘输入quit则退出爆炸程序 分析:需要两个线程,一个负责倒计时,如果倒计时结束则炸弹爆炸。另一个负责读取键盘输入,并判断输入是否为quit,如果是则终止第一个线程。 第一个线程由我们自己编写的线程类Bomb完成,第二个线程由main主方法来完成。,3、让子弹动起来,线程知识 如果需要子弹动起来就需要根据子弹的方向修改子弹的坐标,在面板上重新绘制该子弹。这一部分功能在什么地方添加? 将子弹类添加线程的功能,一旦子弹创建就启动run()方法,将上面的功能添加到run(

16、)方法中。子弹每隔50豪秒变一次位置,当坦克开始发射子弹时,即调用fire()方法时,需要创建该子弹对象,同时还需要根据此子弹对象创建线程,并启动该线程。,什么时候重新绘制子弹?当就JPanel调用repaint()方法时,可是我们无法在坦克类中调用JPanel的该方法。但是,我们可以把JPanel也做成线程,让它自己定时刷新,从而解决重绘问题。每隔100豪秒刷新一次,4、解决子弹死亡,如果子弹穿出面板则该子弹死亡,即子弹的isalive=false 在那里添加该功能? 子弹类中的run()方法中 如何判断子弹穿出面板? 子弹的坐标超出了面板的范围,5、解决只能发一颗子弹的问题,每辆坦克不止拥有一颗子弹而是很多子弹,所以,在坦克Tank类中,还有一个属性 Vector bullets=new Vector();/保存该坦克所

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

当前位置:首页 > 高等教育 > 大学课件

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