折腾了这么久,坦克总算能动了。只贴代码编辑不给上首页,花了半个小时的时间写了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函数被调用.
事件监听的步骤:
一个类实现监听的步骤:
- 实现相应的接口(KeyListener,MouseListener,ActionListener,WindowListener)
- 实现对事件的处理方法
- 在事件源上注册监听
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 }