Java重修笔记 第五十四天 坦克大战(二)常用的绘图方法、画出坦克图形
-
常用的绘图方法
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 {// 定义一个MaPanelMyPanel 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);}@Overridepublic 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("其他坦克方向暂时没有处理");}}
}
运行结果: