P568坦克大战
看到Java的画图想起了python的GUI,绘图学起来应该比较简单
P569java绘图坐标
P570绘图入门与原理
将图形最大然后最小真的会
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绘图技术
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)
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) { } }
P575事件处理机制
事情被监听KeyListener,然后事件KeyEvent e
P576让坦克移动
direct(01,2,3)代表不同的方向
用按键表示不同的移动,
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(加入监视)
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程序进行线程