上一篇,我们已经画出了一辆坦克,但是我们的坦克不会动,本篇(看起来长实际内容不多的),我们就来实现如何让坦克移动,(最好再建一个包存放复制原来的java文件),因为我们是一步步更新的,一乱可能连原来的文件都改回不了…
首先我们要做的是事件监听和事件处理,给MyPanel类添加一个接口KeyListener,并实现方法
class MyPanel extends Panel implements KeyListener
{
//省略部分代码......
/*实现KeyListener接口的方法*/
//键入某个键时调用此方法。
public void keyTyped(KeyEvent e) {
}
//释放某个键时调用此方法
public void keyReleased(KeyEvent e) {
}
//按下某个键时调用此方法: A代表向左,W代表向上,D代表向右,S代表向下
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W)//向上
{
}
else if(e.getKeyCode() == KeyEvent.VK_D)//向下
{
}
else if(e.getKeyCode() == KeyEvent.VK_S)//向下
{
}
else if(e.getKeyCode() == KeyEvent.VK_A)//向左
{
}
//没有这行代码即使实现了移动操作页面也不会动的
this.repaint();//调用repaint()函数,来重绘页面
}
}
!!!要实现监听,还要注册监听事件
public class TankGame2 extends JFrame{
public TankGame2(){
//...
this.addKeyListener(mp);//注册监听事件
}
}
其中 public void keyPressed(KeyEvent e){…}是我们主要操作的方法,下面四个if语句是添加上去的,用于判断是按了哪个键,按这个节奏,if语句里面是不是该填写坐标移动来实现坦克的移动呢(y–,x++,…),但是考虑到之后的修改问题,我们还是把移动这一方法封装起来(好处后面会提到)。在Tank类定义一个变量 int speed=1;作为坦克的速度,再回到Hero类添加移动的方法,由于 Hero继承Tank类,所以Hero类也能访问speed。
class Hero extends Tank
{
public Hero(int x,int y)
{
super(x,y);
}
//坦克向上移动
public void moveUp()
{
y-=speed;
}
//坦克向右移动
public void moveRight()
{
x+=speed;
}
//坦克向下移动
public void moveDown()
{
y+=speed;
}
//坦克向左移动
public void moveLeft()
{
x-=speed;
}
}
(如果是y++,x++那样的形式控制速度,那要修改速度就会显得很麻烦,连续改几个,而定义speed的话修改速度只需修改speed的数值。)接着再到刚才if语句那里添加移动方法
class MyPanel extends Panel implements KeyListener
{
//省略部分代码......
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_W)//向上
{
this.hero.moveUp();
}
else if(e.getKeyCode() == KeyEvent.VK_D)//向下
{
this.hero.moveRight();
}
else if(e.getKeyCode() == KeyEvent.VK_S)//向下
{
this.hero.moveDown();
}
else if(e.getKeyCode() == KeyEvent.VK_A)