Java飞机大战0_4

一.实验代码

//Plane.java
package 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;
		else
			str=""+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;
		else
			str=""+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 stub
		Color 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.java
package 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 stub
		Color 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.java
package 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 stub
			Color 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.java
package 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{

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			Button b= (Button)e.getSource();
			if("开始游戏".equals(b.getLabel())){
				//刚才由于我的launchGame传进了参数,所以在设置时需要传进null.
				new Mygame().launchGame();			}
			b.getLabel();
		}
	}
}

//Mygame.java
package 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 stub
		JFrame 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.java
package 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{
	
	@Override
	public 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 block
				e.printStackTrace();
			}
			repaint();//没它之前,运行出的结果是静态的,因为没有重新画它
			}
		}//这是一个死循环,while(true)
		
	}
	
	//判断飞机和hero是否相撞
	private boolean isHit(Plane p, Hero hero) {
		// TODO Auto-generated method stub
		if((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 stub
		if((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);
			}
		
		//画hero
		hero.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{

		@Override
		public 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{

		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			super.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.在插入图片时需要注意顺序问题,不然可能会出现覆盖现象


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值