package com.langxikeji.PlaneWars;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class PlaneWars extends JPanel implements KeyListener {
/**
* @author poc999 笔记: 1、简单描述就是:迭代器遍历元素的时候,通过集合是不能修改元素的。 2、游戏暂停需要重新请求焦点。
* 3、每一判断碰撞之后需要跳出循环,继续回到上一次碰撞的地方判断
*/
private static final long serialVersionUID = 1L;
// 指定按键的初始状态
private boolean up, down, left, right, VK_Z, VK_X, VK_ENTER = false;
// 开始状态
private int state = START;
// 设置游戏的各种状态的值
private static int START = 0;
private static int RUNNING = 1;
private static int PAUSE = 2;
private static int GAME_OVER = 3;
// 时间初始化
private int time = 0;
// 背景的连续移动初始值
private int backgroundmove = 0;
// 记录英雄机的分数
private int score = 0;
// 设置游戏的关数的初始值
private int stage = 0;
// 导弹的初始数量
private int bomb = 10;
// 英雄机的初始血量
private int life = 20;
// 用于产生随机数,敌机的初始X坐标
Random r = new Random();
// 背景音乐,爆炸 导弹 子弹音效
private AudioClip bgmusic;
private AudioClip blastmusic;
private AudioClip bombmusic;
private AudioClip bulletmusic;
// 分数 炸弹 生命 关卡标签
private JLabel scorelabel;
private JLabel bomblabel;
private JLabel lifelabel;
private JLabel pointlabel;
// 使用集合保存所有对象
private Hero hero;
private Gift gift;
private List<Blast> blast = new ArrayList<>();
private List<Enemy1> enemy1 = new ArrayList<>();
private List<Enemy2> enemy2 = new ArrayList<>();
private List<Enemy3> enemy3 = new ArrayList<>();
private List<Enemybullet> enemybullet = new ArrayList<>();
private List<Herobullet> herobullet = new ArrayList<>();
public PlaneWars() {
URL u1 = PlaneWars.class.getResource("/bgmusic.wav");
URL u2 = PlaneWars.class.getResource("/blastmusic.wav");
URL u3 = PlaneWars.class.getResource("/Bomb.wav");
URL u4 = PlaneWars.class.getResource("/bulletmusic.wav");
bgmusic = Applet.newAudioClip(u1);
blastmusic = Applet.newAudioClip(u2);
bombmusic = Applet.newAudioClip(u3);
bulletmusic = Applet.newAudioClip(u4);
// 初始化面板
board();
// 使用线程
Thread game = new Thread() {
public void run() {
// 背景音乐的循环播放
bgmusic.loop();
while (true) {
/*
* 英雄机的移动,moving()方法需要写在外面。 因为刚开始需要控制键盘enter键。
* 使用到线程,使state变为RUNNING
*/
moving();
if (state == RUNNING && stage == 1) {
// 控制关卡的分数
if (score > 5000) {
stage = 2;
pointlabel.setText("第二关");
}
// 敌机的移动
enemymoving(time);
// 英雄机子弹的移动
herobulletmoving(time);
// 敌机子弹的移动
enemybulletmoving(time);
// 生成敌机
enemy(time);
// 生成敌机子弹
enemyfire(time);
// 英雄机子弹和敌机碰撞
collision(time);
// 敌机子弹和英雄机碰撞
crash(time);
// 礼物和英雄机的碰撞
giftcrash(time);
// 时间的递增
time += 40;
try {
Thread.sleep(40);
} catch (Exception e) {
e.printStackTrace();
}
}
// 第二关(把所有方法执行两次)
if (state == RUNNING && stage == 2) {
// 敌机的移动
enemymoving(time);
enemymoving(time);
// 英雄机子弹的移动
herobulletmoving(time);
herobulletmoving(time);
// 敌机子弹的移动
enemybulletmoving(time);
enemybulletmoving(time);
// 生成敌机
enemy(time);
enemy(time);
// 生成敌机子弹
enemyfire(time);
enemyfire(time);
// 英雄机子弹和敌机
collision(time);
collision(time);
// 敌机子弹和英雄机
crash(time);
crash(time);
// 礼物和英雄机的碰撞
giftcrash(time);
giftcrash(time);
// 时间的递增
time += 40;
try {
Thread.sleep(40);
} catch (Exception e) {
e.printStackTrace();
}
}
repaint();
}
}
// 飞机移动和操作
public void moving() {
if (up) {
hero.MoveUp();
}
if (down) {
hero.MoveDown();
}
if (left) {
hero.MoveLeft();
}
if (right) {
hero.MoveRight();
}
if (VK_Z && bomb > 0) {
// 播放爆炸音效
bombmusic.play();
bomb--;
// 全屏爆炸的效果
int l1 = enemy1.size();
int l2 = enemy2.size();
int l3 = enemy3.size();
for (int i = 0; i < l1; i++) {
for (int j = 0; j < l2; j++) {
for (int k = 0; k < l3; k++) {
Blast blast1 = new Blast(enemy1.get(i).x,
enemy1.get(i).y);
Blast blast2 = new Blast(enemy2.get(j).x,
enemy2.get(j).y);
Blast blast3 = new Blast(enemy3.get(k).x,
enemy3.get(k).y);
blast.add(blast1);
blast.add(blast2);
blast.add(blast3);
l1--;
l2--;
l3--;
break;
}
}
}
// 加上全屏敌机的分数
score += (1 * enemy1.size() + 2 * enemy2.size() + 3 * enemy3
.size());
// 敌机集合清空
enemy1.clear();
enemy2.clear();
enemy3.clear();
// 敌机子弹清空
enemybullet.clear();
scorelabel.setText("分数:" + score);
// 刷新显示炸弹数
bomblabel.setText("炸弹" + bomb);
}
if (VK_X) {
// 生成英雄机子弹对象
Herobullet herofire = hero.Herofire();
// 控制子弹的生成速度
if (time % 200 == 0) {
bulletmusic.play();
herobullet.add(herofire);
}
}
if (VK_ENTER) {
// 判断游戏的是否为初始状态
if (state == START && stage == 0) {
state = RUNNING;
stage = 1;
}
}
}
// 敌机和英雄子弹子弹碰撞的方法
public void collision(long time) {
// 英雄机子弹集合的长度
int l1 = herobullet.size();
// A敌机集合的长度
int l2 = enemy1.size();
// B敌机集合的长度
int l3 = enemy2.size();
// C敌机集合的长度
int l4 = enemy3.size();
// 遍历A敌机和子弹集合
for (int i = 0; i < l1; i++) {
for (int j = 0; j < l2; j++) {
if (Flyer.boom(herobullet.get(i), enemy1.get(j))) {
// 一旦碰撞就开始播放爆炸音效
blastmusic.play();
Herobullet hb = herobullet.get(i);
Blast blast4 = new Blast(hb.x, hb.y);
// 加入爆炸对象集合
blast.add(blast4);
// 一旦碰撞,移除当前位置的英雄机子弹和敌机
herobullet.remove(herobullet.get(i));
enemy1.remove(enemy1.get(j));
score += 20;
scorelabel.setText("分数:" + score);
// 创建爆炸图效果
// 敌机和子弹集合的长度分别减1
l1--;
l2--;
// 返回上一次当前位置继续监测
i--;
j--;
// 一旦碰撞,跳出循环
break;
}
}
}
// 遍历B敌机和子弹集合
for (int i = 0; i < l1; i++) {
for (int j = 0; j < l3; j++) {
// 如果碰撞
if (Flyer.boom(herobullet.get(i), enemy2.get(j))) {
// 一旦碰撞就开始播放爆炸音效
blastmusic.play();
// 创建爆炸图效果
Herobullet hb = herobullet.get(i);
Blast blast1 = new Blast(hb.x, hb.y);
// 加入爆炸对象集合
blast.add(blast1);
// 一旦碰撞,移除当前位置的英雄机子弹和敌机
herobullet.remove(herobullet.get(i
评论1