文章目录

  • 项目-飞机大战
    • 窗口的创建
    • 背景图片的添加/点击事件的启动
    • 游戏物体父类的编写
    • 背景的移动
    • 双缓存技术--解决文字闪动
    • 背景图片循环出现
    • 我方战斗机的添加和鼠标控制
    • 添加首颗子弹
    • 批量添加子弹
    • 敌方飞机的批量添加功能
    • 我方子弹与敌方飞机的碰撞检测
    • 我方子弹与敌方飞机碰撞时的处理
    • 我方子弹与敌方飞机碰撞时碰撞坠毁
    • 敌方boss的添加和移动
    • 为敌方boss添加子弹
    • 我方飞机和敌方飞机子弹碰撞检测
    • 我方飞机与敌方boss的碰撞检测
    • 计分板的编写
    • 设定游戏规则
    • 为敌方boss添加生命值
    • 游戏的暂停功能
    • 子弹和敌机的越界消失
    • 为敌方小飞机添加爆炸效果
    • 为敌方boss添加生命血条
  • 成品
    • GameWin
    • GameUtils
    • GameObj
    • BgObj
    • BossObj
    • BulletObj
    • EnemyObj
    • ExplodeObj
    • PlaneObj
    • ShellObj

项目-飞机大战

窗口的创建

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() {@Overridepublic void mouseClicked(MouseEvent e) {//e.getButton()==1:按下鼠标左键if (e.getButton()==1 && state==0){state = 1;repaint();}}});}@Overridepublic 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() {@Overridepublic 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();}}}@Overridepublic 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() {@Overridepublic 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();}}}@Overridepublic 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{@Overridepublic 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() {@Overridepublic void mouseMoved(MouseEvent e) {PlaneObj.super.x = e.getX() - 11;PlaneObj.super.y = e.getY() - 16;}});}@Overridepublic void paintSelf(Graphics gImage) {super.paintSelf(gImage);}@Overridepublic Rectangle getRec() {return super.getRec();}
}

bug:飞机没动静

添加首颗子弹





批量添加子弹

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() {@Overridepublic 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();}}}@Overridepublic 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);}@Overridepublic void paintSelf(Graphics gImage) {super.paintSelf(gImage);y += speed;}@Overridepublic 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

因为鼠标移动的那个bug,所以没办法达到碰撞坠毁的效果

敌方boss的添加和移动





为敌方boss添加子弹

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);}@Overridepublic void paintSelf(Graphics gImage) {super.paintSelf(gImage);}@Overridepublic 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中添加子弹速度

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

我方飞机和敌方飞机子弹碰撞检测

在BulletObj.java中设置state为3

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

我方飞机与敌方boss的碰撞检测

在PlaneObj.java中设置state为3

计分板的编写

1.在GameWin.java中定义游戏得分变量

2.在 GameUtil.java中绘制字符串工具类

3.在主类中替换相同代码

4.在主类中绘制计分板

5.在EnemyObj.java中检测碰撞时score++

设定游戏规则

当敌机出现100架后,Boss才出现

1.在GameWin.java中设定

2.GameWin.java中,生成一辆敌机,enemyCount就++

3.增加if判断条件,判断bossobj的生成条件



4.增加boss的子弹生成判断

5.bug:报错 --去PlaneObj.java中的碰撞检测加上判断

为敌方boss添加生命值

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中

为敌方boss添加生命血条

在BossObj.java中添加

成品

GameWin

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() {@Overridepublic void mouseClicked(MouseEvent e) {//e.getButton()==1:按下鼠标左键if (e.getButton()==1 && state==0){state = 1;}}});//暂停this.addKeyListener(new KeyAdapter() {@Overridepublic 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();}}}@Overridepublic 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();}
}

GameUtils

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);}}

GameObj

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);}@Overridepublic void paintSelf(Graphics gImage) {super.paintSelf(gImage);y += speed;if (y>=0){y -= 2000;}}
}

BossObj

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);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic void paintSelf(Graphics gImage) {super.paintSelf(gImage);y += speed;//敌方子弹于我方飞机的碰撞检测if (this.getRec().intersects(this.frame.planeObj.getRec())){GameWin.state = 3;}}@Overridepublic Rectangle getRec() {return super.getRec();}
}

EnemyObj

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);}@Overridepublic 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++;}}}@Overridepublic 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);}@Overridepublic void paintSelf(Graphics gImage) {//如果explodeCount小于数组长度if (explodeCount < 16){img = pic[explodeCount];super.paintSelf(gImage);explodeCount++;}}
}

PlaneObj

package project1;import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;public class PlaneObj extends GameObj{@Overridepublic 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() {@Overridepublic void mouseMoved(MouseEvent e) {PlaneObj.super.x = e.getX();PlaneObj.super.y = e.getY();}});}@Overridepublic void paintSelf(Graphics gImage) {super.paintSelf(gImage);//我方飞机与敌方boss的碰撞检测if (this.frame.bossObj != null && this.getRec().intersects(this.frame.bossObj.getRec())){GameWin.state = 3;}}@Overridepublic Rectangle getRec() {return super.getRec();}
}

ShellObj

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);}@Overridepublic Image getImg() {return super.getImg();}@Overridepublic void paintSelf(Graphics gImage) {super.paintSelf(gImage);y -= speed;//我方子弹的越界消失if (y<0){this.x = -100;this.y = 100;GameUtils.removeList.add(this);}}@Overridepublic Rectangle getRec() {return super.getRec();}
}

【java项目】飞机大战相关推荐

  1. 基于Java的飞机大战游戏的设计与实现论文

    源码下载 http://www.byamd.xyz/hui-zong-1/ 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communicat ...

  2. 基于Java的飞机大战游戏的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于Java的飞机大战游戏的设计与实现 摘   要 现如今,随着智能手机的兴起与普及,加上4G( ...

  3. 【Java】Java基础飞机大战小游戏完整代码

    Java基础飞机大战小游戏完整代码 先来展示一下代码实现结果图 主函数ShootGame 初始化游戏原始背景图片,游戏人物图片,游戏开始结束图片:构建产生敌人算法:产生英雄机算法:发射子弹算法:判断是 ...

  4. 毕业设计 基于Java的飞机大战游戏的设计与实现

    文章目录 前言 一.项目设计 1. 模块设计 功能需求 游戏状态控制功能模块 游戏难度的调整模块 游戏界面绘画功能模块 玩家游戏控制功能模块 2. 实现效果 二.部分源码 项目源码 前言 今天学长向大 ...

  5. 基于Java的飞机大战游戏的设计与实现

    项目介绍 飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐.我方飞机可以随意移动,敌方飞机无规律出现.游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就 ...

  6. 基于Java的飞机大战游戏的设计与实现(论文+源码)

    毕业设计(论文)任务书 第1页 毕业设计(论文)题目:基于Java的飞机大战游戏的设计与实现毕业设计(论文)要求及原始数据(资料):1.综述基于Java的飞机大战游戏的现状:2.深入了解Java的设计 ...

  7. 基于Java Swing 飞机大战游戏

    一.项目概要: 基于Java Swing飞机大战游戏,打死飞机,可以随机出现加血包.子弹升级包.并支持根据游戏的分数,调整游戏难度. 二.界面展示: 三.主要代码: package com.maoxu ...

  8. java版飞机大战代码

    java版飞机大战代码 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before ...

  9. VS/Qt C++ 入门项目飞机大战(内含全部源代码,素材,项目工程,项目祥解)可直接运行

    零.说在前面 最近做了个qt/c++的小项目飞机大战,主要是边玩边做,主要讲解一下设计思路,各个模块的实现原理,非常适合初学者拿来练手.需要源码.素材.项目详解.打包软件等整个项目用到的全部内容,可以 ...

  10. JAVA实战项目飞机大战——手把手教你轻松学会

    飞机大战是90后童年经典回忆游戏,紧张刺激的画面和操作感,令人回味无穷.只是大家可能不知道的是,这个经典游戏只是Java的入门项目而已.只要稍微有点基础,便可以轻松的制作出来.今天小编就来带大家用ja ...

最新文章

  1. CentOS7环境搭建使用PhpStorm上传代码
  2. 《Java多线程编程核心技术》读后感(七)
  3. Ansible管理节点过多导致的超时问题解决方法
  4. 比起第一代,《最后生还者2》到底做错了什么?
  5. 阿里云从0安装mysql到远程连接
  6. C++ 学习之旅(7)——指针pointer
  7. 工作67:el-table问题
  8. Spring4.x(7)---对象的生命周期方法
  9. maven profile多环境动态配置文件使用
  10. mysql主从表单如何设计_如何快速的10分钟制作一张主从表单及功能
  11. ssh 两个mysql数据库_SSH下,关于多数据库的两个问题
  12. 下载excel 导入模板
  13. Latex添加矢量图/将visio画图转换成矢量图
  14. 什么是城市大数据?大数据如何应用在智慧城市中?
  15. H264解码过滤花屏视频帧
  16. 如何使用Win10原生的截图工具Snipping Tool?
  17. 联通手机卡网速的修改
  18. win7怎么重置计算机,win7系统怎么重置网络?win7重置网络到初始状态的方法
  19. Android根build.gradle中buildscript和allprojects的作用和区别是什么
  20. 实验十三:配置STP、RSTP以及负载均衡(生成树负载均衡)

热门文章

  1. 技术图文:如何利用BigOne的API制作自动化交易系统--网格交易法
  2. RemObjects Elements多用途软件开发工具链
  3. mysql设计体会_数据库设计心得体会
  4. 全文索引JAVA_全文索引Sphinx和sphinx的中文分词
  5. 计算机网flags,计算机网络原理实验_使用网络协议分析仪Wireshark
  6. fastadmin 常用操作
  7. 四面体内接圆圆心坐标计算模板
  8. 杨幂 AI 换脸:你上传的照片,正在出卖你!
  9. python快速实现2048小游戏
  10. grads中画站点图