坦克大战1.0

一、Java绘图体系

使用案例

public class Draw01 extends JFrame{
    //定义一个面板
    private MyPanel mp = null;
    public static void main(String[] args) {
        Draw01 draw01 = new Draw01();
    }
    public Draw01(){
        //初始化面板
        mp = new MyPanel();
        //把面板放入到窗口
        this.add(mp);
        this.setSize(400,300);
        this.setVisible(true);//可视化

    }
}
//定义一个面板
//MyPanel对应一个画板
//Graphics g 当作一个画笔
//Graphics提供很多画图方法
class MyPanel extends JPanel{
    @Override
    public void paint(Graphics g) {//绘图
        super.paint(g);
        g.drawOval(10,10,100,100);

    }

}

画图方法

在这里插入图片描述

二、定义坦克大战页面

1.画出区域和定义坦克位置

首先写出一个坦克父类让敌方坦克和自己继承

public class Tank {
    private int x;//坦克x坐标
    private int y;//y坐标

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

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

再写入自己坦克

public class Hero extends Tank{//自己的坦克

    public Hero(int x, int y) {
        super(x, y);
    }
}

再定义游戏面板

public class TankGame01 extends JFrame{
    private MyPanel mp = null;
    public static void main(String[] args) {
        new TankGame01();
    }
    public TankGame01(){
        mp = new MyPanel();
        this.add(mp);
        this.setSize(1000,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

    }
}
class MyPanel extends JPanel{
    Hero hero = null;
    public MyPanel(){
        hero = new Hero(100,100);
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750 );
    }

}

最后画出坦克

public void drawTank(int x,int y,Graphics g,int direction,int type){
        //根据不同类型确定坦克颜色
        switch (type){

            case 0://自己的坦克
                g.setColor(Color.cyan);
                break;
            case 1://敌人的坦克
                g.setColor(Color.yellow);
                break;
        }
        //根据坦克方向来绘制不同坦克
        switch(direction){
            case 0://表示向上
                g.fill3DRect(x,y,10,60,false);//画出左边轮胎
                g.fill3DRect(x+30,y,10,60,false);//右边
                g.fill3DRect(x+10,y+10,20,40,false);//中间主体
                g.fillOval(x+10,y+20,20,20);//画出中间圆圈
                g.drawLine(x+20,y,x+20,y+30);//画出炮管
                break;
                case 1:
            default:
                System.out.println("暂时没有处理");


        }
    }

}

三、java事件处理机制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.让小球动起来

//实现一个接口KeyListener是个监听器,可以监听键盘事件
public class Move01 extends JFrame {
    MyPanel mp = null;

    public static void main(String[] args) {
        new Move01();
    }

    public Move01() {
        mp = new MyPanel();
        this.add(mp);
        this.setSize(400, 300);
        //窗口JFrame对象可以监听键盘事件,即可以监听到面板发生的键盘事件
        this.addKeyListener(mp);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

}

class MyPanel extends JPanel implements KeyListener {
    //为了让小球可以移动将坐标设置为变量
    int x = 10;
    int y = 10;
    @Override
    public void paint(Graphics g) {//绘图
        super.paint(g);
        g.fillOval(x, y, 20, 20);//
    }

    // 又字符输出时,该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {

    }

    //当某个键按下,该方法就会触发
    @Override
    public void keyPressed(KeyEvent e) {
        //根据用户按下的不同键来处理小球的移动(上下左右)
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            y++;

        }else if(e.getKeyCode() == KeyEvent.VK_UP){
            y--;
        }else if(e.getKeyCode() == KeyEvent.VK_LEFT){
            x--;
        }else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
            x++;
        }

        //然后让面板重绘
        this.repaint();

    }

    //当某个键释放,该方法会触发
    @Override
    public void keyReleased(KeyEvent e) {

    }
}


2.让坦克调整方向

switch (direction) {
            case 0://表示向上
                g.fill3DRect(x, y, 10, 60, false);//画出左边轮胎
                g.fill3DRect(x + 30, y, 10, 60, false);//右边
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//中间主体
                g.fillOval(x + 10, y + 20, 20, 20);//画出中间圆圈
                g.drawLine(x + 20, y, x + 20, y + 30);//画出炮管
                break;
            case 1://表示向右
                g.fill3DRect(x, y, 60, 10, false);//画出左边轮胎
                g.fill3DRect(x, y + 30, 60, 10, false);//右边
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//中间主体
                g.fillOval(x + 20, y + 10, 20, 20);//画出中间圆圈
                g.drawLine(x + 60, y + 20, x + 20, y + 20);//画出炮管
                break;
            case 2://表示向下
                g.fill3DRect(x + 30, y, 10, 60, false);//画出左边轮胎
                g.fill3DRect(x, y, 10, 60, false);//右边
                g.fill3DRect(x + 10, y + 10, 20, 40, false);//中间主体
                g.fillOval(x + 10, y + 20, 20, 20);//画出中间圆圈
                g.drawLine(x + 20, y + 60, x + 20, y + 30);//画出炮管
                break;
            case 3://表示向左
                g.fill3DRect(x, y + 30, 60, 10, false);//画出左边轮胎
                g.fill3DRect(x, y, 60, 10, false);//右边
                g.fill3DRect(x + 10, y + 10, 40, 20, false);//中间主体
                g.fillOval(x + 20, y + 10, 20, 20);//画出中间圆圈
                g.drawLine(x, y + 20, x + 20, y + 20);//画出炮管
                break;
            default:
                System.out.println("暂时没有处理");

3.让坦克调整方向并移动

@Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            hero.setDirect(0);
            hero.moveUp();

        }else if(e.getKeyCode() == KeyEvent.VK_D){
            hero.setDirect(1);
            hero.moveRight();
        }else if(e.getKeyCode() == KeyEvent.VK_S){
            hero.setDirect(2);
            hero.moveDown();
        }else if(e.getKeyCode() == KeyEvent.VK_A){
            hero.setDirect(3 );
            hero.moveLeft();
        }

        //然后让面板重绘
        this.repaint();

    }

public void moveUp() {
        y -= 5;
    }
    public void moveDown() {
        y += 5;
    }
    public void moveLeft() {
        x -= 5;
    }
    public void moveRight() {
        x += 5;
    }

4.加入敌人坦克

加入敌人类继承坦克

public class Enemy extends Tank{

    public Enemy(int x, int y) {
        super(x, y);
    }
}

初始化敌人坦克

 //因为敌人坦克数量多,所以放到Vector集合中
    Vector<Enemy> enemy = new Vector<>();
    int enemysize = 3;

    public MyPanel() {
        //初始化敌人坦克
        for (int i = 0; i < enemysize; i++) {
            //传入坦克
            Enemy enemytank = new Enemy((100 * (i + 1)), 0);
            //设置方向
            enemytank.setDirect(2);
            //加入集合
            this.enemy.add(enemytank);
        }
 //画出敌人坦克,遍历集合
        for (int i = 0; i < enemy.size(); i++) {
            //传入坦克
            Enemy enemytank = enemy.get(i);
            drawTank(enemytank.getX(),enemytank.getY(),g,enemytank.getDirect(),0);
        }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Milisira

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值