全民飞机大战Java(搬)

第一步,首先创建一个窗体
 
package ui; import javax.swing.JFrame; /** * 自定义窗体类的步骤: * 1.写一个类,继承JFrame,在类名后面加extends JFrame * 2.写一个构造方法,初始化窗体的属性 * */ //定义一个GameFrame类,窗体类:JFrame public class GameFrame extends JFrame{ /** * 构造方法:创建对象 */ public GameFrame(){ //设置标题 setTitle("你好今天"); //设置大小setSize(宽度,高度) setSize(460,670); //设置位置居中显示 setLocationRelativeTo(null); //设置默认的关闭选项 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } /** * * @param Java程序入口:main 方法,没有它,进入不到程序中 * 格式固定 */ public static void main(String[] args){ //创建窗体对象: //格式:类名 对象名=new 类名() GameFrame frame=new GameFrame(); //创建面板对象 GamePanel panel=new GamePanel(frame); //调用开始游戏的方法 panel.action(); //panel.shootaction(); //将面板加入窗体中 frame.add(panel); //显示窗体:true显示窗体 false隐藏窗体 frame.setVisible(true); } }

第二步创建面板

 

package ui; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; /** * Java中的面板:JPanel * * * @author Administrator * */ public class GamePanel extends JPanel { // 定义背景图片 BufferedImage bg; // BufferedImage zj; // BufferedImage zd; // BufferedImage dj; BufferedImage dj1; BufferedImage xl; BufferedImage dd; // 定义英雄机 Hero hero = new Hero(); // 定义敌机 2 在paint 方法中用g.drawImage()画出敌机 Enemy enemy = new Enemy(); // 定义子弹 // Bullet bullet=new Bullet(); // 定义子弹集合 List<Bullet> eb = new ArrayList<Bullet>(); // 定义敌机集合 List<Enemy> es = new ArrayList<Enemy>(); // 定义分数 int score = 0; // 定义血量 int blood = 4; // 定义游戏标记 boolean gameover = false; // 开始游戏的方法 public void action() { /* * 1创建一个线程,并启动 2 在线程中重复生成敌机 */ new Thread() { // 需要做什么事就写在run 里面 public void run() { // 死循环,一直重复出现敌机 while (true) { if(!gameover){ // 敌机入场的方法 enemyEnter(); // 打飞机 bangAction(); hitAction(); for (int i = 0; i < es.size(); i++) { Enemy enemy = es.get(i); enemy.move(); if (enemy.y > 768) { es.remove(i);// 删除敌机 } } // 子弹入场方法 bulletEnter(); for (int i = 0; i < eb.size(); i++) { Bullet bullet = eb.get(i); bullet.move(); if (bullet.y < bullet.h) { // 如果子弹移动到屏幕外面去了 eb.remove(i); } } try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 刷新界面 repaint(); } } } }.start(); } protected void hitAction() { // TODO Auto-generated method stub // 遍历所有敌机 for (int i = 0; i < es.size(); i++) { // 找到每一个敌机 Enemy e = es.get(i); // 如果敌机被英雄机撞上 if (e.hitBy(hero)) { es.remove(i);// 删除敌机 // 减少血量 blood--; // 如果血量小于等于0 if (blood <= 0) { // 结束游戏 gameover = true; } } } } protected void bangAction() { // 遍历所有的子弹 for (int i = 0; i < eb.size(); i++) { // TODO Auto-generated method stub Bullet b = eb.get(i);// 找到每一颗子弹 bang(b);// 尝试让这颗子弹去打飞机 } } private void bang(Bullet b) { // TODO Auto-generated method stub // 遍历所有的敌机 for (int i = 0; i < es.size(); i++) { // 找到每一个敌机 Enemy e = es.get(i); // 如果敌机被子弹击中 if (e.shootBy(b)) { e.blood--; if(e.blood<=0){ es.remove(e);// 删除敌机 // 分数增加 score += 10; } } } } // 计数器 int index = 0; // 敌机入场方法 protected void enemyEnter() { // TODO Auto-generated method stub index++; System.out.println(index); // %后面的数越小,飞机出现的频率越快 if(!gameover){ if ( index % 30==0) { // 创建敌机对象 将敌机对象加入集合中 Enemy enemy = new Enemy(); es.add(enemy); } } } int bindex = 0; protected void bulletEnter() { // TODO Auto-generated method stub bindex++; if ( bindex % 10==0) { // 创建一颗子弹 Bullet bullet = new Bullet(hero); // 将子弹加入到集合中 eb.add(bullet); } } public GamePanel(GameFrame frame) { // 加载背景图片 bg = App.getImg("/img/bg2.jpg"); // zj=App.getImg("/img/hero.png"); // zd=App.getImg("/img/fire.png"); // dj=App.getImg("/img/ep01.png"); dj1 = App.getImg("/img/ep02.png"); xl = App.getImg("/img/score.png"); dd = App.getImg("/img/ep15.png"); // 设置背景(颜色大小写都可以,大写常量,小写变量) // setBackground(Color.black); // 创建键盘适配器 /* * KeyAdapter key=new KeyAdapter() * { * public void keyPressed(KeyEvent e){ * //获取按键 * * char c=e.getKeyChar(); * if(c=='w'){ hero.moveDown(); * }else if(c=='a'){ * hero.moveLeft(); * }else if(c=='s') * { hero.moveUp(); * }else if(c=='d'){ * * hero.moveRight(); } * repaint(); * // System.out.println(c); } * * }; * * addKeyListener(key); * * frame.addKeyListener(key); */ // 创建鼠标适配器 固定的 MouseAdapter adapter = new MouseAdapter() { @Override // 点击鼠标 public void mouseClicked(MouseEvent e) { if (gameover) { gameover = false;// 重置开关 score = 0;// 分数清零 blood = 4;// 血量恢复 eb.clear();// 清空子弹集合 es.clear();// 清空敌机集合 hero = new Hero(); // 重新生成英雄机 repaint(); } } public void mouseMoved(MouseEvent e) { if(!gameover){ // 当鼠标移动时会执行此方法 // 获取鼠标的坐标 int mx = e.getX(); int my = e.getY(); // System.out.println(mx+","+my); // 让英雄机移动到鼠标的位置 hero.moveTo(mx, my); // 重新调用paint方法,重绘界面(刷新界面) repaint(); } } }; // 添加鼠标监听器 addMouseListener(adapter); addMouseMotionListener(adapter); } /** * 画图的方法 Graphics g 手中的画笔 */ @Override // 虚拟机自动调用paint方法 public void paint(Graphics g) { super.paint(g); g.drawImage(bg, 0, 0, 512, 768, null); g.setColor(Color.red); g.drawString("分数:" + score, 210, 30); g.drawImage(xl, 400, 1, 50, 60, null); g.drawImage(dd, 180, 160, 10, 20, null); // 血量yingxiongji for (int i = 0; i < blood; i++) { g.drawImage(hero.img, 10 + (i * 35), 10, 30, 30, null); } // 画英雄机 g.drawImage(hero.img, hero.x, hero.y, hero.w, hero.h, null); // 遍历敌机集合,找到所有敌机 for (int i = 0; i < es.size(); i++) { // 获取每一个敌机 Enemy enemy = es.get(i); g.drawImage(enemy.img, enemy.x, enemy.y, enemy.h, enemy.w, null); } // 遍历子弹集合 for (int i = 0; i < eb.size(); i++) { Bullet bullet = eb.get(i);// 获取每一颗子弹 // 画子弹 g.drawImage(bullet.img, bullet.x, bullet.y, bullet.h, bullet.w, null); } Font f1 = new Font("隶书", Font.BOLD, 50); // 设置画笔的字体 g.setFont(f1); if (gameover) { g.drawString("Gameover!", 100, 300); } } } 


第三步,添加游戏的工具类

 

 
package ui; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; /** * 游戏的工具类 * @author Administrator * */ public class App { /** * 根据指定路径去读取读片 * @param path 图片的路径 * @return */ public static BufferedImage getImg(String path){ //加载图片 try{ BufferedImage img= ImageIO.read(App.class.getResource(path)); //如果根据地址找到了,就返回 return img; }catch(IOException e){ //如果找不到,下面这行代码会告诉为什么找不到 e.printStackTrace(); } return null; } } 


第四步,添加英雄机
package ui;

import java.awt.image.BufferedImage;

/**
 * 英雄机
 * @author Administrator
 *
 */
public class Hero {
	//英雄机的图片
	BufferedImage img;
	int x;//英雄机横坐标
	int y;//英雄机纵坐标
	int w;//英雄机的宽度
	int h;//英雄机的高度
   	public Hero(){
   		//加载英雄机图片
   		img=App.getImg("/img/hero.png");
   		//获取图片的高度和高度
   		w=img.getWidth();
   		h=img.getHeight();
      //设置英雄机的初始位置
   		x=0;
   		
   			
   		y=550;
   		
   	}
   	
   	//让英雄机跟着鼠标移动的方法,mx 鼠标的横坐标  my 鼠标的纵坐标
     public void moveTo(int mx, int my) {
    	 
		x=mx-w/2;
		y=my-h/2;
		
	}  
 
/*	public void moveUp() {
		 y+=5;
		
	}

	public void moveLeft() {
		
		  x-=5;
	}
  public void moveRight(){
	     x+=5;
 }	
	
public void moveDown(){
        y-=5;
	 }
	*/

}

第五步,添加敌机

 
 
package ui; import java.awt.image.BufferedImage; import java.util.Random; /** * 敌方飞机 * @author Administrator * */ public class Enemy { BufferedImage img; //敌机图片 int x;//敌机横坐标 int y;//敌机纵坐标 int h;//敌机宽度 int w;//敌机宽度 int sp;//敌机的速度 int blood; public Enemy(){ Random rd=new Random();//随机生成数 Random zd=new Random(); sp =zd.nextInt(20)+1; int index =rd.nextInt(15)+1; //随机生成敌机血量 blood=index; String id=index<10?"0":""; //加载英雄机图片 img=App.getImg("/img/ep"+id+index+".png");//用到字符串链接符+ w=img.getWidth(); //初始化敌机宽度 可以自定义宽度 w=100; h=img.getHeight(); //初始化敌机高度 自定义高度h=100; x=rd.nextInt(512-w); //随机设置敌机位置 //设置敌机初始位置 y=0; } public void move() { y+=sp; //敌机的速度 } public boolean shootBy(Bullet b) { // TODO Auto-generated method stub int bx=b.x; int by=b.y; int bw=b.w; int bh=b.h; boolean hit=(x<=bx+bw)&&(x>=bx-w)&&(y<=by+bh)&&(y>=by-h); return hit; } public boolean hitBy(Hero hero) { // TODO Auto-generated method stub int bx=hero.x; int by=hero.y; int bw=hero.w; int bh=hero.h; boolean hit=(x<=bx+bw)&&(x>=bx-w)&&(y<=by+bh)&&(y>=by-h); return hit; } //public static void main(String[] args){ //中的随机数 //1 Math.random 会在0和1之间随机生成一个小数 //for(int i=0;i<100;i++){ //Math.random()*100小数点向右移动两位 //(int)((Math.random)*100)取整数 // System.out.println((int)(Math.random()*100)); //nextInt(num) 在[0,nun)之间随机生成整数 // } // } } 


第六步,添加子弹

 

package ui; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.Random; /** * 子弹 * @author Administrator * */ public class Bullet { BufferedImage img; int x; int y; int h; int w; Random zd=new Random(); // int s =zd.nextInt(50)+1; int d=zd.nextInt(500)+1; public Bullet(Hero hero){ img=App.getImg("/img/fire.png"); h=20; w=50; //让英雄机发射子弹,坐标相等 x=hero.x+49; y=hero.y; } public void move() { y-=5; } } 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值