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