Java之详解坦克大战游戏(二)

上一篇,我们已经画出了一辆坦克,但是我们的坦克不会动,本篇(看起来长实际内容不多的),我们就来实现如何让坦克移动,(最好再建一个包存放复制原来的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)
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值