Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形

发布于:2024-09-18 ⋅ 阅读:(9) ⋅ 点赞:(0)
  • 常用的绘图方法
1.设置当前画笔的颜色,可多次调用

        public abstract void setColor(Color c)

        参数:c -颜色

2. 画一条直线

        public abstract void drawLine(int x1, int y1, int x2, int y2)

        参数:x1 - 第一个点的 x坐标。 y1 - 第一点的 y坐标。 x2 - 第二点的 x坐标。 y2 - 第二点的 y坐标。

3.  画矩形边框

        public void drawRect(int x, int y, int width, int height)

        参数:x - 要绘制的矩形的 x坐标。 y - 要绘制的矩形的 y坐标。 width - 要绘制的矩形的宽度。 height - 要绘制的矩形的高度。

4. 画填充矩形,填充颜色为画笔颜色

        public abstract void fillRect(int x, int y, int width, int height)

        参数:x - 要填充的矩形的 x坐标。 y - 要填充的矩形的 y坐标。 width - 要填充的矩形的宽度。 height - 要填充的矩形的高度。

5. 画空心椭圆

        public abstract void drawOval(int x, int y, int width, int height)

        参数:x - 要绘制的椭圆的左上角的 x坐标。 y - 要绘制的椭圆的左上角的 y坐标。 width - 要绘制的椭圆的宽度。 height - 要绘制的椭圆的高度。

6. 画填充椭圆,填充颜色为画笔颜色

        public abstract void fillOval(int x, int y, int width, int height)

        参数:x - 要填充的椭圆的左上角的 x坐标。 y - 要填充的椭圆的左上角的 y坐标。 width - 要填充的椭圆的宽度。 height - 要填充的椭圆的高度。

7. 显示图片
        (1)准备图片

        将准备好的图片放到out目录的该项目根目录下

        (2)获取图片资源

        Image image =

        Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));

        (3)显示该图片

        g.drawImage(image, 10, 10, 175, 221, this);

注:网上直接下载的 .webp 图片改了后缀也放不进去,必须用PS转成其他格式,或者直接使用其他原生图片格式。

8. 显示字符串

        (1)设置字体格式

        g.setColor(Color.red);

        g.setFont(new Font("隶书", Font.BOLD, 50));

        (2)显示字体

        g.drawString("字体设置", 100, 100);

注:g.drawString 方法的横纵坐标指的是字体的左下角

  • 画出坦克图形
public class HspTankGame01 extends JFrame {

    // 定义一个MaPanel
    MyPanel mp = null;
    
    public static void main(String[] args) {
        new HspTankGame01();
    }

    public HspTankGame01() throws HeadlessException {
        mp = new MyPanel();
        this.add(mp);
        this.setSize(1000,750);
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }
}

public 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);

        // 坦克坐标为: x 和 y, 用方法给它包装起来
        drawMyTank(hero.getX(), hero.getY(), g, 0, 0);
        drawMyTank(hero.getX() + 100, hero.getY(), g, 1, 0);
        drawMyTank(hero.getX() + 200, hero.getY(), g, 2, 0);
        drawMyTank(hero.getX() + 300, hero.getY(), g, 3, 0);
    }

    /**
     * 画坦克的方法
     * @param x      坦克左上角的x横坐标
     * @param y      坦克左上角的y的纵坐标
     * @param g      画笔
     * @param direct 坦克的方向
     * @param type   坦克的类型
     */
    public void drawMyTank(int x, int y, Graphics g, int direct, int type) {

        switch (type) {
            case 0: // 自己的坦克
                g.setColor(Color.cyan);
                break;
            case 1: // 敌人的坦克
                g.setColor(Color.yellow);
                break;
        }

        switch (direct) {
            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 + 9, 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 + 9, 20, 20);
                // 炮管
                g.drawLine(x, y + 20, x + 40, y + 20);
                break;
            case 2: // 向下
                // 履带
                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 + 9, y + 20, 20, 20);
                // 炮管
                g.drawLine(x + 20, y + 20, x + 20, y + 60);
                break;
            case 3: // 向右
                // 履带
                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 + 9, 20, 20);
                // 炮管
                g.drawLine(x + 20, y + 20, x + 60, y + 20);
                break;
            default:
                System.out.println("其他坦克方向暂时没有处理");
        }
    }
}

运行结果: