Java飞机大战0_4

来源:互联网 发布:linux如何固定ip 编辑:程序博客网 时间:2024/03/29 09:39

一.实验代码

//Plane.javapackage sxau_rjxy;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;//敌机public class Plane {public Plane(int x, int y, int r) {super();this.x = x;this.y = y;this.r = r;int num = (int)(Math.random()*15+1);String str = "";if(num<10)str ="0"+num;elsestr=""+num;img = new ImageIcon("img/ep"+str+".png").getImage();}public void change(){int num = (int)(Math.random()*15+1);String str = "";if(num<10)str ="0"+num;elsestr=""+num;img = new ImageIcon("img/ep"+str+".png").getImage();}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getR() {return r;}public void setR(int r) {this.r = r;}private int x;private int y;private int r;private int speed;private Image img = null;public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}//自定义的paint()方法,名字随意public void paint(Graphics g) {// TODO Auto-generated method stubColor c = g.getColor();g.setColor(Color.black);//敌机黑色//g.fillOval(x-r, y-r, r*2,r*2);g.drawImage(img, x-r, y-r,null);g.setColor(c);}}

//Bullet.javapackage sxau_rjxy;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;public class Bullet {public Bullet(int x, int y, int r) {super();this.x = x;this.y = y;this.r = r;img = new ImageIcon("img/fire.png").getImage();}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getR() {return r;}public void setR(int r) {this.r = r;}private int x;private int y;private int r;private Image img;//自定义的paint()方法,名字随意public void paint(Graphics g) {// TODO Auto-generated method stubColor c = g.getColor();g.setColor(Color.white);//子弹白色//g.fillOval(x-20, y-r, r*2,r*2);g.drawImage(img, x-r, y-r, null);g.setColor(c);}}

//Hero.javapackage sxau_rjxy;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import javax.swing.ImageIcon;//我方飞机public class Hero {public Hero(int x, int y, int r) {super();this.x = x;this.y = y;this.r = r;//两个反斜杠"\\"或者一个斜杠"/"img = new ImageIcon("img/hero.png").getImage();//定义一个ImageIcon对象,引进图片,添加图片}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getR() {return r;}public void setR(int r) {this.r = r;}private int x;private int y;private int r;private int score;private int blood=100;private int allBlood=100;private Image img = null;public int getBlood() {return blood;}public void setBlood(int blood) {this.blood = blood;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}//自定义的paint()方法,名字随意public void paint(Graphics g) {// TODO Auto-generated method stubColor c = g.getColor();//画笔有一个自带的颜色,我们通过这句话可以保存原始,在做完自己的操作后可以设回初始.g.setColor(Color.blue);//我机蓝色//g.fillOval(x-r, y-r, r*2,r*2);g.drawImage(img, x-r, y-r,null);//g.drawRect(50, 50,480, 60);//空心的g.setColor(Color.orange);//满血时g.fillRect(50, 50, allBlood, 60);g.setColor(Color.red);//当前血量g.fillRect(50, 50, blood, 60);g.setColor(Color.BLUE);//如何分清的颜色?g.setFont(new Font("楷体", Font.BOLD, 60));//设置了分数的相关信息g.drawString("分数:"+ this.score,50,50);//分数的位置g.setColor(c);}}

//Start.javapackage sxau_rjxy;import java.awt.Button;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JFrame;import javax.swing.JPanel;public class Start {public static void main(String[]args){new Start().launch();}public void launch(){JFrame jf = new JFrame("Welcome you to play game!"); JPanel jp = new JPanel();jf.setBounds(400, 200,100,100);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Button b1= new Button("开始游戏");Button b2= new Button("结束游戏");MyMonitor mm= new MyMonitor();b1.addActionListener(mm);jp.add(b1);jp.add(b2);jf.add(jp);jf.setResizable(false);jf.setVisible(true);}class  MyMonitor implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubButton b= (Button)e.getSource();if("开始游戏".equals(b.getLabel())){//刚才由于我的launchGame传进了参数,所以在设置时需要传进null.new Mygame().launchGame();}b.getLabel();}}}

//Mygame.javapackage sxau_rjxy;import java.awt.Color;import java.awt.Dimension;import java.awt.Toolkit;import javax.swing.JFrame;public class Mygame {public  void launchGame() {// TODO Auto-generated method stubJFrame jf = new JFrame("飞机大战");//创建窗体    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();jf.setBounds(0, 0, dim.width, dim.height);//jf.setBackground(Color.red);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);MyJPanel panel= new MyJPanel(dim);//相当于管家jf.add(panel);/* * Thread t = new Thread(panel); * t.start();*/jf.setResizable(false);jf.setVisible(true);}}

//MyJPanel.javapackage sxau_rjxy;import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionAdapter;import java.awt.event.MouseMotionListener;import java.util.ArrayList;import java.util.Iterator;import javax.swing.ImageIcon;import javax.swing.JPanel;public class MyJPanel extends JPanel implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stub/*while(true){int y = p.getY();p.setY(y++);    repaint();   try {   Thread.sleep(100);   } catch (InterruptedException e){   // TODO Auto-generated catch block   e.printStackTrace();   }      }*/int y;int count =0;while(true){if(hero.getBlood()>0){//使子弹慢下来产生,改变被除的也可以改变间距if(count%10==0){Bullet bullet = new Bullet(hero.getX(),hero.getY()-hero.getR(),5);bullets.add(bullet);}count++;//让飞机动起来for(int i= 0;i<planes.size();i++){Plane p=planes.get(i);//y=p.getY()+1;y=p.getY()+p.getSpeed();//把1变成y.getSpeed()使得飞机速度真正改变p.setY(y);if(y>bgy){p.setY(0);//开始循环了,但运行出来是由于横坐标没变,显示一样p.setX((int)(Math.random()*(bgx-60)+30));//两个一起则图案显示不同,随机}if(isHit(p,hero)){//不移除,改变飞机的位置即可p.setY(0);p.setX((int)(Math.random()*(bgx-60)+30));hero.setBlood(hero.getBlood()-10);}}//让子弹动起来for(int i= 0;i<bullets.size();i++){Bullet b=bullets.get(i);y=b.getY()-10;//速度减慢,间距也可以被改变//使子弹不越界if(y<0){bullets.remove(i);}b.setY(y);for(int j=0;j<planes.size();j++){Plane p= planes.get(j);if(isHit(b,p)){bullets.remove(j);/*bullets.remove(int index); * bullets.remove(Object o); * 方法的最终结果是一样的,传进去的参数类型不同,但是内容是一样的 */p.setY(0);p.setX((int)(Math.random()*(bgx-60)+30));p.change();hero.setScore(hero.getScore()+10);//设置分数}}}//bullet.setY(bullet.getY()-1);//让子弹动起来,即坐标变化try {Thread.sleep(20);//如果没sleep,那么它屏幕上没圈了,因为太快} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}repaint();//没它之前,运行出的结果是静态的,因为没有重新画它}}//这是一个死循环,while(true)}//判断飞机和hero是否相撞private boolean isHit(Plane p, Hero hero) {// TODO Auto-generated method stubif((hero.getX()-p.getX())*(hero.getX()-p.getX())+(hero.getY()-p.getY())*(hero.getY()-p.getY())<=(hero.getR()+p.getR())*(hero.getR()+p.getR())){return true;}return false;}//判断子弹是否击中飞机private boolean isHit(Bullet b,Plane p) {// TODO Auto-generated method stubif((b.getX()-p.getX())*(b.getX()-p.getX())+(b.getY()-p.getY())*(b.getY()-p.getY())<=(b.getR()+p.getR())*(b.getR()+p.getR())){return true;}return false;}//Plane p = new Plane(200,200,50);//Plane[] planes = new Plane[10];ArrayList<Plane> planes = new ArrayList<Plane>();//保存飞机的引用,才能画它;定义了容器ArrayList<Bullet> bullets = new ArrayList<Bullet>();//Plane hero= new Plane(bgx, bgy, 30);//不对,不能共用敌机的类Hero hero;Bullet bullet;Image bgImg = new ImageIcon("img/bg"+(int)(Math.random()*5+1)+".jpg").getImage();@Override//重写的paint()方法,系统调用public void paint(Graphics g) {// TODO Auto-generated method stub//super.paint(g);//Color c = g.getColor();//g.setColor(Color.red);//g.fillOval(p.getX()-p.getR(), p.getY()-p.getR(), p.getR()^2,p.getR());//g.setColor(c);super.paint(g);//p.paint(g);/*画敌机 * for(int i =0;i<planes.size();i++){Plane p= planes.get(i);p.paint(g);}*/g.drawImage(bgImg, 0, 0, bgx, bgy, null);//画敌机Iterator<Plane> it = planes.iterator();while(it.hasNext()){Plane p = it.next();p.paint(g);}//画子弹for(int i =0;i<bullets.size();i++){Bullet b=bullets.get(i);b.paint(g);}//画herohero.paint(g);//bullet.paint(g);}private int bgx;private int bgy;public MyJPanel (Dimension dim){bgx =dim.width;bgy =dim.height;//this.setBackground(Color.lightGray);//创建飞机for(int i = 0;i<=10;i++){Plane p= new Plane((int)(Math.random()*(bgx-60)+30),(int)(Math.random()*(bgy-60)+30),30);p.setSpeed((int)(Math.random()*5+1));//使飞机的速度不一样planes.add(p);}hero= new Hero(bgx/2, bgy-60, 30);/* * Hero hero = new Hero(bgx/2, bgy-60, 30); * 因为前面已经定义过Hero hero ; * 所以运行出错,空白一片;*/bullet = new Bullet(hero.getX(),hero.getY()-hero.getR(),5);this.addMouseMotionListener(new MyMonitor());this.addKeyListener(new MyMonitor2());this.setFocusable(true);//必须要这,监听键盘时必须加,不然没反应new Thread(this).start();//线程启动第二种方法}//内部类private class MyMonitor extends MouseMotionAdapter{@Overridepublic void mouseDragged(MouseEvent e) {// TODO Auto-generated method stub//super.mouseDragged(e);if(hero.getBlood()>0){hero.setX(e.getX());hero.setY(e.getY());}}}private class MyMonitor2 extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubsuper.keyPressed(e);//System.out.println("ss");//用来测试键盘事件是否响应了int code = e.getKeyCode();if(code==KeyEvent.VK_LEFT){hero.setX(hero.getX()-10);}if(code==KeyEvent.VK_RIGHT){hero.setX(hero.getX()+10);}if(code==KeyEvent.VK_UP){hero.setY(hero.getY()-10);}if(code==KeyEvent.VK_DOWN){hero.setY(hero.getY()+10);}}}}

二.实验截图


三.实验心得

1.设置断点,,双击数字,Debug As运行

 

2.插入图片的方法:private Imageimg =null;

img = new ImageIcon("img/hero.png").getImage();//定义一个ImageIcon对象,引进图片,添加图片

 

3.java中的路径:两个反斜杠"\\"或者一个斜杠"/"

 

4.刚才由于我的launchGame传进了参数,所以在设置时需要传进null.无参数则为new Mygame().launchGame();

 

5.在插入图片时需要注意顺序问题,不然可能会出现覆盖现象


原创粉丝点击