飞机大战小游戏
1.功能描述
(1)游戏界面绘制:设置游戏的名称为“飞机大战小游戏”,游戏窗口的大小为512*768像素,在屏幕中居中显示;添加游戏背景,当重新开始一局游戏时,从上传的四个背景中随机显示一张,作为战斗场景。
(2)鼠标移动读取与判别:创建鼠标监听器,创建鼠标适配器,监听鼠标的移动的坐标,将鼠标的坐标赋值给英雄机,从而实现鼠标操作英雄机在画面中进行移动。
(3)子弹是否击中敌机判别:通过子弹的位置和敌机的位置来判断子弹击中了敌机,从而对敌机的血量进行减少,判断是否能够击杀敌机。
(4)英雄机是否碰撞敌机判别:与子弹和敌机的判别方式相同,通过两者的位置关系来判断是否碰撞,碰撞后英雄机生命值减一,子弹数初始为1,敌机消失。
(5)战斗机和导弹绘制:添加战斗机和导弹素材,随机的生成敌机和导弹,对于像素较大的大型敌机,使其移动速度减缓,对像素较小的敌机,使其移动速度增加,且可以变换方向,导弹速度慢且垂直下落,但不可击杀。
(6)得分显示:左上角绘制得分,每击杀一个敌机,增加10分,但是击杀三种敌机的难度不同,小型敌机移动速度快,不容易瞄准,大型敌机血量厚,不容易击杀,当击杀大型敌机后获得得分翻倍。
(7)生命值显示:右上角显示英雄机的生命值,以英雄机的图标数量来表示,当英雄机碰撞到敌机时生命值减一,碰撞到导弹时生命值减一,若无生命值后游戏结束,跳转到游戏结束界面。
2.系统流程图和部分代码
public GamePanel(){
bg = App.getImg("/img/bg4.png");
//使用鼠标监听器
// 1.创建鼠标适配器
MouseAdapter adapter = new MouseAdapter() {
//2.确定需要监听的鼠标的事件
// 鼠标的事件
// (1)mouseMoved() 监听鼠标移动
// (2)mouseCliked() 监听鼠标单击事件
// (3)mousePressed() 监听鼠标按下去事件
// (4)mouseEntered() 监听鼠标移入游戏界面事件
// (5)mouseExited() 监听鼠标移出游戏界面事件
// MouseEvent 鼠标的事件,记录鼠标做的事情
@Override
public void mouseClicked(MouseEvent e) {
if(gameover){
hero = new Hero();
action();
gameover=false;
score=0;
//清空敌机集合
eps.clear();
//清空子弹集合
fs.clear();
Random rd = new Random();
int index = (rd.nextInt(4)+1);
bg = App.getImg("/img/bg"+index+".png");
repaint();
}
}
@Override
public void mouseMoved(MouseEvent e) {
//让英雄机的横纵坐标等于鼠标的横纵坐标
int mx = e.getX();
int my = e.getY();
if(!gameover){
hero.moveToMouse(mx, my);
}
//刷新界面重写绘制
repaint();
}
};
//3.将适配器加入到监听器中
addMouseListener(adapter);
addMouseMotionListener(adapter);
}
//检测子弹是否击中敌机
protected void shootEp() {
for(int i=0;i<fs.size();i++){
Fire f = fs.get(i);
//每拿一颗子弹,判断子弹是否击中敌机
bang(f);
}
}
//判断子弹是否击中敌机
private void bang(Fire f) {
for(int i=0;i<eps.size();i++){
Ep e = eps.get(i);
if(e.shootBy(f)){
e.hp--;
if(e.hp<=0){
if(e.type==4){
power++;
if(power>3){
score+=10;
power=3;
}
}
eps.remove(e);
score+=10;
}
fs.remove(f);
}
}
}
//子弹移动
protected void fireMove() {
for(int i=0;i<fs.size();i++){
Fire f = fs.get(i);
f.move();
}
}
//发射子弹的方法
int findex = 0;
protected void shoot() {
findex++;
if(findex>=30){
if(power==1){
Fire fire2 = new Fire(hero.x+45,hero.y-20,1);
fs.add(fire2);
}else if(power==2){
Fire fire1 = new Fire(hero.x+10,hero.y,1);
fs.add(fire1);
Fire fire3 = new Fire(hero.x+80,hero.y,1);
fs.add(fire3);
}else{
Fire fire1 = new Fire(hero.x+10,hero.y,0);
fs.add(fire1);
Fire fire2 = new Fire(hero.x+45,hero.y-20,1);
fs.add(fire2);
Fire fire3 = new Fire(hero.x+80,hero.y,2);
fs.add(fire3);
}
findex=0;
}
}
3.数据字典
4.碰撞机制
public boolean shootBy(Fire f) {
boolean hit = x<=f.x+f.w
&&x>=f.x-w
&&y<=f.y+f.h
&&y>=f.y-h;
return hit;
}
5.运行截图
注:背景图片可自己设计。第一次做的java小游戏作业。。。请各位大神指点。
对游戏未来的改进和完善:(1)继续优化碰撞机制,做到更加精准;(2)当子弹接触到敌机时产生爆炸效果;(3)可以增加Boss敌机,显示Boss敌机的血量;(4)对于一部分敌机增加敌机发射子弹功能,增加道具敌机,击杀后爆取道具(5)增加游戏的背景音乐和击杀敌机音乐等等。