Java综合编程——坦克大战(15.1.5)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

子弹类中的run()方法中
ActionEvent e
实现事件监听三步:
1. 2. 3.
确定事件源 确定监听类 监听对象的注册
举例——练习1

1. 2.tton,当该 按钮被按下后,系统给出提示 事件源JButton对象 监听器:
单独创建一个类负责监听 让JFrame负责监听
3.
把监听器加入到事件源中(注册监听) *事件对象,系统自动产生

坦克有方向, 画出所有方向的坦克
3、形成Tank类的子类


敌人坦克(EnemyTank)和我方坦克 (MyTank) 在这两个方法中覆盖父类的构造方法 将敌人坦克的颜色设置成蓝色 我方坦克设置成红色
4、


在MyPanel中绘制出一辆我方坦克,方向 向上 绘制出五辆敌人坦克,方向向下
在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);
基础知识
1. 2.
图形用户界面 Java绘图技术
1、图形用户界面

创建一个用户界面JFrame,取名为MainFrame 在其上添加一个JPanel,显示一个圆。
编程思路

(构建坦克大战主窗口)

坦克大战的主窗口是由一个JFrame构成的,因 为需要在上面作图,但是JFrame没有这个功能, 所以我们要在JFrame上再加上一个JPanel,在 JPanel上绘图。 我们在这里没有直接用JFrame和JPanel类,而 是定义另外两个类MainFrame和MainPanel,这 个两个类分别继承了JFrame和JPanel,然后再 由这两个类分别生成对象mf和mp,我们要在mp 对象上作图

什么时候重新绘制子弹?——当就JPanel调用repaint()方法时,可是我们 无法在坦克类中调用JPanel的该方法。但是,我们可以把JPanel也做成线 程,让它自己定时刷新,从而解决重绘问题。每隔100豪秒刷新一次
4、解决子弹死亡


如果子弹穿出面板则该子弹死亡,即子 弹的isalive=false 在那里添加该功能?
在MyPanel上面绘制坦克图形
(x,y)
在画出一辆坦克之前,需要先定义坦克类, 及两个子类:我方坦克类和地方坦克类

需要知道该坦克所处的位置(x,y) 定义一个坦克类Tank 坦克的位置、 坦克的类型(以后要考虑是敌 方坦克还是我方坦克) 坦克的方向(向上、下、左、 右)


定义我方坦克类MyTank 定义地方坦克类EnemyTank
第一种方法,单独生成监听器 类
注册监听
第二种方法:让Jframe作为监 听器
练习2:JFrame中加入两个JButton,当任何一个被按下后,系统提 示哪个被按下
实例:

在Jframe上加入MyPanel,在 MyPanel上绘制一个小球,控 制上下左右按钮让小球移动。
坦克要运动起来

在父类Tank中增加相应方法
基础知识——Java绘图
(0,0) X轴
(x,y)
Y轴
绘图类Graphics

所有的绘图方法都在该类中 draw3DRect(int x, int y, int width, int height, 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 height, boolean raised) 绘制一个用当前颜色填充的 3-D 高亮显示矩形。 fillOval(int x, int y, int width, int height) 使用当前颜色填充外接指定矩形框的椭圆。

通过继承Thread类 通过传递Runnable对象
创建线程的两种方法
1、通过继承Thread类 从Thread类派生出一个新类 覆盖run()方法 创建派生类的对象,调用start()方法 2、通过传递Runnable对象 定义一个类如MyTask,它实现了Runnable接口 创建一个MyTask对象 将该对象作为Thread构造方法的参数
步骤一、创建MainFrame
1. 2.
创建类MainFrame让该类继承 JFrame(创建时加上主函数) 在该类的构造方法中做初始化 的工作。
3.
在main主方法中实例化一个对 象mf 运行看效果
4.
第二步:向MainFrame中添加 组件



定义类MyPanel (继承JPanel) 重写paint方法时调用父类的paint方 法。 在MainFrame中声明MyPanel 对象mp, 并在MainFrame的初始化方法中 1. 创建该对象mp,并将这个组件添加进 入MainFrame中。 2. 设置窗口大小400,,300(最好用变量) 3. 关闭后释放内存 (this.setDefaultCloseOperation(J Frame.EXIT_ON_CLOSE);)设置可 视化 4. 设置可视化(this.setVisible(true);)
MyPanel中绘制坦克
敌人坦克保存到一个向量 表中,方便以后管理
版本一效果图
版本二
1. 2. 3. 4.
事件监听知识 让我方坦克可以根据键盘控制移动 定义子弹类 当用户按下J键后生成一颗子弹对象, 并在面板上绘制出该子弹。
Component
Instance of
AWTEventListener
3、让子弹动起来

线程知识 如果需要子弹动起来 就需要根据子弹的方 向修改子弹的坐标, 在面板上重新绘制该 子弹。——这一部分 功能在什么地方添加?

将子弹类添加线程 的功能,一旦子弹 创建就启动run()方 法,将上面的功能 添加到run()方法中。 子弹每隔50豪秒变 一次位置

当坦克开始发射子弹时,即调用fire()方法时,需要创建该子弹对 象,同时还需要根据此子弹对象创建线程,并启动该线程。

让我方坦克可以发射子弹

发射子弹的方法应该放到什么地方?

我方坦克可以发射子弹,敌人坦克也可以, 因此发射子弹的功能应该定义在他们的父类 TankClass中,定义该方法:fire()方法。其 子类MyTank和EnemyTank均可以调用此方 法向外发射子弹。
2、用户在按下J键后显示生成 一颗子弹



如何实现绘图



如果需要画图就需要根据绘图类Graphics生成一个实 例对象,该对象就相当于一支笔,有了这支笔就可以 画出想要的图形(调用该类已经定义好的一些绘图方 法)。 但是,使用Graphics类必须依赖于某个组件。 所有组件都是Component类的子类,在Component类 中定义了三种方法: Public void paint(Graphics g) Public 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()方法?
1.
2.
3.
1.
当该组件在显示时系统自动调用该组件 的paint()方法,或者从隐藏变成显 示时。 从缩小图标还原为正常显示之后。 正在改变窗口大小时。
实例


创建一个线程,使其每隔1秒输出一个 helloworld 让该线程输出10次后退出。

用Thread接口实现上面例题

实现两个线程的并发执行,一个线程计 算1+2+3+。。。+n,每加一次输出一 次中间结果。另外一个线程输出n次 helloworld



编写定时炸弹程序,倒计时10秒,在此过程中 如果没有从键盘输入quit则爆炸,如果在10秒 内键盘输入quit则退出爆炸程序 分析:需要两个线程,一个负责倒计时,如果 倒计时结束则炸弹爆炸。另一个负责读取键盘 输入,并判断输入是否为quit,如果是则终止 第一个线程。 第一个线程由我们自己编写的线程类Bomb完 成,第二个线程由main主方法来完成。


每辆坦克都有自己的子弹,所以,在父类 TankClass中需要定义内部属性 Bullet b; 判断用户按下J键后就可以调用坦克的fire()方 法,在该方法中就可以创建子弹类的对象,让 坦克生成一颗子弹对象 用户按下J键后虽然创建了子弹对象,但是此 时并没有将该子弹在面板上绘制出来,所以看 不见.如果想看到此子弹,需要在JPanel的 paint()方法中将该子弹绘制出来。绘制的前提 条件是abullet!=null&&abullet.isIsalive()
在JPanel上画坦克
30
(x+10,y+1) (x+15,y) 9 10 (x+5,y+5)
(x+5,y+10) 20 (x+10,y+15) 10 5
方法的封装


将上面代码封装到一个方法中 paintTank(Graphics g) 该方法应该放置在什么地方?

放在Tank类中,或者在MyPanel中
Java综合编程——坦克大战
贾克
用到的知识点

Java图形界面 Java绘图技术 Java事件处理 Java多线程编程 Java I/O
版本一、绘制坦克
1. 2. 3.
4.
Java绘图功能介绍 绘制一辆坦克 形成坦克类Tank,及我方 坦克类MyTank和敌方坦 克类EnemyTank 分别根据这些坦克类绘制 出一辆我方坦克,五辆敌 方坦克

何时产生子弹?当按下J键时产生子 弹,所以坦克有发射子弹的功能( 我们把它封装到fire方法中),当按 下J键时便调用fire方法产生子弹。

绘制出子弹
版本三、让我方坦克可以发射 子弹
1. 2. 3.
让子弹动起来 解决子弹死亡 解决只能发一颗子弹
3、让子弹动起来

线程知识

创建线程的两种方法
坦克动起来

由谁监听?——JPanel

此类实现相应方法
创建子弹类

子弹类现在需要完成的功能

定义子弹出现的位置:x,y 定义子弹的构造函数

子弹属于哪一个类:我的坦克类
定义子弹类
每颗子弹有位置,还可以沿着 某个方向继续走,所以,每颗子弹 都具有一定的功能,需要创建子弹 类来进行管理。 Bullet类 属性: int x,y;//子弹的位置 int direct;//子弹的方向 int speed=3;//控制子弹速度 boolean isalive=true;//子弹是否还活着 方法: 构造方法Bullet(int x,int y,int d)//根据坦 克炮筒的位置创建子弹的起始位置,并将 子弹方向设置为坦克当时的方向
实现
监听
事件源对象
触发事件 产生
注册
监听器对象
作为参数传入
事件对象
Instance of
AWTEvent
监听
Button b
按下按钮
b.addActionListener(bh)
Monitor bh
产生事件对象
作为参数传入 actionPerformed(Action Event e){ System.out.println(…); }
相关文档
最新文档