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 总结
实践出真知