【java版坦克大战--事件处理】坦克动起来了

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【java版坦克⼤战--事件处理】坦克动起来了折腾了这么久,坦克总算能动了。

只贴代码编辑不给上⾸页,花了半个⼩时的时间写了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函数被调⽤.
事件监听的步骤:
⼀个类实现监听的步骤:
1. 实现相应的接⼝(KeyListener,MouseListener,ActionListener,WindowListener)
2. 实现对事件的处理⽅法
3. 在事件源上注册监听
MyTankGame2
1/**
2 * 坦克游戏的2.0版
3 * 1.画出坦克
4 * 2.我的坦克可以上下左右移动
5*/
6package com.test5;
7
8import java.awt.*;
9import java.awt.event.*;
10import javax.swing.*;
11
12public class MyTankGame2 extends JFrame {
13
14 MyPanel mp = null;
15public static void main(String[] args) {
16 MyTankGame2 myTankGame2 = new MyTankGame2();
17 }
18//构造函数
19public MyTankGame2(){
20 mp = new MyPanel();
21this.add(mp);
22//c)在事件源上注册监听,mp为监听器
23this.addKeyListener(mp);
24
25this.setSize(400,300);
26this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
27this.setVisible(true);
28 }
29 }
30/*
31 * 我的⾯板,不清楚为什么MyPanel继承Panel监听没有效果。

⽽继承JPanel则正常。

有知道的⼤神告诉我下,先谢谢了。

32*/
33class MyPanel extends Panel implements KeyListener{ //a)实现键盘监听接⼝
34//定义⼀个我的坦克
35 Hero hero = null; //创建⼯作放在构造函数
36public MyPanel(){
37 hero = new Hero(100,100);
38 }
39//重写paint
40public void paint(Graphics g){
41super.paint(g);
42//将活动区域设置背景为⿊⾊
43 g.fillRect(0, 0, 400, 300);
44//画出我的坦克[封装成函数]
45this.drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),0);
46 }
47public void drawTank(int x,int y,Graphics g,int direct,int type){
48//1.设置颜⾊,画出左边的矩形
49switch(type){
50case 0:
51 g.setColor(Color.cyan);
52break;
53case 1:
54 g.setColor(Color.yellow);
55break;
56 }
57switch(direct){
58case 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);
68break;
69case 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);
83break;
84case 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);
94break;
95case 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);
109break;
110
111 }
112 }
113public void keyTyped(KeyEvent e) {
114 }
115//对键按下处理,⽤wdsa控制
116//b)实现对事件的处理⽅法
117public void keyPressed(KeyEvent e) {
118//按下w键,向上
119if(e.getKeyCode()==KeyEvent.VK_W){
120this.hero.setDirect(0);//设置坦克⽅向
121this.hero.moveUp();//向上移动
122 }else if(e.getKeyCode()==KeyEvent.VK_D){
123//d键,向右
124this.hero.setDirect(1);
125this.hero.moveRight();
126 }else if(e.getKeyCode()==KeyEvent.VK_S){
127//s键,向下
128this.hero.setDirect(2);
129this.hero.moveDown();
130 }else if(e.getKeyCode()==KeyEvent.VK_A){
131//a键,向左
132this.hero.setDirect(3);
133this.hero.moveLeft();
134 }
135this.repaint(); //重绘坦克。

当重回被调⽤的时候界⾯才能被刷新。

136 }
137public void keyReleased(KeyEvent e) {
138 }
139 }
140//画坦克,分析:坦克⽣活在哪个区域(MyPanel中)
members类
1package com.test5;
2//坦克类
3class Tank{
4//坦克的横坐标
5int x = 0;
6int y = 0;
7//坦克⽅向 0上,1右,2下,3左
8int direct = 0;
9//坦克速度
10int speed = 1;
11public int getSpeed() {
12return speed;
13 }
14public void setSpeed(int speed) {
15this.speed = speed;
16 }
17public int getDirect() {
18return direct;
19 }
20public void setDirect(int direct) {
21this.direct = direct;
22 }
23public int getX() {
24return x;
25 }
26public void setX(int x) {
27this.x = x;
28 }
29public int getY() {
30return y;
31 }
32public void setY(int y) {
33this.y = y;
34 }
35
36public Tank(int x,int y){
37this.x = x;
38this.y = y;
39 }
40 }
41//我的坦克
42class Hero extends Tank{ 43public Hero(int x,int y){ 44super(x,y);
45 }
46//坦克向上移动
47public void moveUp(){
48 y-=speed;
49 }
50//坦克向右移动
51public void moveRight(){
52 x+=speed;
53 }
54//坦克向下移动
55public void moveDown(){
56 y+=speed;
57 }
58//坦克向左移动
59public void moveLeft(){
60 x-=speed;
61 }
62 }。

相关文档
最新文档