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

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

绘图原理

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

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

②   repaint()刷新组件的外观

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

类 Panel

java.lang.Object

java.awt.Component

java.awt.Container

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函数被调用.

事件监听的步骤:

一个类实现监听的步骤:

  1. 实现相应的接口(KeyListener,MouseListener,ActionListener,WindowListener)
  2. 实现对事件的处理方法
  3. 在事件源上注册监听

MyTankGame2

  1. /**
  2. * 坦克游戏的2.0版
  3. * 1.画出坦克
  4. * 2.我的坦克可以上下左右移动
  5. */
  6. package com.test5;
  7.  
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import javax.swing.*;
  11.  
  12. public class MyTankGame2 extends JFrame {
  13.  
  14. MyPanel mp = null;
  15. public static void main(String[] args) {
  16. MyTankGame2 myTankGame2 = new MyTankGame2();
  17. }
  18. //构造函数
  19. public MyTankGame2(){
  20. mp = new MyPanel();
  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. public MyPanel(){
  37. hero = new Hero(100,100);
  38. }
  39. //重写paint
  40. public void paint(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,int type){
  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 void keyTyped(KeyEvent e) {
  114. }
  115. //对键按下处理,用wdsa控制
  116. //b)实现对事件的处理方法
  117. public void keyPressed(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 void keyReleased(KeyEvent e) {
  138. }
  139. }
  140. //画坦克,分析:坦克生活在哪个区域(MyPanel中)

members类

  1. package com.test5;
  2. //坦克类
  3. class Tank{
  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 int getSpeed() {
  12. return speed;
  13. }
  14. public void setSpeed(int speed) {
  15. this.speed = speed;
  16. }
  17. public int getDirect() {
  18. return direct;
  19. }
  20. public void setDirect(int direct) {
  21. this.direct = direct;
  22. }
  23. public int getX() {
  24. return x;
  25. }
  26. public void setX(int x) {
  27. this.x = x;
  28. }
  29. public int getY() {
  30. return y;
  31. }
  32. public void setY(int y) {
  33. this.y = y;
  34. }
  35.  
  36. public Tank(int x,int y){
  37. this.x = x;
  38. this.y = y;
  39. }
  40. }
  41. //我的坦克
  42. class Hero extends Tank{
  43. public Hero(int x,int y){
  44. super(x,y);
  45. }
  46. //坦克向上移动
  47. public void moveUp(){
  48. y-=speed;
  49. }
  50. //坦克向右移动
  51. public void moveRight(){
  52. x+=speed;
  53. }
  54. //坦克向下移动
  55. public void moveDown(){
  56. y+=speed;
  57. }
  58. //坦克向左移动
  59. public void moveLeft(){
  60. x-=speed;
  61. }
  62. }

【 java版坦克大战--事件处理】 坦克动起来了的更多相关文章

  1. 【 java版坦克大战--事件处理】 让坦克动起来--事件处理的准备

    要能够控制坦克运动,必须用到事件处理的知识. 事件处理的一个demo. /** * 事件处理机制:委派事件模型.指当事件发生的时候,产生事件的对象(事件源),会把此 * "消息"传 ...

  2. 【 java版坦克大战--事件处理】 键盘控制小球上下左右移动

    上一节已经学习了事件处理,这一节需要完成通过键盘的上下左右键控制小球移动. 然后再通过应用到我们绘制的坦克上. /** * 加深对事件处理机制的理解 * 通过光标的上下左右键,控制小球的左右上下移动. ...

  3. java版飞机大战 实战项目详细步骤.md

    [toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...

  4. java版飞机大战代码

    @ 目录 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before 前言 很久之前 ...

  5. java版模拟浏览器下载百度动漫图片到本地。

    package javaNet.Instance.ImageDownload; import java.io.BufferedReader; import java.io.File; import j ...

  6. Html 5 坦克大战(韩顺平县版本号)

    html 5例如,下面的代码段: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/ ...

  7. 【 java版坦克大战--绘图技术】 绘制坦克

    通过上一节,我们学会的用java绘图.那现在就用java绘制自己坦克. 首先通过分析坦克由这几部分组成.如图 各个部件的长宽如图.15,10为圆心. /** * 坦克游戏的1.0版 * 1.画出坦克 ...

  8. Java坦克大战 (七) 之图片版

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  9. 【java版坦克大战---准备篇】 java 绘图

    要写坦克大战当然要先画出坦克.java画图是基础. package com.game; import java.awt.*; import javax.swing.*; public class Pr ...

随机推荐

  1. python学习(4)

    python(4)4.1 高阶函数:map/reduce map:实际上map也是一个函数,只不过他可以在参数里面包含别的函数.他有两种参数:第一种:函数(作用在后面要说的序列上),第二种:一个序列  ...

  2. 删除mysql服务

    当我们卸载完MySQL后重新装MySQL提示 The service already exists! 是因为服务名称还残留在系统里 打开cmd 输入下面 sc delete mysql 这个mysql ...

  3. 成员方法的this指针

    1.我们知道成员方法中,有个隐式的this常量指针.考虑,Derived继承的成员方法中this指针的表面类型是什么?子类重写的虚方法中this指针的表面类型是什么? 2.Derived继承的方法,就 ...

  4. 我们应该如何去了解JavaScript引擎的工作原理 系列

    http://www.nowamagic.net/librarys/veda/detail/1579

  5. oralce表空间自增长占满磁盘

    取消表空间自动增长 SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE,bytes/1024/1024/1024 FROM dba_data_files; ...

  6. Nexus搭建Maven服务器

    参考:http://blog.csdn.net/ichsonx/article/details/14642897 1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央 ...

  7. 理解Objective-c中的copy

    说一下深拷贝和浅拷贝的基本概念:a指针指向地址A1, 浅拷贝是创建了一个b指针指向地址A1:深拷贝是创建了一个c指针指向地址A2,A1和A2的地址不同. 我们看到NSObject接口里面是已经声明了c ...

  8. Es6 之箭头函数 初学

    不积跬步,无以至千里;不积小流,无以成江海! // ES5 var selected = allJobs.filter(function (job) { return job.isSelected() ...

  9. count()与sum()

    介绍Mysql中的count()与sum()区别 CREATE TABLE `result` ( `name` varchar(20) default NULL, `subject` varchar( ...

  10. 获得服务器硬件信息(CPUID、硬盘号、主板序列号、IP地址等)

    1 // 注意:首先要在项目中添加引用 System.Management using System; using System.Collections.Generic; using System.L ...