折腾了这么久,坦克总算能动了。只贴代码编辑不给上首页,花了半个小时的时间写了n多注释。

再顺便把绘图的原理发在这里:

绘图原理

Component类提供了两个和绘图有关的重要方法:

①   paint(Graphics g)绘制组件的外观.

②   repaint()刷新组件的外观

当组件第一次在屏幕显示的时候,程序会自动调用paint()方法绘制组件.

类 Panel

java.awt.Panel

在上一节种

public MyPanel extends Panel{

public void paint(Graphics g){

super.paint(g);

g.drawRect();

}

}

现在可以为什么MyPanel继承了Panel就会有paint方法,可以画图了.

在以下情况下paint()方法将会被调用.

1.窗口最小化,再最大化.

2.窗口大小发生变化.

3.repaint函数被调用.

事件监听的步骤:

一个类实现监听的步骤:

实现相应的接口(KeyListener,MouseListener,ActionListener,WindowListener)

实现对事件的处理方法

在事件源上注册监听

MyTankGame2

1 /**

2 * 坦克游戏的2.0版3 * 1.画出坦克4 * 2.我的坦克可以上下左右移动5 */

6 packagecom.test5;7

8 import java.awt.*;9 import java.awt.event.*;10 import javax.swing.*;11

12 public class MyTankGame2 extendsJFrame {13

14 MyPanel mp = null;15 public static voidmain(String[] args) {16 MyTankGame2 myTankGame2 = newMyTankGame2();17 }18 //构造函数

19 publicMyTankGame2(){20 mp = newMyPanel();21 this.add(mp);22 //c)在事件源上注册监听,mp为监听器

23 this.addKeyListener(mp);24

25 this.setSize(400,300);26 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);27 this.setVisible(true);28 }29 }30 /*

31 * 我的面板,不清楚为什么MyPanel继承Panel监听没有效果。而继承JPanel则正常。有知道的大神告诉我下,先谢谢了。32 */

33 class MyPanel extends Panel implements KeyListener{ //a)实现键盘监听接口34 //定义一个我的坦克

35 Hero hero = null; //创建工作放在构造函数

36 publicMyPanel(){37 hero = new Hero(100,100);38 }39 //重写paint

40 public voidpaint(Graphics g){41 super.paint(g);42 //将活动区域设置背景为黑色

43 g.fillRect(0, 0, 400, 300);44 //画出我的坦克[封装成函数]

45 this.drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),0);46 }47 public void drawTank(int x,int y,Graphics g,int direct,inttype){48 //1.设置颜色,画出左边的矩形

49 switch(type){50 case 0:51 g.setColor(Color.cyan);52 break;53 case 1:54 g.setColor(Color.yellow);55 break;56 }57 switch(direct){58 case 0:59 g.fill3DRect(x,y, 5, 30,false);60 //2.画出右边的矩形

61 g.fill3DRect(x+15,y, 5, 30,false);62 //3.画出中间的矩形

63 g.fill3DRect(x+5,y+5, 10, 20,false);64 //4.画出中间的圆型

65 g.fillOval(x+5,y+10, 10, 10);66 //5.画炮管

67 g.drawLine(x+10,y,x+10,y+15);68 break;69 case 1:70 /*

71 * 炮筒向右72 */

73 //画上面的矩形

74 g.fill3DRect(x,y, 30,5,false);75 //2.画出右边的矩形

76 g.fill3DRect(x,y+15, 30, 5,false);77 //3.画出中间的矩形

78 g.fill3DRect(x+5,y+5, 20, 10,false);79 //4.画出中间的圆型

80 g.fillOval(x+10,y+5, 10, 10);81 //5.画炮管

82 g.drawLine(x+15,y+10,x+30,y+10);83 break;84 case 2:85 g.fill3DRect(x,y, 5, 30,false);86 //2.画出右边的矩形

87 g.fill3DRect(x+15,y, 5, 30,false);88 //3.画出中间的矩形

89 g.fill3DRect(x+5,y+5, 10, 20,false);90 //4.画出中间的圆型

91 g.fillOval(x+5,y+10, 10, 10);92 //5.画炮管

93 g.drawLine(x+10,y+15,x+10,y+30);94 break;95 case 3:96 /*

97 * 炮筒向左边98 */

99 //画上面的矩形

100 g.fill3DRect(x,y, 30,5,false);101 //2.画出右边的矩形

102 g.fill3DRect(x,y+15, 30, 5,false);103 //3.画出中间的矩形

104 g.fill3DRect(x+5,y+5, 20, 10,false);105 //4.画出中间的圆型

106 g.fillOval(x+10,y+5, 10, 10);107 //5.画炮管

108 g.drawLine(x+15,y+10,x,y+10);109 break;110

111 }112 }113 public voidkeyTyped(KeyEvent e) {114 }115 //对键按下处理,用wdsa控制116 //b)实现对事件的处理方法

117 public voidkeyPressed(KeyEvent e) {118 //按下w键,向上

119 if(e.getKeyCode()==KeyEvent.VK_W){120 this.hero.setDirect(0);//设置坦克方向

121 this.hero.moveUp();//向上移动

122 }else if(e.getKeyCode()==KeyEvent.VK_D){123 //d键,向右

124 this.hero.setDirect(1);125 this.hero.moveRight();126 }else if(e.getKeyCode()==KeyEvent.VK_S){127 //s键,向下

128 this.hero.setDirect(2);129 this.hero.moveDown();130 }else if(e.getKeyCode()==KeyEvent.VK_A){131 //a键,向左

132 this.hero.setDirect(3);133 this.hero.moveLeft();134 }135 this.repaint(); //重绘坦克。当重回被调用的时候界面才能被刷新。

136 }137 public voidkeyReleased(KeyEvent e) {138 }139 }140 //画坦克,分析:坦克生活在哪个区域(MyPanel中)

members类

1 packagecom.test5;2 //坦克类

3 classTank{4 //坦克的横坐标

5 int x = 0;6 int y = 0;7 //坦克方向 0上,1右,2下,3左

8 int direct = 0;9 //坦克速度

10 int speed = 1;11 public intgetSpeed() {12 returnspeed;13 }14 public void setSpeed(intspeed) {15 this.speed =speed;16 }17 public intgetDirect() {18 returndirect;19 }20 public void setDirect(intdirect) {21 this.direct =direct;22 }23 public intgetX() {24 returnx;25 }26 public void setX(intx) {27 this.x =x;28 }29 public intgetY() {30 returny;31 }32 public void setY(inty) {33 this.y =y;34 }35

36 public Tank(int x,inty){37 this.x =x;38 this.y =y;39 }40 }41 //我的坦克

42 class Hero extendsTank{43 public Hero(int x,inty){44 super(x,y);45 }46 //坦克向上移动

47 public voidmoveUp(){48 y-=speed;49 }50 //坦克向右移动

51 public voidmoveRight(){52 x+=speed;53 }54 //坦克向下移动

55 public voidmoveDown(){56 y+=speed;57 }58 //坦克向左移动

59 public voidmoveLeft(){60 x-=speed;61 }62 }

java 坦克大战暂停_【 java版坦克大战--事件处理】 坦克动起来了相关推荐

  1. java 基础面试 英文_[Java面试] 面试java基础总结大全

    原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...

  2. java获得map内存_[java]测试static的map的内存

    正版包邮elasticsearch实战与原理 70.1元 包邮 (需用券) 去购买 > import com.carrotsearch.sizeof.RamUsageEstimator; imp ...

  3. java视、频_[java视频]感人故 事视 频网 站上那找~~~

    感人故 事视 频网 站上那找~~~ 问题补充:感人故 事视 频网 站上那找~~~ ●呵呵,你问对人了,感人故事就去"新浪show",现在是新浪期下的网站,运行稳定,观看流畅,上传简 ...

  4. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅

    [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅 0 2020-10-29 18:24:42 现象 通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时 ...

  5. java privatekey输出字符串_[Java教程]根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象_星空网...

    根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象 2012-05-29 0 1.字符串生成公钥对象 PublicKey /** * 实例化公钥 * * @re ...

  6. java 历遍 类_[Java] 遍历指定包名下所有的类(支持jar) | 学步园

    项目需要,仅做记录. 支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClas ...

  7. java 图片宽高_[Java]获取图片高和宽

    通过javax.imageio.ImageIO类中的read()函数读取的图片,存放在类java.awt.image.BufferedImage类中.调用BufferedImage类中的getWidt ...

  8. java语言金山打字_[Java教程]java实现 swing模仿金山打字 案例源码

    [Java教程]java实现 swing模仿金山打字 案例源码 0 2014-11-17 12:00:21 java实现 swing模仿金山打字 案例源码,更多Java技术就去Java教程网.http ...

  9. java实现计算器框架_[Java小程序] 实现简单计算器

    这学期没事学了一点点Java,想写个程序练手,因为只学了一点点,所以暂时只能先写个实现简单功能的计算器练练.感觉写完后不是很好,如果路过的哪位高手给点建议,小弟万分感激啊. 由于期末来了,没太多时间, ...

最新文章

  1. firewalled centos7
  2. 安卓手机可以连接斑马系统吗_斑马郝飞:我们一定能在车载系统上打败安卓
  3. 【转】大型网站系统架构演化之路
  4. mysql5.1修改登陆密码_mysql 5.1版本修改密码及远程登录mysql数据库的方法
  5. itext pdf转图片_图片转PDF怎么转换?可以试试这个PDF转换软件
  6. Sql Server 指定列的乘积
  7. kafka练习:创建topic以及生产与消费
  8. Centos7搭建虚拟用户FTP
  9. 达观数据:Tornado原理浅析及应用场景探讨
  10. 百度富文本编辑器的使用
  11. 《硅谷之谜》读书笔记
  12. 学生端极域课堂万能密码
  13. 从本地硬盘启动计算机,戴尔笔记本电脑设置从硬盘启动的方法
  14. 中考体育项目满分标准(深圳、安徽、湖北)
  15. 医药之家:仿制药市场加速洗牌,多家药企陆续通过一致性评价
  16. office2007的Excel当中如何打开两个独立窗口
  17. 如何让浏览器直接下载后端返回的图片而不是打开
  18. 国际网页短信系统平台搭建后台功能篇|移讯云短信系统
  19. 导购提成怎么算_小公司怎么给销售算提成才合理?
  20. linux指令练习题

热门文章

  1. DS18B20测量温度数码管显示
  2. linux u盘新建文件夹加密,linux磁盘的加密保护以及u盘加密的方法
  3. FICO KE27物料不显示实际成本
  4. 全球及中国便携式空气采样器行业发展态势及投资前景展望报告(2022-2027)
  5. flex java blazeds_FLEX 与JAVA的LCDS BLAZEDS配置. | 学步园
  6. 4大热门数据分析软件怎么选?看这篇就够了
  7. linux 进入其他磁盘分区,Linux磁盘分区,及磁盘的其他操作
  8. MT8167A技术规格书资料介绍
  9. 千江有水千江月,万里无云万里天 1
  10. 2022-2028全球与中国重型卡车轮胎市场现状及未来发展趋势