P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

P568坦克大战

P568坦克大战

看到Java的画图想起了python的GUI,绘图学起来应该比较简单

P569java绘图坐标

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

P570绘图入门与原理

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

将图形最大然后最小真的会

import javax.swing.*;
import java.awt.*;
public class Draw01 extends JFrame{//Fram框架,窗口
    private MyPannel mp=null;//定义一个面板
    public static void main(String[] args) {
        //听老师讲课总想起Python小乌龟在我脑海里瞎走,哈哈哈救命
        new Draw01();//
        System.out.println("退出程序");
    }
    public Draw01(){//构造器
        //初始化面板
       mp = new MyPannel();
        //把面板放入到窗口(画框)
        this.add(mp);
        //设置窗口的大小
        this.setSize(400, 300);
        //当点击窗口的小×,程序完全退出.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);//可以显示
    }
}
​
//1.先定义一个MyPanel, 继承JPanel 类, 画图形,就在面板上画
class MyPannel extends JPanel{
    //1. MyPanel 对象就是一个画板
    // 2. Graphics g 把g 理解成一支画笔
    // 3. Graphics 提供了很多绘图的方法
    // Graphics g
    @Override
    public void paint(Graphics g) {//绘图方法
        super.paint(g);//调用父类的方法完成初始化.
        System.out.println("paint方法被调用");
        g.drawOval(10,10,100,100);//画一个圆形
    }
}

P571Java绘图技术

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

package YUE1;
​
import javax.swing.*;
import java.awt.*;
​
public class Draw01 extends JFrame{//框架
    private MyPannel mp= null;//定义一个面板
    public static void main(String[] args) {
        new Draw01();
    }
    public Draw01() {//构造器
//初始化面板
        mp = new MyPannel();
//把面板放入到窗口(画框)
        this.add(mp);
//设置窗口的大小
        this.setSize(400, 400);
//当点击窗口的小×,程序完全退出.
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);//可以显示
    }
}
//先定义一个MyPannel,画板继承JPanle
class MyPannel extends JPanel{
    @Override
    public void paint(Graphics g) {//重写构造器
        super.paint(g);//调用父类的方法完成初始化
        //演示绘制不同的图形..
//画直线drawLine(int x1,int y1,int x2,int y2)
//g.drawLine(10, 10, 100, 100);
//画矩形边框drawRect(int x, int y, int width, int height)
//g.drawRect(10, 10, 100, 100);
//画椭圆边框drawOval(int x, int y, int width, int height)
//填充矩形fillRect(int x, int y, int width, int height)
//设置画笔的颜色
// g.setColor(Color.blue);
// g.fillRect(10, 10, 100, 100);
//填充椭圆fillOval(int x, int y, int width, int height)
// g.setColor(Color.red);
// g.fillOval(10, 10, 100, 100);
//画图片drawImage(Image img, int x, int y, ..)
//1. 获取图片资源, /bg.png 表示在该项目的根目录去获取bg.png 图片资源
        //Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
       // g.drawImage(image,10,10,300,400,this);
        //画字符串drawString(String str, int x, int y)//写字
        // 给画笔设置颜色和字体
        g.setColor(Color.red);
        g.setFont(new Font("隶书", Font.BOLD, 50));
        //这里设置的100, 100, 是"北京你好"左下角
        g.drawString("北京你好", 100, 100);
        //设置画笔的字体setFont(Font font)
        // 设置画笔的颜色setColor(Color c)
    }
}

P572绘出坦克

1.先画出Tank源类,自己的坦克myhero(继承),MyPanel(绘版,定义我的坦克,构造器初始化坦克,包含画笔),框架(包含绘图,提供构造器定义绘图)

2分析怎么画坦克,主要是位置的确定,在绘图区画出坦克(方法),public void drawTank(int x,int y,Graphics g,int director,int type)

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

public class Tank1 {
    private int x;
    private int y;
    public Tank1(int x, int y) {
        this.x = x;
        this.y = y;
    }
 }//省略getset等方法
public class MyHero extends Tank1{
    public MyHero(int x, int y) {
        super(x, y);
    }
}
public class TankeGame01 extends JFrame {//框架
    //定义一个pannel
    MyPanel mp=null;
    public static void main(String[] args) {
        TankeGame01 tankeGame01 = new TankeGame01();
    }
    public TankeGame01(){
        mp=new MyPanel();
        this.add(mp);//把面板就是绘图区)
        this.setSize(1000,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}
public class MyPanel extends JPanel {//绘图区
    //定义我的坦克
    MyHero myHero=null;
    public MyPanel(){
        myHero=new MyHero(100,100);//初始化自己的坦克
    }
​
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形,默认黑色
        //画出坦克-封装方法
        drawTank(myHero.getX(), myHero.getY(), g,0,0);
        drawTank(myHero.getX()+60, myHero.getY(), g,0,1);
​
    }
    //编写方法,画出坦克
​
    /***
     *
     * @param x 坦克的左上角的x坐标
     * @param y 坦克的左上角的y坐标
     * @param g 画笔
     * @param director 方法
     * @param type 坦克类型
     */
    public void drawTank(int x,int y,Graphics g,int director,int type){
        switch (type){
            case 0://我们的坦克
                g.setColor(Color.cyan);//青色
                break;
            case 1://敌人的坦克
                g.setColor(Color.yellow);//
                break;
        }
        //根据坦克的方法,来绘制坦克
        switch (director){
            case 0://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+30,x+20,y);
​
                break;
            default:
                System.out.println("没有处理");
        }
    }
}
​

P574Java事件处理机制

1.MyPanle implements KeyListener (重写方法),在JFrame的方法里面this.addKeyListener(mp);

2.现在根据用户按下的键盘,来处理小球的移动(上下左右键盘)

3.为了让小球移动,把左上角的坐标位置设置变量x,y

4.利用箭值和x,y的增减来实现运动

//画出面板,可以画出小球
//KeyListener监听器可以监听键盘的事件
public class BallMove extends JFrame {
    MyPanle mp=null;
    public static void main(String[] args) {
        BallMove ballMove = new BallMove();
    }
    public BallMove(){
        mp=new MyPanle();
        this.add(mp);
        this.setSize(400,300);
        //窗口JFrame 对象可以监听键盘事件, 即可以监听到面板发生的键盘事件
        this.addKeyListener(mp);//因为mp已经继承
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}
class MyPanle 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) {
        //System.out.println((char)e.getKeyCode()+"被按下...");
        if(e.getKeyCode()==KeyEvent.VK_DOWN){
            y++;//KeyEvent.VK_DOWN 就是向下的箭头对应的code
        }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) {
​
    }
}

P5*处理机制

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

事情被监听KeyListener,然后事件KeyEvent e

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

P576让坦克移动

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

  1. direct(01,2,3)代表不同的方向

  2. 用按键表示不同的移动,

P567

public class Tank1 {
    private int x;
    private int y;
    private int direct;//坦克方向0,1,2,3
    private int speed=1;//速度
    //从上右下左边移动
    public void moveup(){//移动方向
        y-=speed;
    }
    public void moveRight(){
        x+=speed;
    }
    public void moveDown(){
        y+=speed;
    }
    public void moveLeft(){
        x-=speed;
    }
} 
public class MyPanel extends JPanel implements KeyListener {//绘图区
    //定义我的坦克
    MyHero myHero=null;
    public MyPanel(){
        myHero=new MyHero(100,100);//初始化自己的坦克
        myHero.setSpeed(8);
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形,默认黑色
        //画出坦克-封装方法
        drawTank(myHero.getX(), myHero.getY(), g,myHero.getDirect(),1);
    }
    //编写方法,画出坦克
    /***
     *
     * @param x 坦克的左上角的x坐标
     * @param y 坦克的左上角的y坐标
     * @param g 画笔
     * @param director 方法
     * @param type 坦克类型
     */
    public void drawTank(int x,int y,Graphics g,int director,int type){
        switch (type){
            case 0://我们的坦克
                g.setColor(Color.cyan);//青色
                break;
            case 1://敌人的坦克
                g.setColor(Color.yellow);//
                break;
        }
        //根据坦克的方向,来绘制不同方向的坦克
        switch (director){
            case 0://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+30,x+20,y);
                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+30,y+20,x+60,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+10,y+20,20,20);//圆
                g.drawLine(x+20,y+30,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+10,20,20);//圆
                g.drawLine(x+30,y+20,x,y+20);
                break;
            default:
                System.out.println("没有处理");
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }
    @Override
    public void keyPressed(KeyEvent e) {
        //
    }
    //处理wdsa键按下的情况
    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_W){
            //改变坦克的方向
            myHero.setDirect(0);
            myHero.moveup();
        }else if(e.getKeyCode()==KeyEvent.VK_D){//右移动
            myHero.setDirect(1);
            myHero.moveRight();
        }else if(e.getKeyCode()==KeyEvent.VK_S){//
            myHero.setDirect(2);
            myHero.moveDown();
        }else if(e.getKeyCode()==KeyEvent.VK_A){
            myHero.setDirect(3);
            myHero.moveLeft();
        }
        this.repaint();//让面板重绘
    }
}
public class TankeGame02 extends JFrame  {//框架
    //定义一个pannel
    MyPanel mp=null;
    public static void main(String[] args) {
        TankeGame02 tankeGame01 = new TankeGame02();
    }
    public TankeGame02(){
        mp=new MyPanel();
        this.add(mp);//把面板就是绘图区)
        this.addKeyListener(mp);//让JFrame 监听mp的键盘事件
        this.setSize(1000,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

总结 Tank1-Myhero(自己的坦克),绘图MyPanle(监视),框架Tankegame 继承JFrame(加入监视)

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

P578绘制敌人的坦克(集合)

增加的部分

public class EnemyTank extends Tank1{
    public EnemyTank(int x, int y) {
        super(x, y);
    }
}
public class MyPanel extends JPanel implements KeyListener {//绘图区
    //定义我的坦克
    MyHero myHero=null;
    //定义敌人坦克,放入到vector
    Vector<EnemyTank> enemyTanks=new Vector<>();
    int ennyTanksize=3;
    public MyPanel(){
        myHero=new MyHero(100,100);//初始化自己的坦克
        myHero.setSpeed(8);
        //初始化敌人坦克
        for (int i = 0; i <ennyTanksize ; i++) {
            EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0);
            enemyTank.setDirect(2);//为了让头向下
            enemyTanks.add(enemyTank);
        }
    }
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形,默认黑色
        //画出坦克-封装方法
        drawTank(myHero.getX(), myHero.getY(), g,myHero.getDirect(),1);
        //画出敌人的坦克
        for (int i = 0; i <enemyTanks.size() ; i++) {
            //取出坦克
            EnemyTank enemyTank=enemyTanks.get(i);
            drawTank(enemyTank.getX(),enemyTank.getY(),g,enemyTank.getDirect(),0);
        }
    }

P579程序进行线程

P568坦克大战P569java绘图坐标P571Java绘图技术P574Java事件处理机制P578绘制敌人的坦克(集合

上一篇:使用 Reactor 进行反应式编程进行数据分批批量处理


下一篇:20.有效的括号