游戏简介
还记得风靡一时的飞机大战游戏么,不如现在用Java上手写一个玩 :D
操作简易,鼠标控制英雄机的移动。
击毁不同种类的飞行物会得到相应分数,击落蜜蜂可能加命或者由单发子弹变为双发。
运行页面如图(单击页面开始游戏)
游戏素材:戳这里
游戏结构
World主类:包含游戏框架并在main方法中实现各种功能。
FlyingObject类:所有飞行物都继承于此类。
HeroPlane类:设计英雄机的属性和方法。
BigAirplane、SmallAirplane类:敌机的属性和方法。
Bee类:蜜蜂的属性和方法。
Sky类:游戏背景的移动。
Bullet类:子弹的属性和方法。
游戏源码
World类
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class World extends JPanel{
public static final int WIDTH = 400;
public static final int HEIGHT = 700;
private Sky sky = new Sky();
private HeroPlane hero = new HeroPlane();
private FlyingObject[] enemies = {};
private Bullet[] bullets = {};
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 int state = START;
//状态页面图片初始化
private static BufferedImage start;
private static BufferedImage pause;
private static BufferedImage gameover;
static{
start = FlyingObject.loadImage("start.png");
pause = FlyingObject.loadImage("pause.png");
gameover = FlyingObject.loadImage("gameover.png");
}
//创建随机敌人对象
public FlyingObject nextOne(){
Random rand = new Random();
int type = rand.nextInt(20);
if(type<4){
return new Bee(60,50);
}else if(type<15){
return new SmallAirplane(49,36);
}else{
return new BigAirplane(66,99);
}
}
//限定敌人入场间隔时间
int enterIndex = 0;
int shootIndex2 = 0;
public void enterAction(){
enterIndex++;
if(enterIndex%40==0){
FlyingObject obj = nextOne();
enemies = Arrays.copyOf(enemies, enemies.length+1);
enemies[enemies.length-1] = obj;
}
}
//实现飞行物走步
public void stepAction(){
sky.step();
for(int i=0;i<enemies.length;i++){
enemies[i].step();
}
for(int i=0;i<bullets.length;i++){
bullets[i].step();
}
}
//实现子弹入场
int shootIndex = 0;
public void shootAction(){
shootIndex++;
if(shootIndex%30==0){
Bullet[] bs = hero.shoot();
bullets = Arrays.copyOf(bullets,bullets.length+bs.length);
System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);
}
}
//删除越界对象
public void outOfBoundsAction(){
int index = 0;
FlyingObject[] enemyLives = new FlyingObject[enemies.length];
for(int i=0;i<enemies.length;i++){
FlyingObject e = enemies[i];
if(!e.outOfBounds()&&!e.isRemove()){
enemyLives[index++] = e;
}
}
enemies = Arrays.copyOf(enemyLives, index);
index = 0;
Bullet[] bulletLives = new Bullet[bullets.length];
for(int i=0;i<bullets.length;i++){
Bullet b = bullets[i];
if(!b.outOfBounds()&&!b.isRemove()){
bulletLives[index++] = b;
}
}
bullets = Arrays.copyOf(bulletLives, index);
}
//根据击中的敌人类型判断奖励类型
int score = 0;
public void bangAction(){
for(int i=0;i<bullets.length;i++){
Bullet b = bullets[i];