连接视频
创建GameWin类
public class GameWin extends JFrame {public void launch(){//设置窗口是否可见this.setVisible(true);//设置窗口大小this.setSize(600,600);//设置窗口位置this.setLocationRelativeTo(null);//设置窗口标题this.setTitle("飞机大战");this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//不可修改边框this.setResizable(false);}public static void main(String[] args) {GameWin gameWin = new GameWin();gameWin.launch();}
}
先导入图片在项目下img文件下
创建GameUtils类
public class GameUtils {//背景图片public static Image bgImage = Toolkit.getDefaultToolkit().getImage("img/bg.jpg");
}
在GameWin类重写paint方法
@Override
public void paint(Graphics g) {g.drawImage(GameUtils.bgImage,0,0,null);
}
在GameUtils类添加参数
//boss图片
public static Image bossImage = Toolkit.getDefaultToolkit().getImage("img/boss.png");
//爆炸图片
public static Image explodeImage = Toolkit.getDefaultToolkit().getImage("img/explode/e6.gif");
在GameWin类添加状态
//游戏状态 0 未开始 1 游戏中 2 暂停 3 通关失败 4 通关成功
public static int state = 0;@Override
public void paint(Graphics g) {if(state == 0){g.drawImage(GameUtils.bgImage,0,0,null);g.drawImage(GameUtils.bossImage,220,120,null);g.drawImage(GameUtils.explodeImage,270,350,null);g.setColor(Color.yellow);g.setFont(new Font("仿宋",Font.BOLD,40));g.drawString("点击开始游戏",180,300);}
}
在GameWin类launch方法添加鼠标点击事件
public void launch(){...//鼠标点击事件this.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {if(e.getButton() == 1 && state == 0){//鼠标左键点击state = 1;repaint();}}});}@Override
public void paint(Graphics g) {...if(state == 1){g.drawImage(GameUtils.bgImage,0,0,null);g.drawImage(GameUtils.bossImage,220,120,null);g.drawImage(GameUtils.explodeImage,270,350,null);g.setColor(Color.yellow);g.setFont(new Font("仿宋",Font.BOLD,40));g.drawString("游戏开始了",180,300);}
}
创建GameObj类
public class GameObj {Image img;//坐标int x,y;//宽高int wight,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 wight, int height, double speed, GameWin frame) {this.img = img;this.x = x;this.y = y;this.wight = wight;this.height = height;this.speed = speed;this.frame = frame;}//绘制自身方法public void paintSelf(Graphics g){g.drawImage(img,x,y,null);}//获取矩形对象,用于碰撞检测public Rectangle getRec(){return new Rectangle(x,y,wight,height);}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 getWight() { return wight; }public void setWight(int wight) { this.wight = wight; }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 getGameWin() { return frame; }public void setGameWin(GameWin frame) { this.frame = frame; }
}
创建BgObj类
public class BgObj extends GameObj{@Overridepublic Image getImg() {return super.getImg();}public BgObj(){}public BgObj(Image img, int x, int y, double speed) {super(img, x, y, speed);}@Overridepublic void paintSelf(Graphics g) {super.paintSelf(g);y += speed;}
}
在GameWin类中引用
//背景图片
BgObj bgObj = new BgObj(GameUtils.bgImage,0,-2000,2);public void launch(){...while (true){repaint();try {Thread.sleep(25);} catch (InterruptedException e) {e.printStackTrace();}}}@Override
public void paint(Graphics g) {...if(state == 1){bgObj.paintSelf(g);}
}
在GameWin类添加参数
Image offScreenImage = null;
//宽高
int width = 600;
int height = 600;public void launch(){//设置窗口是否可见this.setVisible(true);//设置窗口大小...
}@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.bgImage,220,120,null);gImage.drawImage(GameUtils.bossImage,220,120,null);gImage.drawImage(GameUtils.explodeImage,270,350,null);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,width,height,null);
}
在BgObj类修改paintSelf方法
@Override
public void paintSelf(Graphics g) {super.paintSelf(g);y += speed;if(y >= 0){y = -2000;}
}
在GameUtils类添加常量
//我方战斗机图片
public static Image planeImg = Toolkit.getDefaultToolkit().getImage("img/plane.png");
创建PlaneObj类
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.addMouseMotionListener(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();}
}
在GameWin中引用
//我方飞机对象
public PlaneObj planeObj = new PlaneObj(GameUtils.planeImg,290,550,20,30,0,this);@Override
public void paint(Graphics g) {...if(state == 1){//游戏中bgObj.paintSelf(gImage);planeObj.paintSelf(gImage);}g.drawImage(offScreenImage,0,0,width,height,null);
}
在GameUtils类添加常量
//我方子弹图片
public static Image shellImg = Toolkit.getDefaultToolkit().getImage("img/shell.png");
创建ShellObj类
public class ShellObj extends GameObj{@Overridepublic Image getImg() {return super.getImg();}public ShellObj() {super();}public ShellObj(Image img, int x, int y, int wight, int height, double speed, GameWin gameWin) {super(img, x, y, wight, height, speed, gameWin);}@Overridepublic void paintSelf(Graphics g) {super.paintSelf(g);y -= speed;}@Overridepublic Rectangle getRec() {return super.getRec();}
}
在GameWin类中引用
//我方子弹
ShellObj shellObj = new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this);@Override
public void paint(Graphics g) {...if(state == 1){//游戏中bgObj.paintSelf(gImage);planeObj.paintSelf(gImage);shellObj.paintSelf(gImage);}g.drawImage(offScreenImage,0,0,width,height,null);
}
在GameUtils类添加参数
//所有游戏物体的集合
public static List gameObjList = new ArrayList<>();
//我方子弹的集合
public static List shellObjList = new ArrayList<>();
在GameWin类中生成子弹
// //我方子弹
// ShellObj shellObj = new ShellObj(GameUtils.shellImg,planeObj.getX()+3,planeObj.getY()-16,14,29,5,this);
//游戏的重绘次数
int count = 1;public void launch() {...//设置窗口标题this.setTitle("飞机大战");GameUtils.gameObjList.add(bgObj);GameUtils.gameObjList.add(planeObj);while (true) {if (state == 1) {createObj();repaint();}try {Thread.sleep(25);} catch (InterruptedException e) {e.printStackTrace();}}
}@Override
public void paint(Graphics g) {...if (state == 1) {//游戏中for (int i = 0; i < GameUtils.gameObjList.size(); i++) {GameUtils.gameObjList.get(i).paintSelf(gImage);}}g.drawImage(offScreenImage, 0, 0, width, height, 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));GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));}
}
在GameUtils类添加参数
//敌机图片
public static Image enemyImg = Toolkit.getDefaultToolkit().getImage("img/enemy.png");
//敌机的集合
public static List enemyObjList = new ArrayList<>();
创建EnemyObj类
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();}
}
在GameWin类中创建
//创建对象
void createObj() {//我方子弹if (count%15 == 0) {GameUtils.shellObjList.add(new ShellObj(GameUtils.shellImg, planeObj.getX() + 3, planeObj.getY() - 16, 14, 29, 5, this));GameUtils.gameObjList.add(GameUtils.shellObjList.get(GameUtils.shellObjList.size()-1));}//敌机创建if (count%15 == 0) {GameUtils.enemyObjList.add(new EnemyObj(GameUtils.enemyImg, (int)(Math.random()*12)*50,0,49,36,5,this));GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size()-1));}
}
在EnemyObj类paintSelf方法添加判断
@Override
public void paintSelf(Graphics gImage) {super.paintSelf(gImage);y += speed;//碰撞检测for (ShellObj shellObj : GameUtils.shellObjList) {if(this.getRec().intersects(shellObj.getRec())){System.out.println("碰撞了");}}
}
在GameUtils类添加参数
//要删除元素的集合
public static List removeList = new ArrayList<>();
在EnemyObj类修改paintSelf方法
@Override
public void paintSelf(Graphics gImage) {super.paintSelf(gImage);y += speed;//碰撞检测for (ShellObj shellObj : GameUtils.shellObjList) {if(this.getRec().intersects(shellObj.getRec())){shellObj.setX(-100);shellObj.setY(-100);this.x = -200;this.y = -200;GameUtils.removeList.add(shellObj);GameUtils.removeList.add(this);}}
}
在GameWin类修改paint方法
@Override
public void paint(Graphics g) {...if (state == 1) {//游戏中for (int i = 0; i < GameUtils.gameObjList.size(); i++) {GameUtils.gameObjList.get(i).paintSelf(gImage);}GameUtils.gameObjList.removeAll(GameUtils.removeList);}g.drawImage(offScreenImage, 0, 0, width, height, null);count++;
}
在EnemyObj类修改paintSelf方法
@Override
public void paintSelf(Graphics gImage) {super.paintSelf(gImage);y += speed;//敌我飞机碰撞检测if(this.getRec().intersects(this.frame.planeObj.getRec())){GameWin.state = 3;}...
}
在GameWin类修改paint方法
@Override
public void paint(Graphics g) {...if (state == 3) {//失败gImage.drawImage(GameUtils.explodeImage, planeObj.getX()-33,planeObj.getY()-50, null);gImage.setColor(Color.red);gImage.setFont(new Font("仿宋", Font.BOLD, 50));gImage.drawString("GAME OVER", 180, 300);}g.drawImage(offScreenImage, 0, 0, width, height, null);count++;
}
创建BossObj类
public class BossObj extends GameObj {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;}@Overridepublic Rectangle getRec() {return super.getRec();}
}
在GameWin类中引用
//敌方boss对象
public BossObj bossObj = new BossObj(GameUtils.bossImage,250,35,155,100,5,this);public void launch() {...this.setTitle("飞机大战");GameUtils.gameObjList.add(bgObj);GameUtils.gameObjList.add(planeObj);GameUtils.gameObjList.add(bossObj);...}
创建BulletObj类
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;}@Overridepublic Rectangle getRec() {return super.getRec();}
}
在GameUtils类中添加参数
//敌机子弹图片
public static Image bulletImg = Toolkit.getDefaultToolkit().getImage("img/bullet.png");//敌机子弹的集合
public static List bulletObjList = new ArrayList<>();
在GameWin生成子弹
//创建对象
void createObj() {...//敌机子弹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));}
}
在BulletObj类paintSelf方法添加判断
@Override
public void paintSelf(Graphics gImage) {super.paintSelf(gImage);y += speed;//敌方子弹与我方飞机的碰撞检测if (this.getRec().intersects(this.frame.planeObj.getRec())){GameWin.state = 3;}
}
在PlaneObj类paintSelf方法添加判断
@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;}
}
在GameUtils类添加方法
//绘制字符串的工具类
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);
}
在GameWin类添加参数
//游戏得分public static int score = 0;@Override
public void paint(Graphics g) {。。。if (state == 0) {//未开始gImage.drawImage(GameUtils.bgImage, 220, 120, null);gImage.drawImage(GameUtils.bossImage, 220, 120, null);gImage.drawImage(GameUtils.explodeImage, 270, 350, null);gImage.setColor(Color.yellow);GameUtils.drawWord(gImage,"点击开始游戏",Color.yellow,40,180,300);}if (state == 1) {//游戏中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.explodeImage, planeObj.getX()-33,planeObj.getY()-50, null);GameUtils.drawWord(gImage,"GAME OVER",Color.RED,50,180,300);}GameUtils.drawWord(gImage,score+" 分",Color.green,40,30,100);g.drawImage(offScreenImage, 0, 0, width, height, null);count++;
}
在EnemyObj类paintSelf方法自增
@Override
public void paintSelf(Graphics gImage) {...//碰撞检测for (ShellObj shellObj : GameUtils.shellObjList) {if(this.getRec().intersects(shellObj.getRec())){shellObj.setX(-100);shellObj.setY(-100);this.x = -200;this.y = -200;GameUtils.removeList.add(shellObj);GameUtils.removeList.add(this);GameWin.score++;}}
}
在GameWin类添加参数
//敌方boss对象
public BossObj bossObj = null;//敌机出现的数量
int enemyCount = 0;public void launch() {...GameUtils.gameObjList.add(bgObj);GameUtils.gameObjList.add(planeObj);//GameUtils.gameObjList.add(bossObj);...}//创建对象
void createObj() {//敌机子弹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 (count%15 == 0) {GameUtils.enemyObjList.add(new EnemyObj(GameUtils.enemyImg, (int)(Math.random()*12)*50,0,49,36,5,this));GameUtils.gameObjList.add(GameUtils.enemyObjList.get(GameUtils.enemyObjList.size()-1));enemyCount++;}...if(enemyCount > 100 && bossObj == null){bossObj = new BossObj(GameUtils.bossImage,250,35,155,100,5,this);GameUtils.gameObjList.add(bossObj);}
}
在BossObj类添加参数判断
//boos生命值
int life = 10;@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);GameUtils.removeList.add(shellObj);life--;}if (life <= 0){GameWin.state = 4;}}
}
在GameWin类添加游戏通关绘制
@Override
public void paint(Graphics g) {...if (state == 4) {//通关gImage.drawImage(GameUtils.explodeImage, bossObj.getX() + 30,bossObj.getY(), null);GameUtils.drawWord(gImage,"游戏通关",Color.green,50,190,300);}GameUtils.drawWord(gImage,score+" 分",Color.green,40,30,100);g.drawImage(offScreenImage, 0, 0, width, height, null);count++;
}
在GameWin类中launch方法添加键盘监听事件
public void launch() {...//键盘监听事件this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_SPACE) {switch (state){case 1:state = 2;break;case 2:state = 1;break;default:}}}});...
}
在ShellObj添加判断
@Override
public void paintSelf(Graphics g) {super.paintSelf(g);y -= speed;//我方子弹的越界消失 条件 y < 0 改变后的坐标 (-100,100)if (y < 0){this.x = -100;this.y = 100;GameUtils.removeList.add(this);}
}
在EnemyObj添加判断
@Override
public void paintSelf(Graphics gImage) {...//敌机的越界消失 判断条件 y > 600 改变后的坐标(-200,-200)if (y > 600){this.x = -200;this.y = 200;GameUtils.removeList.add(this);}...
}
在BulletObj添加判断
@Override
public void paintSelf(Graphics gImage) {...//敌方子弹的越界消失 条件 y > 600 改变后的坐标(-300,300)if (y > 600){this.x = -300;this.y = 300;GameUtils.removeList.add(this);}
}
在GameWin类添加测试控制台输出
@Override
public void paint(Graphics g) {...count++;System.out.println(GameUtils.gameObjList.size());
}
在GameObj类添加构造器
public GameObj(int x, int y) {this.x = x;this.y = y;
}
创建ExplodeObj类
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("img/explode/e"+(i+1)+".gif");}}public ExplodeObj(int x, int y) {super(x, y);}@Overridepublic void paintSelf(Graphics gImage) {if (explodeCount < 16){super.img = pic[explodeCount];super.paintSelf(gImage);explodeCount++;}}
}
在GameUtils添加参数
//爆炸的集合
public static List explodeObjList = new ArrayList<>();
在EnemyObj类添加判断
@Override
public void paintSelf(Graphics gImage) {...//碰撞检测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++;}}
}
在GameWin类添加
@Override
public void paint(Graphics g) {...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);}...
}
在BossObj类的paintSelf方法添加绘制
@Override
public void paintSelf(Graphics gImage) {...//血条的白色背景gImage.setColor(Color.white);gImage.fillRect(20,40,100,10);//血条的绘制gImage.setColor(Color.red);gImage.fillRect(20,40,life * 100 / 10,10);
}