游戏规则:游戏可以产生小的敌机、大的敌机、小蜜蜂,这三类都是随机概率出现的,游戏打开的时候,鼠标单击,游戏开始, 自动发射子弹,英雄机跟随鼠标移动,当鼠标移到窗口外时,游戏暂停,当鼠标又移回时,游戏继续,子弹打中敌机和小蜜 蜂,当生命降到0时,消失,敌机 撞击到英雄机, 英雄机生命值-1, 直到0时, 游戏结束, 小敌机: 分数+,大敌机: 分数+ 奖励(生命值加成, 火力加成),小蜜蜂: 奖励(生命值加成, 火力加成)。
1.窗口显示 JFrame
2.画板/面板 JPanel
原生的 JPanel 中, 不能自定义绘画
只能画 按钮, 输入框.. 等一些组件
功能加强 -> 自定义类继承 JPanel
3.图片读取
1.硬盘中有图片文件
2.将硬盘中的图片文件, 读取到JVM内存中, 成一个对象
InputOutput -> IO
类名.class -> 所有的类加载到方法区中,对应一个Class对象
public static void main(String[] args) { JFrame window = new JFrame(); window.setSize(FlyMain.WIDTH,FlyMain.HEIGHT); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); FlyMain main = new FlyMain(); window.add(main); main.action(); window.setVisible(true); } }
4.程序的设计
类的设计
飞机大战:
提取对象: 自己的飞机, 敌机, 小蜜蜂, 子弹
子类 extends 父类
自己的飞机: Hero
发射的子弹, int life, int 分数
敌机: Airplane
小蜜蜂: Bee
子弹: Bullet - 有参的构造方法
大敌机: BigPlane
int 血量
以上类中相同的成员变量, 和相同的方法, 提取出来
父类: FlyingObject
int x, int y, 图片, int width, int height
move() - 移动
读取图片: 程序最开始就一次性读取完
static{}
父类
package com.zzxx.fly; import java.awt.image.BufferedImage; public abstract class FlyingObject { protected int x; protected int y; protected int width; protected int height; protected int speed; protected int blood; protected BufferedImage image; protected abstract void move(); }
5.补充类的构造方法
6.在主程序中创建各种对象 测试
7.完成move方法
8.主程序中: 添加定时器
a.生成新的飞行物(小蜜蜂, 敌机, 大敌机)
b.移动所有飞行物
d.发射子弹 - 属于英雄机的行为 - 写在Hero类中
e.移动所有子弹
c.判断飞行物和子弹越界
f.判断子弹和飞行物碰撞
g.英雄机移动 - move - 鼠标控制
h.英雄机和敌机碰撞
i.判断游戏是否结束
z.重画
9.添加鼠标监听事件 - 监听器 - 接口
单击\移动\鼠标移出界面\鼠标移入界面
窗口/画板.addMouseListener -> 单击\鼠标移入\鼠标移出
窗口/画板.addMouseMotionListener -> 鼠标移动
注意:
接口功能太多, 选择性使用功能, 提供了一个适配器 - 抽象类
MouseAdapter - 抽象类, 将所有接口方法空实现
10.游戏状态
a.初始状态 start
b.运行状态 running
c.暂停状态 pause
d.游戏结束 gameover
start -> 鼠标单击 -> running
running -> 移出 -> pause
-> hero.getLife()==0 -> gameover
pause -> 鼠标移入 -> running
gameover -> 鼠标单击 -> start
11.奖励类型: [火力加成], 生命值加成
奖励在对象创建时就已经初始化好
12.碰撞
子弹和飞行物的碰撞: 要么加分, 要么奖励
飞行物和英雄机的碰撞: 减英雄机生命值
13.判断游戏是否结束
hero.getLife() == 0
package com.zzxx.fly; import com.zzxx.game.I; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.TimerTask; public class FlyMain extends JPanel { public static BufferedImage background; public static BufferedImage hero0; public static BufferedImage hero1; public static BufferedImage airplane1; public static BufferedImage bee1; public static BufferedImage bigplane1; public static BufferedImage bullet1; public static BufferedImage pause1; public static BufferedImage start1; public static BufferedImage ending1; public static BufferedImage airplane_ember0; static{ try { background = ImageIO.read(FlyMain.class.getResourceAsStream("scr/background.png")); hero0 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/hero0.png")); hero1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/hero1.png")); airplane1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/airplane.png")); bee1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/bee.png")); bigplane1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/bigplane.png")); bullet1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/bullet.png")); pause1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/pause.png")); start1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/start.png")); ending1 = ImageIO.read(FlyMain.class.getResourceAsStream("scr/gameover.png")); } catch (IOException e) { e.printStackTrace(); } } public static final int WIDTH = 450; public static final int HEIGHT = 600; private java.util.Timer timer = new java.util.Timer(); public void action(){ timer.schedule(new TimerTask() { @Override public void run() { if(state == RUNING){ creatFlyingObject(); flyingObjectMove(); creatBullet(); bulletShoot(); flyingOutBounds(); boomDisapper(); heroDisappear(); bee.move(); airplane.move(); bigplane.move(); hero.move(); repaint();} } },3000,100); MouseAdapter mouseAdapter = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if(state == START){ state = RUNING; }else if(state == ENDING){ state = START; repaint(); } } @Override public void mouseEntered(MouseEvent e) { if(state == RUNING){ repaint(); }else if(state == PAUSE){ state = RUNING; } } @Override public void mouseExited(MouseEvent e) { if(state == RUNING){ state = PAUSE; repaint(); } } @Override public void mouseMoved(MouseEvent e) { if(state == RUNING){ int mouse_x = e.getX(); int mouse_y = e.getY(); hero.x = mouse_x - hero.width / 2; hero.y = mouse_y; repaint(); } } }; this.addMouseListener(mouseAdapter); this.addMouseMotionListener(mouseAdapter); } private int flyingIndex = 0; private int bulletCount = 0; private ArrayList<FlyingObject> flys = new ArrayList<>(); private ArrayList<Bullet> bullets = new ArrayList<>(); private ArrayList<Buried> burieds = new ArrayList<>(); private final int START = 0; private final int RUNING = 1; private final int PAUSE = 2; private final int ENDING = 3; private int state = START; private void creatFlyingObject(){ flyingIndex++; if(flyingIndex % 10 == 0){ int ran = (int)(Math.random() * 20); FlyingObject fly; if(ran == 0){ fly = new Bee(); }else if(ran == 1 || ran == 2){ fly = new BigPlane(); }else { fly = new Airplane(); }flys.add(fly); } } private void creatBullet(){ bulletCount++; if(bulletCount % 5 == 0){ Bullet[] b = hero.shoot(); bullets.addAll(Arrays.asList(b)); } } Hero hero = new Hero(); Airplane airplane = new Airplane(); Bee bee = new Bee(); BigPlane bigplane = new BigPlane(); Buried buried = new Buried(); @Override public void paint(Graphics g) { if(state == RUNING){ super.paint(g); g.drawImage(background, 0, 0, WIDTH,HEIGHT,this); g.drawImage(hero.image, hero.x, hero.y, this); g.drawString((""+ hero.getScore()),25,25); g.drawString(("" + hero.getLife()),25,75); flyingPaint(g); bulletPaint(g); } if(state == PAUSE){ g.drawImage(pause1,0,0,this); } if(state == START){ g.drawImage(start1,0,0,this); } if(state == ENDING){ g.drawImage(ending1,0,0,this); hero.setLife(5); hero.setScore(0); } } public void flyingPaint(Graphics g){ if(state == RUNING){ for (int i = 0; i < flys.size(); i++) { FlyingObject fly = flys.get(i); g.drawImage(fly.image,fly.x,fly.y,fly.width,fly.height,this); }} } public void bulletPaint(Graphics g){ if(state == RUNING){ for (int i = 0; i < bullets.size(); i++){ g.drawImage(bullets.get(i).image, bullets.get(i).x, bullets.get(i).y, bullets.get(i).width, bullets.get(i).height, this); } } } public void flyingObjectMove(){ for (int i = 0; i < flys.size(); i++) { flys.get(i).move(); } } public void bulletShoot(){ for (int i = 0; i < bullets.size(); i++) { bullets.get(i).move(); } } public void flyingOutBounds(){ for (int i = 0; i < flys.size(); i++) { FlyingObject fly = flys.get(i); if(fly.y - fly.height > FlyMain.HEIGHT){ flys.remove(i); i--; } } for (int i = 0; i < bullets.size(); i++) { Bullet bullet = bullets.get(i); if(bullet.y <= -bullet.height){ bullets.remove(i); i--; } } } public void boomDisapper(){ for (int i = 0; i < bullets.size(); i++) { for (int j = 0; j < flys.size(); j++) { if(hero.knock(bullets.get(i).x,bullets.get(i).y,flys.get(j).x,flys.get(j).y,flys.get(j).width,flys.get(j).height)){ flys.get(j).blood --; bullets.remove(i); i--; if(flys.get(j).blood == 0){ if(flys.get(j) instanceof Enemy) { Enemy enemy = (Enemy) (flys.get(j)); hero.addScore(enemy.getscore()); } if(flys.get(j) instanceof Award){ Award award = (Award)(flys.get(j)); if(award.getAwardType() == Award.ADD_LIFE){ hero.addLife(); } else{hero.addDoubleFire(); } } flys.remove(j); j--; } break; } } } } public void heroDisappear(){ for (int i = 0; i < flys.size(); i++) { if((flys.get(i).x <= hero.x + hero.width)&&(flys.get(i).x + flys.get(i).width >= hero.x) && (flys.get(i).y + flys.get(i).height >= hero.y) && (flys.get(i).y <= hero.y + hero.height)){ hero.setLife(hero.getLife() - 1 ); flys.remove(i); i--; if(hero.getLife() == 0){ state = ENDING; } } } } public static void main(String[] args) { JFrame window = new JFrame(); window.setSize(FlyMain.WIDTH,FlyMain.HEIGHT); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); FlyMain main = new FlyMain(); window.add(main); main.action(); window.setVisible(true); } }