java基础 小游戏 飞机大战(下)

    科技2026-08-20  9

    文章目录

    14 爆炸类,图片数组轮播处理15 主窗口内画出爆炸类16 飞机死亡和计时17 总结

    14 爆炸类,图片数组轮播处理

    通过新建一个爆炸类,加载e1.gif到e16.gif的图片,当碰撞发生时再循环画出,就完成了游戏结束飞机爆炸的效果 新建一个爆炸类,通过GameUtil来加载图片,碰撞时轮播16张图片

    package cn.coisini.game; import java.awt.Graphics; import java.awt.Image; public class Explode { double x,y; //爆炸位置 static Image[] imgs = new Image[16]; //静态初始化块循环加载图片 static { for(int i=0; i<16; i++) { imgs[i] = GameUtil.getImage("images/explode/e" + (i+1) + ".gif"); imgs[i].getWidth(null); } } int count; //通过count来依序轮播16张图片 public void draw(Graphics g) { if(count <= 15) { g.drawImage(imgs[count], (int)x, (int)y, null); count++; } } public Explode(double x, double y) { this.x = x; this.y = y; } }

    15 主窗口内画出爆炸类

    完成爆炸类后,在主窗口内实现碰撞爆炸,先声明爆炸类,之后在碰撞检测中当碰撞时,在飞机碰撞的地方新建一个爆炸类,并调用爆炸类中的draw方法,轮播爆炸效果图

    /** * @author coisini1999 * @飞机游戏的主窗口 */ package cn.coisini.game; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.Frame; public class MyGameFrame extends Frame { Image bg = GameUtil.getImage("images/bg.jpg"); //加载图片对象,指定路径 Image planeImg = GameUtil.getImage("images/plane.png"); //加载图片对象,指定路径 Plane plane = new Plane(planeImg, 250 ,250); //创建飞机对象 Shell[] shells = new Shell[50]; //创建炮弹数组 Explode bao; //声明爆炸对象 public void paint(Graphics g) { //自动被调用,g 相当于一支笔 g.drawImage(bg, 0, 0, null); plane.drawSelf(g); //画飞机 //画50个炮弹 for(int i=0; i < shells.length; i++) { shells[i].draw(g); //每画出一个炮弹进行炮弹和飞机的矩形相交检测 boolean peng = shells[i].getRect().intersects(plane.getRect()); //碰撞后令飞机死亡 if(peng) { plane.live = false; //只在第一次碰撞时生成爆炸对象 if(bao == null) { bao = new Explode(plane.x, plane.y); } bao.draw(g); } } }

    在碰撞检测中 if(bao == null) 这个条件是必要的,如果没有该条件,那么会一直生成爆炸对象,draw的时候无法实现轮播

    16 飞机死亡和计时

    游戏时希望新增一个计时功能,可以清晰看到玩了多长时间,这个功能的核心有两点: 1,时间计算,即当前时间 - 游戏开始的时间 2,显示时间窗口

    在初始化窗口时,就保存一个起始时间,当飞机死亡时,保存一个结束时间

    创建起始时间,声明结束时间:

    public class MyGameFrame extends Frame { Image bg = GameUtil.getImage("images/bg.jpg"); //加载图片对象,指定路径 Image planeImg = GameUtil.getImage("images/plane.png"); //加载图片对象,指定路径 Plane plane = new Plane(planeImg, 250 ,250); //创建飞机对象 Shell[] shells = new Shell[50]; //创建炮弹数组 Explode bao; //声明爆炸对象 Date startTime = new Date(); //新建起始时刻 Date endTime; //声明结束时刻 int period; //游戏持续时间

    显示时间:

    public void paint(Graphics g) { //自动被调用,g 相当于一支笔 Color c =g.getColor(); g.drawImage(bg, 0, 0, null); plane.drawSelf(g); //画飞机 //画50个炮弹 for(int i=0; i < shells.length; i++) { shells[i].draw(g); //每画出一个炮弹进行炮弹和飞机的矩形相交检测 boolean peng = shells[i].getRect().intersects(plane.getRect()); //碰撞后令飞机死亡 if(peng) { plane.live = false; //只在第一次碰撞时生成爆炸对象 if(bao == null) { bao = new Explode(plane.x, plane.y); endTime = new Date(); //新建结束时间 period = (int)((endTime.getTime() - startTime.getTime())/1000); } bao.draw(g); } //计时功能,给出提示 if(!plane.live) { g.setColor(Color.red); Font f = new Font("宋体",Font.BOLD,50); g.setFont(f); g.drawString("时间:" + period + "秒", (int)plane.x, (int)plane.y); } } g.setColor(c); }

    17 总结

    实践出真知

    Processed: 0.008, SQL: 9