实例介绍
【实例简介】
【实例截图】
【核心代码】
package cn.ucai.war; import java.applet.Applet; import java.applet.AudioClip; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import java.util.Iterator; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; //import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable; // JPanel 理解为画布 public class ShootGame extends JPanel { public static final int WIDTH = 400; // 宽 public static final int HEIGHT = 654; // 高 public static BufferedImage background; //生成的图片在内存里有一个图像缓冲区 public static BufferedImage start; public static BufferedImage gameover; public static BufferedImage airplane; public static BufferedImage pause; public static BufferedImage bee; public static BufferedImage bullet; public static BufferedImage hero0; public static BufferedImage hero1; public Hero hero = new Hero();//声明主机对象 public Bullet[] bullets = {};//子弹对象的数组 public FlyingObject[] flyings = {}; //敌机和小蜜蜂 // 静态代码块,在类加载的时候就执行,只执行一次 static{ //加载图片资源 try { background = ImageIO.read(ShootGame.class.getResource("background.png")); start = ImageIO.read(ShootGame.class.getResource("start.png")); gameover = ImageIO.read(ShootGame.class.getResource("gameover.png")); airplane = ImageIO.read(ShootGame.class.getResource("airplane.png")); pause = ImageIO.read(ShootGame.class.getResource("pause.png")); bee = ImageIO.read(ShootGame.class.getResource("bee.png")); bullet = ImageIO.read(ShootGame.class.getResource("bullet.png")); hero0 = ImageIO.read(ShootGame.class.getResource("hero0.png")); hero1 = ImageIO.read(ShootGame.class.getResource("hero1.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { JFrame frame = new JFrame("飞机大战"); //创建窗体并未窗体设置标题 ShootGame game = new ShootGame(); frame.add(game); frame.setSize(WIDTH, HEIGHT);//设置窗体的宽高 frame.setIconImage(new ImageIcon("D:\\Projects\\JavaProjects\\MyPlane\\src\\cn\\ucai\\war\\icon.jpg").getImage());//设置图标 frame.setLocationRelativeTo(null);//默认显示在屏幕的中间 // 点击关闭窗口,小红点消失,表示程序停止,避免资源的浪费 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); //将窗体显示出来 game.action(); // 里面放入音乐的绝对路径 playMusic("D:\\Projects\\JavaProjects\\MyPlane\\src\\cn\\ucai\\war\\BinaryRainMusic.wav"); } // 添加播放音乐的方法 static void playMusic(String strUrl){//背景音乐播放 try { // 引入音乐文件所在的路径 File file = new File(strUrl); URL url = file.toURL(); AudioClip aClip = Applet.newAudioClip(url); // aau.play();//播放一遍 aClip.loop();//循环播放 // 循环播放 aau.play() //单曲 aau.stop()停止播放 } catch (MalformedURLException e) { e.printStackTrace(); } } // 导入java util这个包 private Timer timer; //定时器 private int intervel = 10; //时间间隔(毫秒) private int state;//游戏状态 public static final int START = 0; public static final int RUNNING = 1; public static final int PAUSE = 2; public static final int GAME_OVER =3; // 创建方法,处理逻辑 private void action() { // 创建鼠标适配器对象,监听鼠标事件,并且重写鼠标点击、移动的方法 MouseAdapter mAdapter = new MouseAdapter() { //重写鼠标点击 @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub super.mouseClicked(e); switch (state) { case START: state = RUNNING; break; case GAME_OVER: //游戏结束,清理现场 flyings = new FlyingObject[0]; //清理敌机和小蜜蜂 bullets = new Bullet[0]; //清理子弹 hero = new Hero(); //主机显示出来 score = 0; state = START; //游戏的状态改为起始状态 break; default: break; } } //重写鼠标移动 @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub super.mouseMoved(e); if (state == RUNNING) { int x = e.getX(); int y = e.getY(); hero.moveTo(x, y); System.out.println(x); System.out.println(y); System.out.println(); } } }; this.addMouseListener(mAdapter); //添加鼠标点击事件的监听 this.addMouseMotionListener(mAdapter); //添加鼠标移动事件的监听 timer = new Timer(); // 给定时器设置进度 /* * 参数一:被定时器执行的任务 * 参数二:延时多少毫秒去执行run()里面的内容 * 参数三:定时器执行的周期 */ /* * 没有名字的内部类: * new 父类构造器(){ * 匿名内部类的类体部分 * } * 不能反复使用 * 消除坠余代码 */ timer.schedule(new TimerTask() { @Override public void run() { if (state == RUNNING) { enterAction(); //在定时器中,如果游戏处于运行, stepAction(); shootAction(); bangAction(); checkGameOverAction(); } repaint(); //重新绘制(提供的) } }, intervel,intervel); } //检查游戏是否结束 public void checkGameOverAction() { if (isGameOver()) { state = GAME_OVER; } } private boolean isGameOver() { for (int i = 0; i < flyings.length; i ) { int index =-1; FlyingObject obj = flyings[i]; if (hero.hit(obj)) { //检查主机是否碰撞 hero.subtractLife();//主机减生命 hero.setDoubleFire(0); //去掉双倍火力 index = i; } // 主机碰撞到敌机 if(index != -1){ //重设敌人对象数组 FlyingObject t = flyings[index]; flyings[index]= flyings[flyings.length-1]; flyings[flyings.length -1] = t; flyings = Arrays.copyOf(flyings, flyings.length-1); } } //当主机的生命 <0的时候,游戏结束 return hero.getLife()<0; } //验证碰撞 //子弹与敌人碰撞 protected void bangAction() { for (int i = 0; i < bullets.length; i ) { bang(bullets[i]); //创建此方法 } } //处理碰撞逻辑 private void bang(Bullet bullet) { int index = -1; //集中的飞行物的索引 for (int i = 0; i < flyings.length; i ) { FlyingObject obj =flyings[i]; //判断是否被子弹集中 if (obj.shootBy(bullet)) { index=i; } } //被击中 if (index!=-1) { FlyingObject one = flyings[index];//记录被击中飞行物 //将击中的飞行物与最后一个飞行物交换 FlyingObject temp = flyings[index]; flyings[index] = flyings[flyings.length -1]; flyings[flyings.length-1] =temp; //删除最后一个飞行物(被击中的),飞行物数组的长度减一 flyings = Arrays.copyOf(flyings, flyings.length-1); // 检查飞行物的类型(one) if (one instanceof Enemy) { //检查是否是敌机类型,如果是需要得分 Enemy e = (Enemy) one; score = e.getScore(); //消灭一个敌机 5 } if (one instanceof Award) { //检查是否是小蜜蜂 Award a = (Award) one; int type = a.getType(); //获取奖励的类型 switch (type) { case Award.DOUBLE_FIRE: hero.addDoubleFire(); //给主机获取到双倍火力 break; case Award.LIFE: hero.addLife(); //给主机添加一条生命 break; default: break; } } } } int shootIndex = 0; //射击计数 //子弹入场 protected void shootAction() { shootIndex ; // 没30毫秒发射一颗子弹 // 每20毫秒计时器调用一次 shootAction()方法,射击次数 1 if (shootIndex %10 ==0) { Bullet[] bs = hero.shoot(); //主机发射的子弹 //bs的长度 1 ,新增的子弹个数,每10毫秒新增一个 bullets = Arrays.copyOf(bullets, bullets.length bs.length); /* * 复制数组,返回数组原来的长度 * 参数一:源数组 * 参数二:源数组要复制的起始位置 * 参数三:目的数组 * 参数四:目的数组放置的起始位置 * 参数五:复制的长度 */ System.arraycopy(bs, 0, bullets, bullets.length-bs.length, bs.length); System.out.println("bs的长度" bs.length); System.out.println(bullets.length); } } // 飞行物动起来 public void stepAction() { //敌人走一步 for(int i =0;i<flyings.length;i ){ flyings[i].step(); } //子弹走一步 for(int i =0; i<bullets.length;i ){ bullets[i].step(); } //主机走步 hero.step(); } //实例化 一个入场倒计时变量 int flyEnteredIndex = 0; //飞行物入场的方法,进入画面 public void enterAction() { flyEnteredIndex ; //到40毫秒,生成一个敌人 if (flyEnteredIndex %40 == 0) { FlyingObject obj = nextOne(); /* * 参数一:被copy的数组 * 参数二:新数组的长度,因为要添加敌人对象,所以长度加1 */ flyings = Arrays.copyOf(flyings, flyings.length 1); flyings[flyings.length-1] = obj; //将敌人加入到flyings数组中 } } //生成飞行物对象 public static FlyingObject nextOne(){ Random random = new Random(); int type = random.nextInt(20); // 0 --19 if (type == 0 ) { return new Bee(); //5%的概率去生成小蜜蜂 }else{ return new Airplane(); //95% 的概率生成敌机 } } // 重写paint 方法 ,并且传入画笔参数(提供的) @Override public void paint(Graphics g ){ g.drawImage(background, 0, 0, null); //绘制背景 paintScore(g); paintHero(g); paintState(g); paintBullet(g); paintFlyingObject(g); } // 533835728 山东农大 优才实践课 private int score = 0;//声明变量得分 // 绘制得分和生命 public void paintScore(Graphics g){ // 得分的x , y坐标 int x = 10; int y = 25; Font font = new Font(Font.SANS_SERIF,Font.BOLD,14);//设置字体类型 g.setColor(Color.blue);//设置字体颜色 g.setFont(font);//将字体设置到画笔上 g.drawString("Score:" score, x, y); //在画笔上绘制 y = 20; //修改y的坐标 //绘制主机的生命数 g.drawString("Lift:" hero.getLife(), x, y); } //绘制主机 private void paintHero(Graphics g){ g.drawImage(hero.image, hero.x, hero.y, null); } // 绘制游戏状态 private void paintState(Graphics g){ switch (state) { //开始状态 case START: g.drawImage(start, 0, 0, null); break; //暂停状态 case PAUSE: g.drawImage(pause, 0, 0, null); //结束 case GAME_OVER: g.drawImage(gameover, 0, 0, null); default: break; } } //绘制子弹 public void paintBullet(Graphics g){ //循环获取每一个子弹对象 for(int i = 0; i< bullets.length; i ){ Bullet b = bullets[i]; //将子弹对象绘制出来 g.drawImage(b.image, b.x, b.y, null); } } //绘制敌人 public void paintFlyingObject(Graphics g){ for(int i = 0;i<flyings.length;i ){ g.drawImage(flyings[i].image, flyings[i].x, flyings[i].y, null); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论