所有包和类

GameFrame类
package newKingOfHonor;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GameFrame extends JFrame {
// 游戏开始 0, 游戏胜利1,游戏失败2
int state = 0;
// 窗口尺寸
final int windowWidth = 1400;
final int windowHeight = 700;
// 双缓冲图片
private Image offScreenImage = null;
// 攻击图片
private Image attack = Toolkit.getDefaultToolkit().getImage("img/王者荣耀图片/attack.jpg");
//游戏胜利失败图片
private Image gameWin = Toolkit.getDefaultToolkit().getImage("img/王者荣耀图片/gameWin.png");
private Image gameLose = Toolkit.getDefaultToolkit().getImage("img/王者荣耀图片/gameLose.png");
// 游戏背景
Background background = new Background(this);
// 游戏玩家
Champion player = new ChampionDaji(this);
// 双方小兵
MinionBlue mb = new MinionBlue(this);
MinionRed mr = new MinionRed(this);
//野怪
public Beast beast = new Beast(this);
// 防御塔
Turret turret = new Turret(this);
// 游戏元素列表
public ArrayList objList = new ArrayList();
ArrayList redList = new ArrayList();// 红色方
ArrayList blueList = new ArrayList();// 蓝色方
public ArrayList removeList = new ArrayList();// 存放将要删除的元素
public void launch() {
// 设置尺寸
setSize(windowWidth, windowHeight);
// 窗口居中
setLocationRelativeTo(null);
// 关闭事件
setDefaultCloseOperation(3);
// 用户不能调整窗口大小
setResizable(false);
// 标题
setTitle("王者荣耀");
// 窗口可见
setVisible(true);
// 添加键盘监视器
this.addKeyListener(new GameFrame.KeyMonitor());
// 添加游戏元素
objList.add(background);
objList.add(player);
objList.addAll(beast.beastList);
objList.addAll(turret.turretList);
for (int i = 0; i
GameObject类
package newKingOfHonor;
import java.awt.*;
import java.util.ArrayList;
//游戏元素的父类
public abstract class GameObject {
// 坐标
private int x;
private int y;
// 图片
private Image img;
// 游戏界面
public GameFrame gameFrame;
// 速度
private int spd;
// 初始生命值
private int hp;
// 当前生命值
private int currentHp;
// 攻击目标
private GameObject target;
// 是否有目标
private boolean hasTarget = false;
// 攻击距离
private int dis;
// 攻击时间间隔
private int attackCoolDownTime;
// 攻击是否冷却
private boolean attackCoolDown = true;
// 是否存活
private boolean alive = true;
//是否被控制
boolean beControlled = false;
public GameObject(GameFrame gameFrame) {
this.gameFrame = gameFrame;
}
public GameObject(int x, int y, GameFrame gameFrame) {
this.x = x;
this.y = y;
this.gameFrame = gameFrame;
}
public GameObject() {
}
public void addHp(Graphics g, int difX, int difY, int width, int height, Color color) {
// 绘制外部轮廓
g.setColor(Color.black);
g.drawRect(getX() - difX, getY() - difY, width, height);
// 填充矩形
g.setColor(color);
g.fillRect(getX() - difX, getY() - difY, (int) (width * getCurrentHp() / getHp()), height);
}
public double getDis(int x1, int y1, int x2, int y2) {
return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
}
// 矩形矩形碰撞检测
public boolean recIntersectsRec(Rectangle r1, Rectangle r2) {
return r1.intersects(r2);
}
public boolean recIntersectsCir(Rectangle rec, int x, int y, int r) {
// 矩形于圆相交: 圆心到至少一个矩形定点的距离小于r
if ((getDis(x, y, rec.x, rec.y)
Turret类
package newKingOfHonor;
import java.awt.*;
import java.util.ArrayList;
//防御塔类
public class Turret extends GameObject{
ArrayList turretList = new ArrayList();
public Turret turretBlueOne;
public Turret turretBlueTwo;
public Turret turretBlueThree;
public Turret turretBlueBase;
public Turret turretRedOne;
public Turret turretRedTwo;
public Turret turretRedThree;
public Turret turretRedBase;
public Turret(GameFrame gameFrame) {
super(gameFrame);
setImg("img/王者荣耀图片/turret.png");
// 初始化八个防御塔
turretList.add(turretBlueOne = new TurretBlue(1860, 3790, gameFrame));
turretList.add(turretBlueTwo = new TurretBlue(2650, 3820, gameFrame));
turretList.add(turretBlueThree = new TurretBlue(3995, 3830, gameFrame));
turretList.add(turretBlueBase = new TurretBlue(1130, 3650, gameFrame));
turretList.add(turretRedOne = new TurretRed(5100, 3030, gameFrame));
turretList.add(turretRedTwo = new TurretRed(5120, 2100, gameFrame));
turretList.add(turretRedThree = new TurretRed(5060, 1570, gameFrame));
turretList.add(turretRedBase = new TurretRed(4850, 1100, gameFrame));
}
public Turret(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setImg("img/王者荣耀图片/turret.png");
setHp(6000);
setCurrentHp(getHp());
setAttackCoolDownTime(1000);
setDis(300);
}
public void isLive(){
if(gameFrame.turret.turretBlueBase.getCurrentHp()==0){
gameFrame.state=2;
}
if(gameFrame.turret.turretRedBase.getCurrentHp()==0){
gameFrame.state=1;
}
}
@Override
public void paintSelf(Graphics g) {
// 生命值为0
if (getCurrentHp() 0) {
Thread.sleep(1000);
System.out.println("二技能冷却时间: " + two / 1000);
two -= 1000;
}
} catch (Exception e) {
e.printStackTrace();
}
// 将技能二设置为攻击状态
coolDownTwo = true;
// 线程终止
this.interrupt();
}
}
// 技能二控制时间
class AbilityControllCD extends Thread {
public void run() {
abilityTwoTarget.beControlled = true;
// 线程休眠
try {
Thread.sleep(20000);
} catch (Exception e) {
e.printStackTrace();
}
abilityTwoTarget.beControlled = false;
this.interrupt();
}
}
//技能三冷却状态
class AbilityThreeCD extends Thread {
public void run() {
// 将攻击功能设置为冷却状态
coolDownThree = false;
// 休眠
try {
int three = coolDownTimeThree;
while (coolDownTimeThree > 0) {
Thread.sleep(1000);
System.out.println("技能三冷却时间: " + coolDownTimeThree / 1000);
coolDownTimeThree -= 1000;
}
coolDownTimeThree = three;
} catch (Exception e) {
e.printStackTrace();
}
// 将攻击功能解除冷却状态
coolDownThree = true;
// 线程终止
this.interrupt();
}
}
class AbilityThreeBulletCD extends Thread {
public void run() {
// 休眠
try {
System.out.println("Thread start");
gameFrame.objList.add(bulletList[0]);
Thread.sleep(100);
gameFrame.objList.add(bulletList[1]);
Thread.sleep(100);
gameFrame.objList.add(bulletList[2]);
Thread.sleep(100);
gameFrame.objList.add(bulletList[3]);
Thread.sleep(100);
gameFrame.objList.add(bulletList[4]);
} catch (Exception e) {
e.printStackTrace();
}
// 线程终止
this.interrupt();
}
}
// 鼠标监视器
private class MouseMonitor extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {// 当鼠标点击时
int mouseX = e.getX(), mouseY = e.getY(), playerX = 700, playerY = 350;
double dis = getDis(mouseX, mouseY, playerX, playerY);
// 三角函数
cos = (mouseX - playerX) / dis;
sin = -(mouseY - playerY) / dis;
// 坐标差
int difX = (int) (60 * sin);
int difY = (int) (60 * cos);
p.addPoint(getX() - difX, getY() - difY);
p.addPoint(getX() + difX, getY() + difY);
p.addPoint(getX() + difX + (int) (20 * cos), getY() + difY - (int) (20 * sin));
p.addPoint(getX() - difX + (int) (20 * cos), getY() - difY - (int) (20 * sin));
exit();
new AbilityOneCD().start();
ifAbilityOne = true;
}
}
}
Minion类
package newKingOfHonor;
import java.awt.*;
import java.util.ArrayList;
public abstract class Minion extends GameObject{
// 是否生成下一个小兵
private boolean nextMinion = true;
// 是否生成下一波小兵
private boolean nextLine = true;
// 生成小兵数量
private int minionCount = 0;
// 是否检测到目标
private boolean ifFindTarget = false;
public Minion(GameFrame gameFrame) {
super(gameFrame);
setHp(800);
setCurrentHp(getHp());
setDis(100);
setAttackCoolDownTime(2000);
}
/**
* (1325, 3750) (4425, 3750) (5050, 3125) (5050, 1125)
*/
public abstract void move(ArrayList objList);
public void findTarget(ArrayList objList) {
for (GameObject obj : objList) {
if (recIntersectsCir(obj.getRec(), getX(), getY(), 200)) {
setTarget(obj);
setIfFindTarget(true);
}
}
if (objList == gameFrame.blueList) {
if (recIntersectsCir(gameFrame.player.getRec(), getX(), getY(), 200)) {
setTarget(gameFrame.player);
setIfFindTarget(true);
}
}
}
public void moveToTarget() {
int dis = (int) getDis(getX(), getY(), getTarget().getX(), getTarget().getY());
if(dis!=0) {
int xSpeed = (getSpd() * (getTarget().getX() - getX()) / dis);
int ySpeed = (getSpd() * (getTarget().getY() - getY()) / dis);
setX(getX() + xSpeed);
setY(getY() + ySpeed);
}
}
public void createMinion(GameFrame gameFrame, ArrayList minionList) {
if (nextLine) {
if (nextMinion) {
// 蓝色方小兵
if (minionList == this.gameFrame.blueList) {
MinionBlue mb = new MinionBlue(gameFrame);
gameFrame.objList.add(mb);
minionList.add(mb);
}
// 红色方小兵
else {
MinionRed mr = new MinionRed(gameFrame);
gameFrame.objList.add(mr);
minionList.add(mr);
}
minionCount++;
new NextMinion().start();
}
if (minionCount == 3) {
minionCount = 0;
new NextLine().start();
}
}
}
// 每个小兵生成时间
class NextMinion extends Thread {
public void run() {
nextMinion = false;
// 休眠1.5s
try {
Thread.sleep(1500);
} catch (Exception e) {
e.printStackTrace();
}
nextMinion = true;
// 线程终止
this.interrupt();
}
}
// 每波小兵生成时间
class NextLine extends Thread {
public void run() {
nextLine = false;
// 休眠15s
try {
Thread.sleep(15000);
} catch (Exception e) {
e.printStackTrace();
}
nextLine = true;
// 线程终止
this.interrupt();
}
}
@Override
public void paintSelf(Graphics g) {
// 生命值为0
if (getCurrentHp() = 4425) {
setSpd(20);
setX(getX() + getSpd());
setY(getY() - getSpd());
}else if(getX() >= 4900) {
setSpd(18);
setY(getY() - getSpd());
}
}
}
}
MinionRed类
package newKingOfHonor;
import java.util.ArrayList;
public class MinionRed extends Minion {
public MinionRed(GameFrame gameFrame) {
super(gameFrame);
setImg("img/王者荣耀图片/minion/red.jpg");
setX(5050);
setY(1125);
}
@Override
public void move(ArrayList objList) {
if (isIfFindTarget()) {
// 离开检测范围
if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {
setIfFindTarget(false);
} else {
if (!isHasTarget()) {
moveToTarget();
}
attack(objList);
}
} else {
findTarget(objList);
// 原路线移动
if (getY() = 3125) {
setSpd(20);
setY(getY() + getSpd());
setX(getX() - getSpd());
} else if (getY() >= 3750) {
setSpd(25);
setX(getX() - getSpd());
}
}
}
}
Bullet类
package newKingOfHonor;
import java.awt.*;
//子弹类
public class Bullet extends GameObject {
//发射子弹的游戏元素
GameObject attacker;
//目标
GameObject target;
//攻击力
int ad;
public Bullet(GameFrame gameFrame, GameObject attacker, GameObject target, int ad, int spd) {
super(attacker.getX(), attacker.getY(), gameFrame);
this.attacker = attacker;
this.target = target;
setAd(ad);
setSpd(spd);
}
public Bullet(GameFrame gameFrame, GameObject attacker, GameObject target, int ad, int spd, string img) {
super(attacker.getX(), attacker.getY(), gameFrame);
this.attacker = attacker;
this.target = target;
setImg(img);
setAd(ad);
setSpd(spd);
}
public Bullet() {
super();
}
public void move() {
//子弹与目标碰撞,子弹消失,目标减血
if (recIntersectsRec(getRec(), target.getRec())) {
target.setCurrentHp(target.getCurrentHp() - getAd());
gameFrame.removeList.add(this);
}
int dis = (int) getDis(getX(), getY(), target.getX(), target.getY());
if (dis != 0) {
int xSpeed = (getSpd() * (target.getX() - getX()) / dis);
int ySpeed = (getSpd() * (target.getY() - getY()) / dis);
setX(getX() + xSpeed);
setY(getY() + ySpeed);
}
}
@Override
public void paintSelf(Graphics g) {
g.drawImage(getImg(), getX()-16, getY()-16, null);
g.setColor(Color.BLACK);
g.fillOval(getX()-5, getY()-5, 10, 10);
g.drawRect(getX()-5, getY()-5, 10, 10);
move();
}
@Override
public Rectangle getRec() {
return new Rectangle(getX()-5, getY()-5, 10, 10);
}
public int getAd() {
return ad;
}
public void setAd(int ad) {
this.ad = ad;
}
}
Background类
package newKingOfHonor;
import java.awt.*;
//背景类
public class Background extends GameObject{
public Background(GameFrame gameFrame) {
super(gameFrame);
}
Image bg = Toolkit.getDefaultToolkit().getImage("img/王者荣耀图片/Map.jpg");
public void paintSelf(Graphics g){
g.drawImage(bg,0,0,null);
}
@Override
public Rectangle getRec() {
return null;
}
}
Beast类
package newKingOfHonor;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
public class Beast extends GameObject {
public ArrayList beastList = new ArrayList();
int width;
int height;
// 复活的元素
Beast beast = null;
public Beast(GameFrame gameFrame) {
super(gameFrame);
beastList.add(new RedBuff(3045, 3170, gameFrame));
beastList.add(new Bear(2800, 2855, gameFrame));
beastList.add(new Bird(3570, 3380, gameFrame));
beastList.add(new Lizard(4585, 2365, gameFrame));
beastList.add(new BlueBuff(4025, 2295, gameFrame));
beastList.add(new Wolf(4235, 1945, gameFrame));
}
public Beast(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setHp(1000);
setCurrentHp(getHp());
beast = this;
}
@Override
public void paintSelf(Graphics g) {
if (getCurrentHp()