坦克大战-基础版01

坦克大战01-认识frame类

github:https://github.com/zwc819konkuk/tank-war

java.awt.Frame

Frame f = new Frame();
f.setSize()窗口大小
f.setResizabel()窗口宽高
f.setTitle()窗口标题
f.setVisible()窗口可见性
f.addWindowListener(new WindowAdapter() {//匿名内部类,是WindowListener的实现类
            //窗口关闭,点击左上角×
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
});

tankFrame类

g是系统给的画笔

在窗口里面画出一个正方形(左上角坐标为x,y)

    public void paint(Graphics g) {
       g.fillRect(x,y,50,50); //正方形的左上角坐标和宽高
    }

在tankFrame类中添加键盘监听事件【press&release】

因为只有在tankFrame中调用这个类所以使用内部类

//键盘事件的监听
this.addKeyListener(new MyKeyListener());

    //处理键盘的监听【内部类】
class MyKeyListener extends KeyAdapter{
        //键盘按下
        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println("key pressed");
        }
        //键盘抬起
        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("key released");
        }
}

添加键盘处理,根据上下左右按键状态,判定坦克移动方向

 class MyKeyListener extends KeyAdapter {

        //坦克的方向,坦克的坐标
        boolean bL = false;
        boolean bU = false;
        boolean bR = false;
        boolean bD = false;


        //键盘按下
        @Override
        public void keyPressed(KeyEvent e) {
            //x+=200;
            //需要重新载入画布
            //repaint();

            //识别按下去的键
            int key = e.getKeyCode();
            switch (key) {
                case KeyEvent.VK_LEFT:
                    bL = true;
                    break;
                case KeyEvent.VK_UP:
                    bU = true;
                    break;
                case KeyEvent.VK_RIGHT:
                    bR = true;
                    break;
                case KeyEvent.VK_DOWN:
                    bD = true;
                    break;
            }
        }

        //键盘抬起
        @Override
        public void keyReleased(KeyEvent e) {
            System.out.println("key released");

             //按下去的键归位
             int key = e.getKeyCode();
             switch (key) {
                 case KeyEvent.VK_LEFT:
                     bL = false;
                     break;
                 case KeyEvent.VK_UP:
                     bU = false;
                     break;
                 case KeyEvent.VK_RIGHT:
                     bR = false;
                     break;
                 case KeyEvent.VK_DOWN:
                     bD = false;
                     break;
             }
        }
    }

添加枚举类方向

public enum Dir {
    LEFT,UP,RIGHT,DOWN
}

添加属性方向和速度

    Dir dir = Dir.DOWN;
    private static final int SPEED = 10;

根据速度和方向以及按键,调整坦克位移

     public void paint(Graphics g) {
        g.fillRect(x, y, 50, 50); //正方形的左上角坐标和宽高
//        x += 10;
        //y += 10;
        switch (dir) {
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
        }
    }


 public class TankFrame extends Frame {
                case KeyEvent.VK_DOWN:
                    bD = true;
                    break;
                default:
                    break;
            }
            setMainTankDir();
        }

        //键盘抬起
        @Override
        public void keyReleased(KeyEvent e) {
            //按下去的键归位
            int key = e.getKeyCode();
            switch (key) {
                case KeyEvent.VK_LEFT:
                    bL = false;
                    break;
                case KeyEvent.VK_UP:
                    bU = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    bR = false;
                    break;
                case KeyEvent.VK_DOWN:
                    bD = false;
                    break;
                default:
                    break;
            }
            setMainTankDir();
        }

        private void setMainTankDir() {
            if (bL) dir = Dir.LEFT;
            if (bU) dir = Dir.UP;
            if (bR) dir = Dir.RIGHT;
            if (bD) dir = Dir.DOWN;
        }
    }

tank

抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用

public class Tank {
    private int x, y;
    private Dir dir = Dir.DOWN;

    public Dir getDir() {
        return dir;
    }

    public void setDir(Dir dir) {
        this.dir = dir;
    }

    private static final int SPEED = 10;

    public Tank(int x, int y, Dir dir) {
        this.x = x;
        this.y = y;
        this.dir = dir;
    }

    public void paint(Graphics g) {

        g.fillRect(x, y, 50, 50); //正方形的左上角坐标和宽高
        switch (dir) {
            case LEFT:
                x -= SPEED;
                break;
            case UP:
                y -= SPEED;
                break;
            case RIGHT:
                x += SPEED;
                break;
            case DOWN:
                y += SPEED;
                break;
        }

    }
}

tankframe

public class TankFrame extends Frame {
    Tank myTank = new Tank(200, 400, Dir.DOWN);
    
    public TankFrame() {
        setSize(GAME_WIDTH, GAME_HEIGHT);
        setResizable(false);
        setTitle("tank war");
        setVisible(true);

        //键盘事件的监听
        this.addKeyListener(new MyKeyListener());
        //窗口事件的监听
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    /*
        窗口需要重新绘制的时候调用
        Graphics g:系统给的画笔
         */
    @Override
    public void paint(Graphics g) {
        Color c = g.getColor();
        g.setColor(Color.WHITE);
        g.setColor(c);

        myTank.paint(g);
    }


    //处理键盘的监听【内部类】
    class MyKeyListener extends KeyAdapter {

        //坦克的方向,坦克的坐标
        boolean bL = false;
        boolean bU = false;
        boolean bR = false;
        boolean bD = false;


        //键盘按下
        @Override
        public void keyPressed(KeyEvent e) {
            //x+=200;
            //需要重新载入画布
            //repaint();

            //识别按下去的键
            int key = e.getKeyCode();
            switch (key) {
                case KeyEvent.VK_LEFT:
                    bL = true;
                    break;
                case KeyEvent.VK_UP:
                    bU = true;
                    break;
                case KeyEvent.VK_RIGHT:
                    bR = true;
                    break;
                case KeyEvent.VK_DOWN:
                    bD = true;
                    break;
                default:
                    break;
            }
            setMainTankDir();
            new Thread(()->new Audio("audios/tank_move.wav").play()).start();
        }

        //键盘抬起
        @Override
        public void keyReleased(KeyEvent e) {

            //按下去的键归位
            int key = e.getKeyCode();
            switch (key) {
                case KeyEvent.VK_LEFT:
                    bL = false;
                    break;
                case KeyEvent.VK_UP:
                    bU = false;
                    break;
                case KeyEvent.VK_RIGHT:
                    bR = false;
                    break;
                case KeyEvent.VK_DOWN:
                    bD = false;
                    break;
                case KeyEvent.VK_CONTROL:
                    myTank.fire();
                    break;
                default:
                    break;
            }
            setMainTankDir();
        }

        private void setMainTankDir() {

            if (!bL && !bU && !bR && !bD) {
                myTank.setMoving(false);
            } else {

                myTank.setMoving(true);

                if (bL) myTank.setDir(Dir.LEFT);
                if (bU) myTank.setDir(Dir.UP);
                if (bR) myTank.setDir(Dir.RIGHT);
                if (bD) myTank.setDir(Dir.DOWN);
            }
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值