【Java】Java小游戏之Shoot游戏源码及详解
Shoot游戏是模仿微信中打飞机小游戏,这个游戏虽然简单,但通过这个游戏小项目,可以练习很多小的知识点,提高对面向对象的理解,还能提高逻辑思维能力。总之,好处多多,下面我将对游戏的结构及代码进行详细说明:
游戏运行状态界面:
1)游戏中类的结构图:
2)游戏步骤01:
1.class FlyingObject{
image,width,height,x,y
}
2.interface Enemy{
int getScore();
}
3.interface Award{
DOUBLE_FILE,LIFE
int getType();
}
4.class Airplane extends 1 implements 2{
speed
Airplane(){}
重写getScore()
}
5.class Bee extends 1 implements 3{
xSpeed,ySpeed,awardType
Bee(){}
重写getType()
}
6.class Bullet extends 1{
speed
Bullet(int x,int y){}
}
7.class Hero extends 1{
life,doubleFire,images,index
Hero(){}
}
8.class ShootGame extends JPanel{
WIDTH,HEIGHT
background,start,pause,gameover
airplane,bee,bullet,hero0,hero1
hero(Hero)
flyings(FlyingObject[])
bullets(Bullet[])
ShootGame(){初始化对象}
static{}
重写paint(g){
画背景图
paintHero(g);
paintFlyingObjects(g);
paintBullets(g);
}
paintHero(g){} //画英雄机
paintFlyingObjects(g){} //画敌人
paintBullets(g){} //画子弹
main(){
...
frame.setVisible(true);
}
}
3)游戏步骤02:
1.敌人入场的实现步骤:
1)main(){ game.action(); }
2)action(){
...
run(){ //10毫秒定时执行
enteredAction(); //敌人入场
repaint();
}
}
3)int index = 0;
enteredAction(){ //10毫秒
index++;
if(index%40==0){ //40*10毫秒
FlyingObject one = nextOne(); //创建一个敌人对象
flyings = Arrays.copyOf(flyings,flyings.length+1); //扩容
flyings[flyings.length-1] = one; //将敌人对象添加到敌人数组中
}
}
4)nextOne(){
生成0到19间的随机数
为0时return new Bee();
否则return new Airplane();
}
2.飞行物走一步的实现步骤:
1)FlyingObject----抽象方法step();
2)Airplane,Bee,Bullet,Hero---重写step()
3)action(){
run(){
enterAction();
stepAction();
repaint(); //重画
}
}
4)stepAction(){
遍历所有敌人,调用step()
遍历所有子弹,调用step()
hero.step();
}
3.子弹入场的实现步骤:
1)Hero---shoot()英雄机发射子弹
2)action(){
run(){
...
shootAction(); //发射子弹
repaint();
}
}
3)int shootIndex = 0;
shootAction(){ //10毫秒走一次
shootIndex++;
if(shootIndex%30==0){ //300毫秒
调用Hero的shoot()得到发射出的子弹数组bs
将bullets扩容
将bs追加到bullets数组中--System.arraycopy()
}
}
4.英雄机随着鼠标移动的实现步骤:
1)Hero---moveTo(int x,int y)
2)action(){
MouseAdapter l = new MouseAdapter(){
重写MouseMoved(){
获取鼠标的x和y
hero.moveTo(x,y); //移动
}
};
this.addMouseMotionListener(l);
this.addMouseListener(l);
run(){
...
}
}
5.子弹和敌人碰撞的实现步骤:
1)FlyingObject---shootBy(Bullet b)
2)Hero----addDoubleFire(),addLife()
3)action(){
run(){
...
bangAction(); //检查碰撞
repaint();
}
}
4)bangAction(){
遍历所有子弹,将子弹传给bang()方法
}
5)bang(Bullet b){ //1发子弹与所有敌人撞
遍历所有敌人,获取每一个敌人f
判断f是否与b撞上了
若撞上了:
5.1)得分或得奖励
5.1.1)得到被撞敌人对象
5.1.2)判断是敌人还是奖励
若是敌人则增分
若是奖励则得奖励类型
判断不同的奖励类型:
增命或增火力值
5.2)将被撞对象从flyings中删除
5.2.1)将被撞敌人与最后一个元素交换(追尾并绕圈)
5.2.2)缩容---删除最后一个元素(被撞的对象)
}
4)游戏步骤03:
1.画分和画命的实现步骤:
1)hero---getLife()获取命
2)paint(g){
......
paintScore(g); //画分和命
}
3)paintScore(g){
设置颜色g.setColor(...)
设置字体g.setFont(...)
画分g.drawString(...);
画命g.drawString(...);
}
2.删除越