ToB企服应用市场:ToB评测及商务社交产业平台

标题: day01-GUI坦克大战01 [打印本页]

作者: 鼠扑    时间: 2022-9-16 17:23
标题: day01-GUI坦克大战01
JavaGUI-坦克大战

1.Java绘图坐标体系


2.绘图入门和机制

绘图原理:
思考:如何证明上面的三种情况会调用paint()方法?
例子1:画出一个圆形
  1. package li.gui;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. public class DrawCircle extends JFrame {//JFrame对应窗口,可以理解成一个画框
  5.     //定义一个面板
  6.     private MyPanel mp = null;
  7.     public static void main(String[] args) {
  8.         new DrawCircle();
  9.     }
  10.     public DrawCircle() {//构造器
  11.         //初始化面板
  12.         mp = new MyPanel();
  13.         //把面板放入窗口(画框)
  14.         this.add(mp);
  15.         //设置窗口的的大小
  16.         this.setSize(400, 300);
  17.         //当点击窗口的小x时,程序完全退出
  18.         this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  19.         this.setVisible(true);//可以显示
  20.     }
  21. }
  22. //1 .先定义一个MyPanel,继承JPanel类,画图形,就在面板上画
  23. class MyPanel extends JPanel {
  24.     // 1.MyPanel 对象就是一个画板
  25.     // 2. Graphics g 把 g理解成一支画笔
  26.     // 3. Graphics提供了很多绘图的方法
  27.     @Override
  28.     public void paint(Graphics g) {//绘图方法
  29.         super.paint(g);//调用父类的方法完成初始化
  30.         System.out.println("paint方法被调用~");
  31.         //画出一个圆形
  32.         g.drawOval(0, 0, 100, 100);
  33.     }
  34. }
复制代码
在以下情况paint()将会被调用:
思考:如何证明上面的三种情况会调用paint()方法?
运行上面的程序,可以看到命令行窗口打印出“paint方法被调用~“的字样。
这时,点击绘制圆形图案窗口的最小化按钮,可以看到命令行窗口又打印了一行paint方法被调用的字样:
拖动打印圆形图案的窗口,调整其大小,可以看到命令行窗口一直显示paint方法被调用:
repaint方法被调用在后面证明。
3.绘图方法

Graphics类
Graphics类可以理解就是画笔,为我们提供了各种绘制图形的方法[参考JDK帮助文档]
例子:演示具体用法
  1. package li.gui;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. public class DrawCircle extends JFrame {//JFrame对应窗口,可以理解成一个画框
  5.     //定义一个面板
  6.     private MyPanel mp = null;
  7.     public static void main(String[] args) {
  8.         new DrawCircle();
  9.     }
  10.     public DrawCircle() {//构造器
  11.         //初始化面板
  12.         mp = new MyPanel();
  13.         //把面板放入窗口(画框)
  14.         this.add(mp);
  15.         //设置窗口的的大小
  16.         this.setSize(400, 300);
  17.         //当点击窗口的小x时,程序完全退出
  18.         this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  19.         this.setVisible(true);//可以显示
  20.     }
  21. }
  22. //1 .先定义一个MyPanel,继承JPanel类,画图形,就在面板上画
  23. class MyPanel extends JPanel {
  24.     // 1.MyPanel 对象就是一个画板
  25.     // 2. Graphics g 把 g理解成一支画笔
  26.     // 3. Graphics提供了很多绘图的方法
  27.     @Override
  28.     public void paint(Graphics g) {//绘图方法
  29.         super.paint(g);//调用父类的方法完成初始化
  30.         //System.out.println("paint方法被调用~");
  31.         //画出一个圆形
  32.         //g.drawOval(0, 0, 100, 100);
  33.         //演示绘制不同的图形
  34.         // 1. 画直线 drawLine(int x1, int y1, int x2, int y2);
  35.         //g.drawLine(10,10,100,100);
  36.         // 2. 画矩形边框 drawRect(int x, int y, int width, int height)
  37.         //g.drawRect(10,10,100,100) ;
  38.         // 3. 画椭圆边框 drawOval(int x,  int y, int width, int height)
  39.         //g.drawOval(10, 10, 100, 80);
  40.         // 4. 填充矩形 fillRect(int x,  int y, int width, int height)
  41.         //先设置画笔的颜色
  42.         //g.setColor(Color.blue);
  43.         //g.fillRect(10,10,100,100);
  44.         // 5. 填充椭圆 fillOval(int x,  int y, int width, int height)
  45.         //g.setColor(Color.red);
  46.         //g.fillOval(10,10,100,80);
  47.         // 6. 画图片 drawImage(Image img,int x,int y, ...)
  48.         //首先获取图片资源
  49.         //注意图片要放到out目录的项目的根目录下
  50.         //Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
  51.         //g.drawImage(image,10,10,186,282,this);
  52.         // 7. 画字符串 drawString(String str,int x,int y)
  53.         //先设置字体颜色
  54.         g.setColor(Color.green);
  55.         g.setFont(new Font("隶书",Font.BOLD,50));
  56.         g.drawString("闪电五连鞭",100,100);
  57.         // 8. 设置画笔的字体 setFont(Font font)
  58.         // 9. 设置画笔的颜色 setColor(Color c)
  59.     }
  60. }
复制代码
4.绘制坦克游戏区域

4.1坦克坐标设计

Tank类
  1. package li.TankGame.VersionFirst;
  2. /**
  3. * @author 李
  4. * @version 1.0
  5. */
  6. public class Tank {
  7.     private int x;//坦克的横坐标
  8.     private int y;//坦克的纵坐标
  9.     public Tank(int x, int y) {
  10.         this.x = x;
  11.         this.y = y;
  12.     }
  13.     public int getX() {
  14.         return x;
  15.     }
  16.     public void setX(int x) {
  17.         this.x = x;
  18.     }
  19.     public int getY() {
  20.         return y;
  21.     }
  22.     public void setY(int y) {
  23.         this.y = y;
  24.     }
  25. }
复制代码
Hero类
  1. package li.TankGame.VersionFirst;
  2. /**
  3. * @author 李
  4. * @version 1.0
  5. */
  6. public class Hero extends Tank{
  7.     public Hero(int x, int y) {
  8.         super(x, y);
  9.     }
  10. }
复制代码
MyPanel类
  1. package li.TankGame.VersionFirst;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. /**
  5. * @author 李
  6. * @version 1.0
  7. * 坦克大战的绘图区域
  8. */
  9. public class MyPanel extends JPanel {
  10.     //定义我的坦克
  11.     Hero hero = null;
  12.     public MyPanel() {
  13.         hero = new Hero(100, 100);//初始化自己的坦克
  14.     }
  15.     @Override
  16.     public void paint(Graphics g) {
  17.         super.paint(g);
  18.         g.fillRect(0, 0, 700, 550);//填充矩形,默认为黑色
  19.         //画出坦克-封装方法
  20.         drawTank(hero.getX(),hero.getY(),g,0,0);
  21.     }
  22.     /** 编写方法,画出坦克
  23.      * @param x      坦克的左上角横坐标
  24.      * @param y      坦克的左上角纵坐标
  25.      * @param g      画笔
  26.      * @param direct 坦克方向(上下左右)
  27.      * @param type   坦克的类型(我方,敌方)
  28.      */
  29.     public void drawTank(int x, int y, Graphics g, int direct, int type) {
  30.         //根据不同类型的坦克设置不同的颜色
  31.         switch (type) {
  32.             case 0://我方坦克
  33.                 g.setColor(Color.cyan);//设置我方坦克颜色
  34.                 break;
  35.             case 1://敌方坦克
  36.                 g.setColor(Color.yellow);//设敌方坦克颜色
  37.                 break;
  38.         }
  39.         //根据坦克坐标方向,来绘制坦克
  40.         switch (direct) {
  41.             case 0:
  42.                 g.fill3DRect(x, y, 10, 60,false);//画出坦克左边的轮子
  43.                 g.fill3DRect(x+30, y, 10, 60,false);//画出坦克右边的轮子
  44.                 g.fill3DRect(x+10,y+10,20,40,false);//画出坦克主体
  45.                 g.fillOval(x+10,y+20,20,20);//画出坦克舱体
  46.                 g.drawLine(x+20,y-5,x+20,y+30);//画出炮管
  47.                 break;
  48.             default:
  49.                 System.out.println("暂时没有处理");
  50.         }
  51.     }
  52. }
复制代码
TankGame01类(主方法)
  1. package li.TankGame.VersionFirst;
  2. import javax.swing.*;
  3. /**
  4. * @author 李
  5. * @version 1.0
  6. */
  7. public class TankGame01 extends JFrame {
  8.     //定义一个MyPanel
  9.     MyPanel mp = null;
  10.     public static void main(String[] args) {
  11.         TankGame01 tankGame01 = new TankGame01();
  12.     }
  13.     public TankGame01(){
  14.         mp = new MyPanel();
  15.         this.add(mp);//把面板(就是游戏的绘图区域)添加进来
  16.         this.setSize(700,550);//设置大小
  17.         this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//点击窗口的叉时停止运行
  18.         this.setVisible(true);//设置显示
  19.     }
  20. }
复制代码
绘图练习:画出如下图形
1.蛤蟆
2.王八
3.小老鼠

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4