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

本文介绍了一个Java实现的坦克大战游戏,详细解析了如何让坦克动起来,包括绘图原理、Component类的paint和repaint方法。通过实现KeyListener接口,使坦克根据键盘输入上下左右移动。游戏中的坦克在Panel上绘制,并通过重绘实现移动效果。
摘要由CSDN通过智能技术生成

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

723027bf7411f5efabef7eb878fd63e1.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值