实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.tarena.fly; import java.awt.Font; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; /***主程序**/ public class ShootGame extends JPanel{//窗口类JPanel,软件自带 public static final int WIDTH=525;//常量用大写//窗口的宽 public static final int HEIGHT=600;//窗口的高 /** 游戏的当前状态: START RUNNING PAUSE GAME_OVER */ private int state; private static final int START = 0; private static final int RUNNING = 1; private static final int PAUSE = 2; private static final int GAME_OVER = 3; public static BufferedImage background;//背景图 public static BufferedImage start;//启动图 public static BufferedImage pause;//暂停图 public static BufferedImage gameover;//敌机图 public static BufferedImage bigAirplane;//敌机图 public static BufferedImage airplane;//小蜜蜂图 public static BufferedImage bee;//子弹图 public static BufferedImage hero0;//英雄机 public static BufferedImage hero1;//英雄机 public static BufferedImage bullet; private Hero hero=new Hero();//英雄机对象 private BigAirplane b =new BigAirplane(); private FlyingObject[] flyings={};//敌人 private Bullet[] bullets={};//子弹数组 private Bullet1[] bullets1={};//子弹数组 static{//初始化静态资源 图片 try{ background=ImageIO.read(ShootGame.class.getResource("background.png")); bigAirplane=ImageIO.read(ShootGame.class.getResource("bigAirplane.png")); start=ImageIO.read(ShootGame.class.getResource("start.png")); pause=ImageIO.read(ShootGame.class.getResource("pause.png")); gameover=ImageIO.read(ShootGame.class.getResource("gameover.png")); airplane=ImageIO.read(ShootGame.class.getResource("airplane.png")); bee=ImageIO.read(ShootGame.class.getResource("bee.png")); hero0=ImageIO.read(ShootGame.class.getResource("hero1.png")); hero1=ImageIO.read(ShootGame.class.getResource("hero0.png")); bullet=ImageIO.read(ShootGame.class.getResource("bullet.png")); }catch(Exception e){ e.printStackTrace(); } } private Timer timer;//定时器 private int intervel=10;//定时器的时间间隔(以毫秒为单位) /****随机生成敌人(敌机 小蜜蜂)***/ public static FlyingObject nextOne(){ Random rand=new Random(); int type=rand.nextInt(20); if(type==0){ return new Bee();//随机为0时返回蜜蜂 } if(type==1){ return new BigAirplane(); } else{ return new Airplane();//随机为1――――19时返回敌机 } } /***敌人入场**/ int fkyEnteredUbdex=0;//敌人入场的计数 public void enterAction(){//10毫秒走一次 fkyEnteredUbdex ;//10毫秒增1 if(fkyEnteredUbdex%40==0){//没400毫秒走一次(10*40) FlyingObject one=nextOne();//获取敌人随机对象 flyings=Arrays.copyOf(flyings,flyings.length 1);//扩容 flyings[flyings.length-1]=one;//存到最后一个元素 } } public void stepAction(){//10毫秒走一次 hero.step(); for(int i=0;i<flyings.length;i ){ flyings[i].step(); } for(int i=0;i<bullets.length;i ){ bullets[i].step(); } for(int i=0;i<bullets1.length;i ){ bullets1[i].step(); } } /** 画游戏状态 */ public void paintState(Graphics g) { switch (state) { case START: // 启动状态 g.drawImage(start, 60, 0, null); break; case PAUSE: // 暂停状态 g.drawImage(pause, 60, 0, null); break; case GAME_OVER: // 游戏终止状态 g.drawImage(gameover, 60, 0, null); break; } } int shootIndex=0; public void shootAction(){//10毫秒走一次 shootIndex ; if(shootIndex%20==0){//每300(10*30)毫秒走一次 Bullet[] bs=hero.shoot();//获取英雄机发射的子弹 bullets =Arrays.copyOf(bullets,bullets.length bs.length); System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); } if(shootIndex%30==0){//每300(10*30)毫秒走一次 for(int i=0;i<flyings.length;i ){ Bullet1[] bs1=flyings[i].shoot1(); bullets1 =Arrays.copyOf(bullets1,bullets1.length bs1.length); System.arraycopy(bs1,0,bullets1,bullets1.length-bs1.length,bs1.length); } } } /***一个子弹与所有敌人撞****/ public void bangAction(){ for(int i=0;i<bullets.length;i ){ bang(bullets[i]);//一个子弹与所有敌人撞 } } /** 画分数 */ public void paintScore(Graphics g) { int x = 10; // x坐标 int y = 25; // y坐标 Font font = new Font(Font.SANS_SERIF, Font.BOLD, 22); // 字体 g.setColor(new Color(0xFF0000)); g.setFont(font); // 设置字体 g.drawString("SCORE:" score, x, y); // 画分数 y = 20; // y坐标增20 g.drawString("LIFE:" hero.getLife(), x, y); // 画命 } /** 检查游戏结束 */ public void checkGameOverAction() { if (isGameOver()) { state = GAME_OVER; // 改变状态 } } /** 检查游戏是否结束 */ public 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); // 删除碰上的飞行物 } } return hero.getLife() <= 0; } private int score=0;//声明 /** 子弹和飞行物之间的碰撞检查 */ public 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; // 记录被击中的飞行物的索引 break; } } 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(); // 加分 } else 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; } } } } /** 删除越界飞行物及子弹 */ public void outOfBoundsAction() { int index = 0; // 索引 FlyingObject[] flyingLives = new FlyingObject[flyings.length]; // 活着的飞行物 for (int i = 0; i < flyings.length; i ) { FlyingObject f = flyings[i]; if (!f.outOfBounds()) { flyingLives[index ] = f; // 不越界的留着 } } flyings = Arrays.copyOf(flyingLives, index); // 将不越界的飞行物都留着 index = 0; // 索引重置为0 Bullet[] bulletLives = new Bullet[bullets.length]; for (int i = 0; i < bullets.length; i ) { Bullet b = bullets[i]; if (!b.outOfBounds()) { bulletLives[index ] = b; } } bullets = Arrays.copyOf(bulletLives, index); // 将不越界的子弹留着 } /***启动执行***/ public void action(){ MouseAdapter l = new MouseAdapter(){ public void mouseMoved(MouseEvent e){// 鼠标移动 int x=e.getX(); int y=e.getY(); hero.moveTo(x,y); } public void mouseEntered(MouseEvent e) { // 鼠标进入 if (state == PAUSE) { // 暂停状态下运行 state = RUNNING; } } @Override public void mouseExited(MouseEvent e) { // 鼠标退出 if (state == RUNNING) { // 游戏未结束,则设置其为暂停 state = PAUSE; } } @Override public void mouseClicked(MouseEvent 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; } } }; this.addMouseListener(l);//处理鼠标操作事件 this.addMouseMotionListener(l);//处理鼠标滑动事件 timer=new Timer();//创建定时器的对象 timer.schedule(new TimerTask(){ public void run(){//定时干的事,10毫秒走一次 if(state==RUNNING){ enterAction();//敌人(敌机 小蜜蜂)10毫米走一次 stepAction();//移动步数 shootAction();//子弹入场(英雄机发射子弹) bangAction();//子弹与敌人碰撞 isGameOver();//英雄机碰撞判断 checkGameOverAction(); //检查游戏结束 outOfBoundsAction();//删除越界飞行物及子弹 } repaint();//重绘(调用paint方法) } },intervel,intervel);//时间间隔 } public void paint(Graphics g){ g.drawImage(background,0,0,null);//背景图与窗口重合 paintHero(g);//画英雄机对象 paintFlyingobjects(g);//画敌人 paintBullets(g);//画小蜜蜂 paintBullets1(g);//画小蜜蜂 paintScore(g);//画分和画命 paintState(g); // 画游戏状态 } public void paintHero(Graphics g){ g.drawImage(hero.image,hero.x,hero.y,null); } public void paintFlyingobjects(Graphics g){ for(int i=0;i<flyings.length;i ){ FlyingObject f=flyings[i]; g.drawImage(f.image,f.x,f.y,null); } } public void paintBullets(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 paintBullets1(Graphics g){ for(int i=0;i<bullets1.length;i ){ Bullet1 b=bullets1[i]; g.drawImage(b.image,b.x,b.y,null); } } public static void main(String[] args) { JFrame frame=new JFrame("FLY");//窗口对象 ShootGame game=new ShootGame();//面板 frame.add(game);//将面板添加到窗口之中 frame.setSize(WIDTH,HEIGHT);//设置窗口大小 frame.setAlwaysOnTop(true);//设置窗口一直在前面,居上 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认关闭操作――――关闭窗口时的操作 frame.setLocationRelativeTo(null);//设置相对位置为null,即居中 frame.setVisible(true);//1.设置窗口可见 2.尽快调用paint()方法 game.action();//启动执行 } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论