折腾了这么久,坦克总算能动了。只贴代码编辑不给上首页,花了半个小时的时间写了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 paint字体设置_Java paint字体设置