1. 程式人生 > >JAVA入門到精通-第37講-事件總結-坦克大戰5

JAVA入門到精通-第37講-事件總結-坦克大戰5

 新建一個包:新建一個類,MyTankGame02.java
}   坦克的移動:  重新繪製repaint才能動起來;  最後,需要註冊監聽;  這樣,改起來速度很靈活;
改變坦克的方向: Outline:大綱:   類-方法:   根據通包的訪問機制,Members和MyTankGame
  是可以相互訪問的。   根據方向對函式進行擴充套件:(坦克炮筒方向)     參照點需要從左上角,移動到中心點;    橫著放,矩形,寬度、高度需要變化;    Vector執行緒安全;用Vector集合實現;  敵人的 坦克:  加一個顏色color:
   在面板上定義敵人的坦克:
 在建構函式裡面進行初始化:  每次橫座標間隔50,縱座標為0:    建立一輛敵人坦克物件,加入到集合中;    畫出敵人坦克:
 用向量算出敵人坦克數量;
 g,direct,type  畫筆,方向,坦克顏色  初始化的時候換個方向:     x   1
/**
2
 * 功能:坦克遊戲的1.01
3
 * 1、畫出坦克
4
 * 2、坦克動起來
5
 */
6
import java.awt.*;
7
import java.awt.event.KeyEvent;
8
import java.awt.event.KeyListener;
9
10
import javax.swing.*;
11
public class MyTank02 extends JFrame{
12
    //定義元件
13
    MyPanel mp=null;
14
    public static void main(String[] args) {
15
        MyTank02 mt=new MyTank02();
16
    }
17
    //建構函式
18
    public MyTank02(){
19
        //構建元件
20
        mp=new MyPanel();
21
        
22
        //監聽
23
        this.addKeyListener(mp);
24
        
25
        //加入元件
26
        this.add(mp);
27
        
28
        //設定JFrame窗體
29
        this.setTitle("坦克大戰");//JFrame標題
30
        this.setSize(400, 300);//JFrame窗體大小
31
        this.setLocationRelativeTo(null);//在螢幕中心顯示
32
        this.setVisible(true);//顯示
33
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出並關閉JFrame
34
        
35
    }
36
}
37
38
//我的面板Panel
39
class MyPanel extends JPanel implements KeyListener{
40
    //定義一個我的坦克
41
    Hero hero=null;
42
    
43
    int x=10,y=10,z=0;//初始坦克在MyPanel的位置
44
    
45
    //建構函式
46
    public MyPanel(){
47
        hero=new Hero(x, y, z);//我的坦克初始位置
48
    }
49
    
50
    //重寫paint函式
51
    public void paint(Graphics g){
52
        super.paint(g);//呼叫父類paint方法
53
        //設定Panel底色
54
        g.fillRect(0, 0, 400, 300);//fillRect(0,0,X?,Y?)中X?/Y?為活動區域
55
        //呼叫坦克
56
        this.drawTank(hero.getX(), hero.getY(), g, 1, hero.getZ());
57
    }
58
    
59
    //畫出坦克的函式
60
    public void drawTank(int x,int y,Graphics g,int type,int direct){
61
        //判斷是什麼型別的坦克
62
        switch(type){
63
        case 0:
64
            g.setColor(Color.cyan);//我的坦克顏色
65
            break;
66
        case 1:
67
            g.setColor(Color.yellow);//敵人坦克顏色
68
            break;
69
        case 2:
70
            g.setColor(Color.red);
71
            break;
72
        }
73
        
74
        //判斷坦克的方向
75
        switch(direct){
76
        //向上走的坦克
77
        case 0:
78
            //畫出我的坦克(到時再封裝成一個函式)
79
            //1、畫出左邊的矩形
80
            g.fill3DRect(x, y, 5, 30, false);
81
            //2、畫出右邊的矩形
82
            g.fill3DRect(x+15, y, 5, 30, false);
83
            //3、畫出中間矩形
84
            g.fill3DRect(x+5, y+5, 10, 20, false);
85
            //4、畫出中間圓形
86
            g.fillOval(x+5, y+10, 10, 10);
87
            //5、畫出線(炮筒)
88
            g.drawLine(x+10, y+15, x+10, y);
89
            break;
90
        //向下走的坦克
91
        case 1:
92
            //1、畫出左邊的矩形
93
            g.fill3DRect(x, y, 5, 30, false);
94
            //2、畫出右邊的矩形
95
            g.fill3DRect(x+15, y, 5, 30, false);
96
            //3、畫出中間矩形
97
            g.fill3DRect(x+5, y+5, 10, 20, false);
98
            //4、畫出中間圓形
99
            g.fillOval(x+5, y+10, 10, 10);
100
            //5、畫出線(炮筒)
101
            g.drawLine(x+10, y+15, x+10, y+29);
102
            break;
103
        //向左走的坦克
104
        case 2:
105
            //1、畫出上邊的矩形
106
            g.fill3DRect(x, y, 30, 5, false);
107
            //2、畫出下邊的矩形
108
            g.fill3DRect(x, y+15, 30, 5, false);
109
            //3、畫出中間矩形
110
            g.fill3DRect(x+5, y+5, 20, 10, false);
111
            //4、畫出中間圓形
112
            g.fillOval(x+10, y+5, 10, 10);
113
            //5、畫出線(炮筒)
114
            g.drawLine(x+15, y+10, x, y+10);
115
            break;
116
        //向右走的坦克
117
        case 3:
118
            //1、畫出左邊的矩形
119
            g.fill3DRect(x, y, 30, 5, false);
120
            //2、畫出右邊的矩形
121
            g.fill3DRect(x, y+15, 30, 5, false);
122
            //3、畫出中間矩形
123
            g.fill3DRect(x+5, y+5, 20, 10, false);
124
            //4、畫出中間圓形
125
            g.fillOval(x+10, y+5, 10, 10);
126
            //5、畫出線(炮筒)
127
            g.drawLine(x+15, y+10, x+29, y+10);
128
            break;
129
        }
130
    }
131
132
    public void keyPressed(KeyEvent e) {//按下鍵事件
133
        if(e.getKeyCode()==KeyEvent.VK_DOWN){
134
            hero.setX(x);
135
            hero.setY(y++);
136
            hero.setZ(z+1);
137
        }else if(e.getKeyCode()==KeyEvent.VK_UP){
138
            hero.setX(x);
139
            hero.setY(y--);
140
            hero.setZ(z+0);
141
        }else if(e.getKeyCode()==KeyEvent.VK_LEFT){
142
            hero.setX(x--);
143
            hero.setY(y);
144
            hero.setZ(z+2);
145
        }else if(e.getKeyCode()==KeyEvent.VK_RIGHT){
146
            hero.setX(x++);
147
            hero.setY(y);
148
            hero.setZ(z+3);
149
        }
150
        //呼叫repaint()函式,來重繪介面
151
        this.repaint();
152
        
153
    }
154
155
    public void keyReleased(KeyEvent e) {//彈起鍵事件
156
        
157
        
158
    }
159
    
160
    public void keyTyped(KeyEvent e) {//按鍵輸出值
161
        
162
        
163
    }
164
    
165
}
166
167
//定義坦克類
168
class Tank{
169
    //表示坦克的X橫座標Y縱座標Z坦克方向
170
    int x=0,y=0,z=0;
171
172
    public Tank(int x,int y,int z){
173
        this.x=x;
174
        this.y=y;
175
        this.z=z;
176
    }
177
178
    public int getX() {
179
        return x;
180
    }
181
182
    public void setX(int x) {
183
        this.x = x;
184
    }
185
186
    public int getY() {
187
        return y;
188
    }
189
190
    public void setY(int y) {
191
        this.y = y;
192
    }
193
194
    public int getZ() {
195
        return z;
196
    }
197
198
    public void setZ(int z) {
199
        this.z = z;
200
    }
201
}
202
203
//我的坦克
204
class Hero extends Tank{
205
    public Hero(int x,int y,int