项目链接
项目截图
常量类
可以将程序中一些用到的常量,如窗口大小,单独写在一个类中(constant),再用到的时候可以直接调用,方便修改。
package flyGame;
public class constant {
public static final int ShellNum = 25;
public static final int planeX = 150,planeY = 560;
public static final int planeWidth = 100,planeHeight = 124;
public static final int winWidth = 400,winHeight = 700;
}
关于画笔
Frame类中的paint函数自动调用,函数自带一个画笔,画笔可以画圆,矩形,字符串,图片等,在改变画笔颜色时,要记得先将画笔原先的颜色保存下来,用完后再改回去,同理,画笔的字体等属性也是。
双缓冲技术解决窗口闪烁
再Frame窗口绘制图形的时候,窗口会有很严重的闪烁,其原因是,程序再绘制图形的时候,先将图形加载到图形缓冲区,图形缓冲区再绘制到窗口上,因为是缓冲区是加载一个便绘制一个,所以窗口上的图形并不是同时绘制的,因此会看到窗口白色的背景,由此导致闪烁。
双缓冲技术是再图像缓冲区之外,再添加一个缓冲区,程序先将图像加载到这个缓冲区中,等同一时刻窗口中的全部图像加载完成后,再复制到图形缓冲区,最后绘制到窗口上,因次,用双缓冲技术,不会出现闪烁问题,即使性能很差,也只会出现图像卡顿。
/*
* 双缓冲技术解决窗口闪烁
*/
private Image offScreenImage = null;
public void update(Graphics g) {
if(offScreenImage == null)
offScreenImage = this.createImage(constant.winWidth,constant.winHeight);//游戏窗口宽度和高度
Graphics goff = offScreenImage.getGraphics();
paint(goff);
g.drawImage(offScreenImage, 0, 0, null);
}
矩形碰撞检测
矩形类里面有矩形碰撞检测的函数(当初第一次写游戏的时候自己动手写的,要累死)。
在GameObject类(游戏物体类,飞机类,炮弹类继承它)中添加返回物体矩形的函数,方便用来检测物体间是否发生碰撞。
public boolean intersects(Rectangle r) {
int tw = this.width;
int th = this.height;
int rw = r.width;
int rh = r.height;
if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
return false;
}
int tx = this.x;
int ty = this.y;
int rx = r.x;
int ry = r.y;
rw += rx;
rh += ry;
tw += tx;
th += ty;
// overflow || intersect
return ((rw < rx || rw > tx) &&
(rh < ry || rh > ty) &&
(tw < tx || tw > rx) &&
(th < ty || th > ry));
}
图片轮播
飞机死亡时爆炸效果是用16中图片轮播做的,当判定飞机爆炸时,调用爆炸类的draw函数即可实现。
int count;
public void draw(Graphics g) {
if(count <= 15) {
g.drawImage(imgs[count], (int)x, (int)y, null);
count++;
}
}
项目的构建
java老师一直强调java是面向对象的,所以如何将项目中的对象抽象出来是一个很重要的问题,例如在飞机大战项目中,所有类的父类GameObject类,以及子类plane,shell,还有工具类GameUtil,constant.
这个是要在项目中不断的练习的,只有在不断的练习中,才能体会出项目如何构建是合适的。