【java项目】飞机大战
文章目录
- 项目-飞机大战
- 窗口的创建
- 背景图片的添加/点击事件的启动
- 游戏物体父类的编写
- 背景的移动
- 双缓存技术--解决文字闪动
- 背景图片循环出现
- 我方战斗机的添加和鼠标控制
- 添加首颗子弹
- 批量添加子弹
- 敌方飞机的批量添加功能
- 我方子弹与敌方飞机的碰撞检测
- 我方子弹与敌方飞机碰撞时的处理
- 我方子弹与敌方飞机碰撞时碰撞坠毁
- 敌方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项目】飞机大战相关推荐
- 基于Java的飞机大战游戏的设计与实现论文
源码下载 http://www.byamd.xyz/hui-zong-1/ 摘 要 现如今,随着智能手机的兴起与普及,加上4G(the 4th Generation mobile communicat ...
- 基于Java的飞机大战游戏的设计与实现(含源文件)
欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于Java的飞机大战游戏的设计与实现 摘 要 现如今,随着智能手机的兴起与普及,加上4G( ...
- 【Java】Java基础飞机大战小游戏完整代码
Java基础飞机大战小游戏完整代码 先来展示一下代码实现结果图 主函数ShootGame 初始化游戏原始背景图片,游戏人物图片,游戏开始结束图片:构建产生敌人算法:产生英雄机算法:发射子弹算法:判断是 ...
- 毕业设计 基于Java的飞机大战游戏的设计与实现
文章目录 前言 一.项目设计 1. 模块设计 功能需求 游戏状态控制功能模块 游戏难度的调整模块 游戏界面绘画功能模块 玩家游戏控制功能模块 2. 实现效果 二.部分源码 项目源码 前言 今天学长向大 ...
- 基于Java的飞机大战游戏的设计与实现
项目介绍 飞机大战主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐.我方飞机可以随意移动,敌方飞机无规律出现.游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就 ...
- 基于Java的飞机大战游戏的设计与实现(论文+源码)
毕业设计(论文)任务书 第1页 毕业设计(论文)题目:基于Java的飞机大战游戏的设计与实现毕业设计(论文)要求及原始数据(资料):1.综述基于Java的飞机大战游戏的现状:2.深入了解Java的设计 ...
- 基于Java Swing 飞机大战游戏
一.项目概要: 基于Java Swing飞机大战游戏,打死飞机,可以随机出现加血包.子弹升级包.并支持根据游戏的分数,调整游戏难度. 二.界面展示: 三.主要代码: package com.maoxu ...
- java版飞机大战代码
java版飞机大战代码 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before ...
- VS/Qt C++ 入门项目飞机大战(内含全部源代码,素材,项目工程,项目祥解)可直接运行
零.说在前面 最近做了个qt/c++的小项目飞机大战,主要是边玩边做,主要讲解一下设计思路,各个模块的实现原理,非常适合初学者拿来练手.需要源码.素材.项目详解.打包软件等整个项目用到的全部内容,可以 ...
- JAVA实战项目飞机大战——手把手教你轻松学会
飞机大战是90后童年经典回忆游戏,紧张刺激的画面和操作感,令人回味无穷.只是大家可能不知道的是,这个经典游戏只是Java的入门项目而已.只要稍微有点基础,便可以轻松的制作出来.今天小编就来带大家用ja ...
最新文章
- CentOS7环境搭建使用PhpStorm上传代码
- 《Java多线程编程核心技术》读后感(七)
- Ansible管理节点过多导致的超时问题解决方法
- 比起第一代,《最后生还者2》到底做错了什么?
- 阿里云从0安装mysql到远程连接
- C++ 学习之旅(7)——指针pointer
- 工作67:el-table问题
- Spring4.x(7)---对象的生命周期方法
- maven profile多环境动态配置文件使用
- mysql主从表单如何设计_如何快速的10分钟制作一张主从表单及功能
- ssh 两个mysql数据库_SSH下,关于多数据库的两个问题
- 下载excel 导入模板
- Latex添加矢量图/将visio画图转换成矢量图
- 什么是城市大数据?大数据如何应用在智慧城市中?
- H264解码过滤花屏视频帧
- 如何使用Win10原生的截图工具Snipping Tool?
- 联通手机卡网速的修改
- win7怎么重置计算机,win7系统怎么重置网络?win7重置网络到初始状态的方法
- Android根build.gradle中buildscript和allprojects的作用和区别是什么
- 实验十三:配置STP、RSTP以及负载均衡(生成树负载均衡)