第九课:项目实例—飞机大战

游戏规则:游戏可以产生小的敌机、大的敌机、小蜜蜂,这三类都是随机概率出现的,游戏打开的时候,鼠标单击,游戏开始,     自动发射子弹,英雄机跟随鼠标移动,当鼠标移到窗口外时,游戏暂停,当鼠标又移回时,游戏继续,子弹打中敌机和小蜜          蜂,当生命降到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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值