【Javaプロジェクト】航空機戦

プロジェクト - 飛行機戦争

ウィンドウの作成

package GUI.project1;

import javax.swing.*;

public class GameWin extends JFrame {
    
    
    public void launch(){
    
    
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(600,600);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");
    }

    public static void main(String[] args) {
    
    
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

背景画像追加・クリックイベント開始

GameUtil.java

package project1;

import java.awt.*;

public class GameUtils {
    
    
    //背景图片
    public static Image bgImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bg.jpg");
    //boss图片
    public static Image bossImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\boss.png");
    //爆炸图片
    public static Image explodeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\explode\\e6.gif");


}

GameWin.java

package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    
    
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    public void launch(){
    
    
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(600,600);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        this.addMouseListener(new MouseAdapter() {
    
    
            @Override
            public void mouseClicked(MouseEvent e) {
    
    
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
    
    
                    state = 1;
                    repaint();
                }
            }
        });
    }

    @Override
    public void paint(Graphics g) {
    
    
        if (state == 0){
    
    
            g.drawImage(GameUtils.bgImg,0,0,this);
            g.drawImage(GameUtils.bossImg,220,120,this);
            g.drawImage(GameUtils.explodeImg,270,350,this);
            g.setColor(Color.yellow);
            g.setFont(new Font("仿宋",Font.BOLD,40));
            g.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
    
    
            g.drawImage(GameUtils.bgImg,0,0,this);
            g.drawImage(GameUtils.bossImg,220,120,this);
            g.drawImage(GameUtils.explodeImg,270,350,this);
            g.setColor(Color.yellow);
            g.setFont(new Font("仿宋",Font.BOLD,40));
            g.drawString("开始游戏了",180,300);
        }
    }

    public static void main(String[] args) {
    
    
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

ゲームオブジェクトの親クラスを書く

GameObj.java

package project1;

import java.awt.*;

public class GameObj {
    
    
    Image img;
    int x;
    int y;
    int width;
    int height;
    double speed;
    GameWin frame;

    public GameObj() {
    
    
    }

    public GameObj(Image img, int x, int y, double speed) {
    
    
        this.img = img;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }

    public GameObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        this.img = img;
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.speed = speed;
        this.frame = frame;
    }

    public Image getImg() {
    
    
        return img;
    }

    public void setImg(Image img) {
    
    
        this.img = img;
    }

    public int getX() {
    
    
        return x;
    }

    public void setX(int x) {
    
    
        this.x = x;
    }

    public int getY() {
    
    
        return y;
    }

    public void setY(int y) {
    
    
        this.y = y;
    }

    public int getWidth() {
    
    
        return width;
    }

    public void setWidth(int width) {
    
    
        this.width = width;
    }

    public int getHeight() {
    
    
        return height;
    }

    public void setHeight(int height) {
    
    
        this.height = height;
    }

    public double getSpeed() {
    
    
        return speed;
    }

    public void setSpeed(double speed) {
    
    
        this.speed = speed;
    }

    public GameWin getFrame() {
    
    
        return frame;
    }

    public void setFrame(GameWin frame) {
    
    
        this.frame = frame;
    }
    public void paintSelf(Graphics gImage){
    
    
        gImage.drawImage(img,x,y,null);
    }
    public Rectangle getRec(){
    
    
        return new Rectangle(x,y,width,height);
    }
}

背景の動き

package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    
    
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    //背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2);
    public void launch(){
    
    
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(600,600);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        this.addMouseListener(new MouseAdapter() {
    
    
            @Override
            public void mouseClicked(MouseEvent e) {
    
    
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
    
    
                    state = 1;
                    repaint();
                }
            }
        });
        while (true){
    
    
            repaint();
            try{
    
    
                Thread.sleep(25);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paint(Graphics g) {
    
    
        if (state == 0){
    
    
            g.drawImage(GameUtils.bgImg,0,0,this);
            g.drawImage(GameUtils.bossImg,220,120,this);
            g.drawImage(GameUtils.explodeImg,270,350,this);
            g.setColor(Color.yellow);
            g.setFont(new Font("仿宋",Font.BOLD,40));
            g.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
    
    
            bgObj.paintSelf(g);
        }
    }

    public static void main(String[] args) {
    
    
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

ダブルバッファリング技術 – テキストのちらつきを解消

GameWin.java を変更する

package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    
    
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    Image offScreenImage = null;
    int width = 600;
    int height = 600;
    //背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2);
    public void launch(){
    
    
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(width,height);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        this.addMouseListener(new MouseAdapter() {
    
    
            @Override
            public void mouseClicked(MouseEvent e) {
    
    
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
    
    
                    state = 1;
                    repaint();
                }
            }
        });
        while (true){
    
    
            repaint();
            try{
    
    
                Thread.sleep(25);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    @Override
    public void paint(Graphics g) {
    
    
        if (offScreenImage == null){
    
    
            offScreenImage = createImage(width,height);
        }
        Graphics gImage = offScreenImage.getGraphics();
        gImage.fillRect(0,0,width,height);
        if (state == 0){
    
    
            gImage.drawImage(GameUtils.bgImg,0,0,this);
            gImage.drawImage(GameUtils.bossImg,220,120,this);
            gImage.drawImage(GameUtils.explodeImg,270,350,this);
            gImage.setColor(Color.yellow);
            gImage.setFont(new Font("仿宋",Font.BOLD,40));
            gImage.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
    
    
            bgObj.paintSelf(gImage);
        }
        g.drawImage(offScreenImage,0,0,null);
    }

    public static void main(String[] args) {
    
    
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

背景画像のループ

BgObj.java で重大な条件を設定する
ここに画像の説明を挿入

戦闘機とマウス コントロールの追加

PlaneObj.java

package project1;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class PlaneObj extends GameObj{
    
    
    @Override
    public Image getImg() {
    
    
        return super.getImg();
    }

    public PlaneObj() {
    
    
        super();
    }

    public PlaneObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);

        this.frame.addMouseListener(new MouseAdapter() {
    
    
            @Override
            public void mouseMoved(MouseEvent e) {
    
    
                PlaneObj.super.x = e.getX() - 11;
                PlaneObj.super.y = e.getY() - 16;
            }
        });
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

バグ: 飛行機が動かない

最初の箇条書きを追加

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

箇条書きをまとめて追加する

GameWin.java

在这里插入代码片package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    
    
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    Image offScreenImage = null;
    int width = 600;
    int height = 600;
    //背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2);
    //飞机对象
    PlaneObj planeObj = new PlaneObj(GameUtils.planeImg,290,550,20,30,0,this);

    //游戏的重绘次数
    int count = 1;
    public void launch(){
    
    
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(width,height);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        GameUtils.gameObjList.add(bgObj);
        GameUtils.gameObjList.add(planeObj);

        this.addMouseListener(new MouseAdapter() {
    
    
            @Override
            public void mouseClicked(MouseEvent e) {
    
    
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
    
    
                    state = 1;
                    repaint();
                }
            }
        });

        while (true){
    
    
            if (state == 1){
    
    
                createObj();
                repaint();
            }
            repaint();
            try{
    
    
                Thread.sleep(25);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }


    @Override
    public void paint(Graphics g) {
    
    
        if (offScreenImage == null){
    
    
            offScreenImage = createImage(width,height);
        }
        Graphics gImage = offScreenImage.getGraphics();
        gImage.fillRect(0,0,width,height);
        if (state == 0){
    
    
            gImage.drawImage(GameUtils.bgImg,0,0,this);
            gImage.drawImage(GameUtils.bossImg,220,120,this);
            gImage.drawImage(GameUtils.explodeImg,270,350,this);
            gImage.setColor(Color.yellow);
            gImage.setFont(new Font("仿宋",Font.BOLD,40));
            gImage.drawString("点击开始游戏",180,300);
        }
        if (state == 1){
    
    
            //运行中
            for (int i =0;i<GameUtils.gameObjList.size();i++){
    
    
                GameUtils.gameObjList.get(i).paintSelf(gImage);
            }

        }
        g.drawImage(offScreenImage,0,0,null);
        count++;
    }

    void createObj(){
    
    
        if (count % 15 == 0){
    
    
            //我方子弹
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this));
            //通过索引把shellObjList的最后一个元素,加入到gameObjList中 ???
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));
        }

    }

    public static void main(String[] args) {
    
    
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

GameUtils.java

package project1;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class GameUtils {
    
    
    //背景图片
    public static Image bgImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bg.jpg");
    //boss图片
    public static Image bossImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\boss.png");
    //爆炸图片
    public static Image explodeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\explode\\e6.gif");
    //我方战斗机图片
    public static Image planeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\plane.png");
    //我方子弹图片
    public static Image shellImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\shell.png");

    //所有游戏物体的集合
    public static List<GameObj> gameObjList = new ArrayList<>();
    //我方子弹的集合
    public static List<ShellObj> shellObjList = new ArrayList<>();

}

質問:
1. GUI でコレクション要素を追加する方法
2. gameObjList の意味
回答: 次のレッスンのコードを参照してください

敵機の一括追加機能

1. EnemyObj.java を作成する

package project1;

import java.awt.*;

public class EnemyObj extends GameObj{
    
    
    public EnemyObj() {
    
    
        super();
    }

    public EnemyObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y += speed;
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

2. GameUtil.java に敵の画像とコレクションを追加する

package project1;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class GameUtils {
    
    
    //背景图片
    public static Image bgImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bg.jpg");
    //boss图片
    public static Image bossImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\boss.png");
    //爆炸图片
    public static Image explodeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\explode\\e6.gif");
    //我方战斗机图片
    public static Image planeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\plane.png");
    //我方子弹图片
    public static Image shellImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\shell.png");
    //敌机图片
    public static Image eneImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\enemy.png");


    //所有游戏物体的集合
    public static List<GameObj> gameObjList = new ArrayList<>();
    //我方子弹的集合
    public static List<ShellObj> shellObjList = new ArrayList<>();
    //敌机的集合
    public static List<EnemyObj> enemyObjList = new ArrayList<>();
}

3. GameWin.java で、前の手順と同様に、enemyObjList と gameObjList を追加します。

x値の設定:動画説明を見ることができます

void createObj(){
    
    
        if (count % 15 == 0){
    
    
            //我方子弹
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this));
            //通过索引把shellObjList的最后一个元素,加入到gameObjList中 ???
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));
        }
        if (count % 15 == 0){
    
    
            GameUtils.enemyObjList.add(new EnemyObj(GameUtils.eneImg,(int) (Math.random()*12)*50,0,49,36,5,this));
            GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size()-1));
        }
    }

ここに画像の説明を挿入

弾丸と敵機の衝突判定

EnemyObj.java で変更

public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y += speed;
        for (ShellObj shellObj:GameUtils.shellObjList){
    
    
            if (this.getRec().intersects(shellObj.getRec())){
    
    
                System.out.println("碰撞了");
            }
        }
    }

自機の弾が敵機に衝突したときの対処

ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入

私たちの弾丸が敵の航空機と衝突するときの衝突と墜落

EnemyObj.java
ここに画像の説明を挿入
GameWin.java
ここに画像の説明を挿入

マウスの動きのバグのため、衝突とクラッシュの効果を達成する方法はありません

敵ボスの追加と移動

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

敵のボスに弾丸を追加する

1. 新しい BulletObj クラスを作成する

package project1;

import java.awt.*;

public class BulletObj extends GameObj{
    
    
    public BulletObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

2. GameUtils.java に写真とコレクションを追加する

//敌方子弹的集合
    public static Image bulletImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\bullet.png");

//敌方子弹的集合
    public static List<BulletObj> bulletObjList = new ArrayList<>();

3. GameWin.java にコレクション クラスを追加します。

if (count % 15 == 0){
    
    
            GameUtils.bulletObjList.add(new BulletObj(GameUtils.bulletImg,bossObj.getX()+76,bossObj.getY()+85,15,25,5,this));
            GameUtils.gameObjList.add(GameUtils.bulletObjList.get(GameUtils.bulletObjList.size()-1));
        }

4. BulletObj に戻り、Java で弾速を追加します。

@Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y += speed;
    }

自機と敵機の弾丸衝突判定

BulletObj.java で状態を 3 に設定します

@Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y += speed;
        //敌方子弹于我方飞机的碰撞检测
        if (this.getRec().intersects(this.frame.planeObj.getRec())){
    
    
            GameWin.state = 3;
        }
    }

自機と敵ボスの衝突判定

PlaneObj.java で状態を 3 に設定します。
ここに画像の説明を挿入

スコアボードの書き込み

1. GameWin.java でゲーム スコア変数を定義します。
ここに画像の説明を挿入
2. GameUtil.java で文字列ツール クラスを描画します。
ここに画像の説明を挿入
3. メイン クラスで同じコードを置き換えます。 4.
ここに画像の説明を挿入
メイン クラスでスコアボードを描画します。
ここに画像の説明を挿入
衝突
ここに画像の説明を挿入

ゲームのルールを設定する

敵機が100機出現するとボスが出現

1. GameWin.java に設定
ここに画像の説明を挿入
2. GameWin.java で敵機を生成すると、enemyCount は ++ となる
ここに画像の説明を挿入
3. Bossobj の生成条件を判定する if 判定条件を追加
ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入
4. ボスの弾生成判定を上げます
ここに画像の説明を挿入
5.バグ: エラー報告 -- PlaneObj.java の衝突検出に行き、判定を追加します
ここに画像の説明を挿入

敵のボスにヘルスを追加します

1.健康を設定する
ここに画像の説明を挿入

2. 敵の航空機と弾丸の間の衝突検出を設定します
ここに画像の説明を挿入
3. GameWin.java に移動してクリアランス プロンプトを追加します
ここに画像の説明を挿入

ゲームポーズ機能

ここに画像の説明を挿入

弾丸と敵機のアウトオブバウンズが消える

弾丸と敵機が窓の外にまだ描かれているため、ゲームの速度が遅くなります

1.弾が窓の外に出た後の処理
ここに画像の説明を挿入

2.敵弾消失判定
ここに画像の説明を挿入
3.GameWin.javaで長さを観測
ここに画像の説明を挿入

出力: 最後の安定
ここに画像の説明を挿入

敵小型機に爆発エフェクトを追加

1. ExplodeObj クラスの実装
ここに画像の説明を挿入
2. GameObj.java へのコンストラクターの追加
ここに画像の説明を挿入
3. ExplodeObj クラスへのコンストラクターの継承
ここに画像の説明を挿入

4.画像配列に爆発画像を入れる
ここに画像の説明を挿入
2.爆発画像の判定を追加する
ここに画像の説明を挿入
ここに画像の説明を挿入
3.メインクラスに爆発コレクションクラスを追加する
ここに画像の説明を挿入
4.EnemyObj.javaに爆発クラスをバインドする
ここに画像の説明を挿入
5.GameWin.javaからgameobjListに追加する
ここに画像の説明を挿入
6. EnemyObj.java の removeList に追加
ここに画像の説明を挿入

敵のボスにヘルスバーを追加する

BossObj.java に追加
ここに画像の説明を挿入

完成品

ゲームウィン

package project1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class GameWin extends JFrame {
    
    
    //游戏状态 0未开始 1游戏中 2暂停 3通关失败 4通关成功
    static int state = 0;
    //游戏得分
    public static int score = 0;
    Image offScreenImage = null;

    //背景图对象
    BgObj bgObj = new BgObj(GameUtils.bgImg,0,-2000,2);
    //我方飞机对象
    public PlaneObj planeObj = new PlaneObj(GameUtils.planeImg,290,550,20,30,0,this);
    //敌方Boss对象
    public BossObj bossObj = null;
    int width = 600;
    int height = 600;
    //游戏的重绘次数
    int count = 1;
    //低级出现的数量
    int enemyCount = 0;


    public void launch(){
    
    
        //设置窗口是否可见
        this.setVisible(true);
        //设置窗口大小
        this.setSize(width,height);
        //设置窗口位置
        this.setLocationRelativeTo(null);
        //设置窗口标题
        this.setTitle("aircraft battle");

        GameUtils.gameObjList.add(bgObj);
        GameUtils.gameObjList.add(planeObj);

        this.addMouseListener(new MouseAdapter() {
    
    
            @Override
            public void mouseClicked(MouseEvent e) {
    
    
                //e.getButton()==1:按下鼠标左键
                if (e.getButton()==1 && state==0){
    
    
                    state = 1;
                }
            }
        });

        //暂停
        this.addKeyListener(new KeyAdapter() {
    
    
            @Override
            public void keyPressed(KeyEvent e) {
    
    
                if (e.getKeyCode() == 32){
    
    
                    switch (state){
    
    
                        case 1:
                            state = 2;
                            break;
                        case 2:
                            state = 1;
                            break;
                        default:
                    }
                }
            }
        });

        while (true){
    
    
            if (state == 1){
    
    
                createObj();
                repaint();
            }
            repaint();
            try{
    
    
                Thread.sleep(25);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }


    @Override
    public void paint(Graphics g) {
    
    
        if (offScreenImage == null){
    
    
            offScreenImage = createImage(width,height);
        }
        Graphics gImage = offScreenImage.getGraphics();
        gImage.fillRect(0,0,width,height);
        if (state == 0){
    
    
            gImage.drawImage(GameUtils.bgImg,0,0,this);
            gImage.drawImage(GameUtils.bossImg,220,120,this);
            gImage.drawImage(GameUtils.explodeImg,270,350,this);
            GameUtils.drawWord(gImage,"点击开始游戏",Color.yellow,40,180,300);
        }
        if (state == 1){
    
    
            //顺序很重要:先添加,再循环,最后删除
            GameUtils.gameObjList.addAll(GameUtils.explodeObjList);
            for (int i =0;i<GameUtils.gameObjList.size();i++){
    
    
                GameUtils.gameObjList.get(i).paintSelf(gImage);
            }
            GameUtils.gameObjList.removeAll(GameUtils.removeList);
        }
        if (state == 3){
    
    
            //失败
            gImage.drawImage(GameUtils.explodeImg,planeObj.getX()-35,planeObj.getY()-50,this);
            GameUtils.drawWord(gImage,"GAME OVER",Color.RED,50,180,300);
        }
        if (state == 4){
    
    
            //通关
            gImage.drawImage(GameUtils.explodeImg,bossObj.getX()+30,bossObj.getY(),this);
            GameUtils.drawWord(gImage,"游戏通关",Color.green,50,190,300);
        }
        GameUtils.drawWord(gImage,score+"分",Color.GREEN,40,30,100);

        g.drawImage(offScreenImage,0,0,null);
        count++;
//        System.out.println(GameUtils.gameObjList.size());
    }

    void createObj(){
    
    
        if (count % 15 == 0){
    
    
            //我方子弹
            GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this));
            //通过索引把shellObjList的最后一个元素,加入到gameObjList中 ???
            GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));
        }
        if (count % 15 == 0){
    
    
            GameUtils.enemyObjList.add(new EnemyObj(GameUtils.eneImg,(int) (Math.random()*12)*50,0,49,36,5,this));
            GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size()-1));
            enemyCount++;
        }
        if (count % 15 == 0 && bossObj != null){
    
    
            GameUtils.bulletObjList.add(new BulletObj(GameUtils.bulletImg,bossObj.getX()+76,bossObj.getY()+85,15,25,5,this));
            GameUtils.gameObjList.add(GameUtils.bulletObjList.get(GameUtils.bulletObjList.size()-1));
        }
        if (enemyCount > 100 && bossObj == null){
    
    
            bossObj = new BossObj(GameUtils.bossImg,250,35,155,100,5,this);
            GameUtils.gameObjList.add(bossObj);
        }
    }

    public static void main(String[] args) {
    
    
        GameWin gameWin = new GameWin();
        gameWin.launch();

    }
}

ゲームユーティリティ

package project1;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;

public class GameUtils {
    
    
    //背景图片
    public static Image bgImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\aircraft battle\\imgs\\bg.jpg");
    //boss图片
    public static Image bossImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\aircraft battle\\imgs\\boss.png");
    //爆炸图片
    public static Image explodeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\aircraft battle\\imgs\\explode\\e6.gif");
    //我方战斗机图片
    public static Image planeImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\aircraft battle\\imgs\\plane.png");
    //我方子弹图片
    public static Image shellImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\aircraft battle\\imgs\\shell.png");
    //敌机图片
    public static Image eneImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\aircraft battle\\imgs\\enemy.png");
    //敌方子弹的集合
    public static Image bulletImg = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\aircraft battle\\imgs\\bullet.png");

    //所有游戏物体的集合
    public static List<GameObj> gameObjList = new ArrayList<>();
    //我方子弹的集合
    public static List<ShellObj> shellObjList = new ArrayList<>();
    //敌机的集合
    public static List<EnemyObj> enemyObjList = new ArrayList<>();
    //要删除元素的集合
    public static List<GameObj> removeList = new ArrayList<>();
    //敌方子弹的集合
    public static List<BulletObj> bulletObjList = new ArrayList<>();
    //爆炸的集合
    public static List<ExplodeObj> explodeObjList = new ArrayList<>();

    //绘制字符串工具类
    public static void drawWord(Graphics gImage,String str,Color color,int size,int x,int y){
    
    
        gImage.setColor(color);
        gImage.setFont(new Font("仿宋",Font.BOLD,size));
        gImage.drawString(str,x,y);
    }

}

ゲームオブジェクト

package project1;

import java.awt.*;

public class GameObj {
    
    
    Image img;
    int x;
    int y;
    int width;
    int height;
    double speed;
    GameWin frame;

    public GameObj() {
    
    
    }

    public GameObj(Image img, int x, int y, double speed) {
    
    
        this.img = img;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }

    public GameObj(int x, int y) {
    
    
        this.x = x;
        this.y = y;
    }

    public GameObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        this.img = img;
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.speed = speed;
        this.frame = frame;
    }

    public Image getImg() {
    
    
        return img;
    }

    public void setImg(Image img) {
    
    
        this.img = img;
    }

    public int getX() {
    
    
        return x;
    }

    public void setX(int x) {
    
    
        this.x = x;
    }

    public int getY() {
    
    
        return y;
    }

    public void setY(int y) {
    
    
        this.y = y;
    }

    public int getWidth() {
    
    
        return width;
    }

    public void setWidth(int width) {
    
    
        this.width = width;
    }

    public int getHeight() {
    
    
        return height;
    }

    public void setHeight(int height) {
    
    
        this.height = height;
    }

    public double getSpeed() {
    
    
        return speed;
    }

    public void setSpeed(double speed) {
    
    
        this.speed = speed;
    }

    public GameWin getFrame() {
    
    
        return frame;
    }

    public void setFrame(GameWin frame) {
    
    
        this.frame = frame;
    }
    public void paintSelf(Graphics gImage){
    
    
        gImage.drawImage(img,x,y,null);
    }
    public Rectangle getRec(){
    
    
        return new Rectangle(x,y,width,height);
    }
}

BgObj

package project1;

import java.awt.*;

public class BgObj extends GameObj{
    
    
    public BgObj() {
    
    
    }

    public BgObj(Image img, int x, int y, double speed) {
    
    
        super(img, x, y, speed);
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y += speed;
        if (y>=0){
    
    
            y -= 2000;
        }
    }
}

ボスオブジェクト

package project1;

import java.awt.*;

public class BossObj extends GameObj{
    
    
    int life = 10;
    public BossObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        if (x>550 || x<-50){
    
    
            speed = -speed;
        }
        x += speed;
        for (ShellObj shellObj : GameUtils.shellObjList){
    
    
            if (this.getRec().intersects(shellObj.getRec())){
    
    
                //将子弹移除
                shellObj.setX(-100);
                shellObj.setY(100);
                //添加到removeList中
                GameUtils.removeList.add(shellObj);
                //生命值减少
                life--;
            }
            if (life <= 0){
    
    
                GameWin.state = 4;
            }
        }
        //血条背景
        gImage.setColor(Color.red);
        //血条的绘制
        gImage.fillRect(20,40,life*100/10,10);
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

BulletObj

package project1;

import java.awt.*;

public class BulletObj extends GameObj{
    
    
    public BulletObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y += speed;
        //敌方子弹于我方飞机的碰撞检测
        if (this.getRec().intersects(this.frame.planeObj.getRec())){
    
    
            GameWin.state = 3;
        }
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

敵オブジェクト

package project1;

import java.awt.*;

public class EnemyObj extends GameObj{
    
    
    public EnemyObj() {
    
    
        super();
    }

    public EnemyObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y += speed;
        //敌方与我方碰撞处理
        if (this.getRec().intersects(this.frame.planeObj.getRec())){
    
    
            GameWin.state = 3;
        }
        //敌方子弹的越界消失
        if (y>600){
    
    
            this.x = -300;
            this.y = 300;
            GameUtils.removeList.add(this);
        }
        //子弹碰撞处理
        for (ShellObj shellObj:GameUtils.shellObjList){
    
    
            if (this.getRec().intersects(shellObj.getRec())){
    
    
                ExplodeObj explodeObj = new ExplodeObj(x,y);
                GameUtils.explodeObjList.add(explodeObj);
                GameUtils.removeList.add(explodeObj);
                //这段代码没看懂,去掉好像也不影响 --移动位置不能重复,不然会导致碰撞检测的发生
                shellObj.setX(-100);
                shellObj.setY(100);
                this.x = -200;
                this.y = 200;
                GameUtils.removeList.add(shellObj);
                GameUtils.removeList.add(this);
                GameWin.score++;
            }
        }
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

ExplodeObj

package project1;

import java.awt.*;

public class ExplodeObj extends GameObj{
    
    
    static Image[] pic = new Image[16];

    int explodeCount = 0;

    static {
    
    
        for (int i = 0; i < pic.length; i++) {
    
    
            pic[i] = Toolkit.getDefaultToolkit().getImage("C:\\IntelliJ IDEA Community Edition 2022.2.3\\study\\src\\imgs\\explode\\e"+(i+1)+".gif");
        }
    }
    public ExplodeObj(int x, int y) {
    
    
        super(x, y);
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        //如果explodeCount小于数组长度
        if (explodeCount < 16){
    
    
            img = pic[explodeCount];
            super.paintSelf(gImage);
            explodeCount++;
        }
    }
}

平面オブジェクト

package project1;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class PlaneObj extends GameObj{
    
    
    @Override
    public Image getImg() {
    
    
        return super.getImg();
    }

    public PlaneObj() {
    
    
        super();
    }

    public PlaneObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);

        frame.addMouseListener(new MouseAdapter() {
    
    
            @Override
            public void mouseMoved(MouseEvent e) {
    
    
                PlaneObj.super.x = e.getX();
                PlaneObj.super.y = e.getY();
            }
        });
    }


    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        //我方飞机与敌方boss的碰撞检测
        if (this.frame.bossObj != null && this.getRec().intersects(this.frame.bossObj.getRec())){
    
    
            GameWin.state = 3;
        }
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

シェル オブジェクト

package project1;

import java.awt.*;

public class ShellObj extends GameObj{
    
    
    public ShellObj() {
    
    
        super();
    }

    public ShellObj(Image img, int x, int y, int width, int height, double speed, GameWin frame) {
    
    
        super(img, x, y, width, height, speed, frame);
    }

    @Override
    public Image getImg() {
    
    
        return super.getImg();
    }

    @Override
    public void paintSelf(Graphics gImage) {
    
    
        super.paintSelf(gImage);
        y -= speed;
        //我方子弹的越界消失
        if (y<0){
    
    
            this.x = -100;
            this.y = 100;
            GameUtils.removeList.add(this);
        }
    }

    @Override
    public Rectangle getRec() {
    
    
        return super.getRec();
    }
}

おすすめ

転載: blog.csdn.net/m0_65431212/article/details/128514635