一.准备工作
首先创建一个新的Java项目命名为“王者荣耀”,并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。
创建一个名为“img”的文件夹来储存所需的图片素材。
二.代码呈现
package com.sxt;
import javax.swing.*;
import java.awt.*;
public class Background extends GameObject {
public Background(GameFrame gameFrame) {
super(gameFrame);
// TODO Auto-generated constructor stub
}
Image bg = Toolkit.getDefaultToolkit().getImage("img/Map.jpg");
public void paintSelf(Graphics g){
g.drawImage(bg,0,0,null);
}
@Override
public Rectangle getRec() {
// TODO Auto-generated method stub
return null;
}
}
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import com.sxt.beast.Beast;
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);
// TODO Auto-generated constructor stub
}
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);
// TODO Auto-generated constructor stub
}
public Bullet() {
super();
// TODO Auto-generated constructor stub
}
public void move() {
// 子弹与目标碰撞,子弹消失,目标减血
if (recIntersectsRec(getRec(), target.getRec())) {
if (Beast.class.isAssignableFrom(target.getClass())) {
target.setTarget(gameFrame.player);
target.setHasTarget(true);
}
target.setCurrentHp(target.getCurrentHp() - getAd());
gameFrame.removeList.add(this);
}
double dis = getDis(getX(), getY(), target.getX(), target.getY());
int xSpeed = (int) (getSpd() * (target.getX() - getX()) / dis);
int ySpeed = (int) (getSpd() * (target.getY() - getY()) / dis);
setX(getX() + xSpeed);
setY(getY() + ySpeed);
}
@Override
public void paintSelf(Graphics g) {
// TODO Auto-generated method stub
g.drawImage(getImg(), getX() - 16, getY() - 16, null);
if (this.getImg() == 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() {
// TODO Auto-generated method stub
return new Rectangle(getX() - 5, getY() - 5, 10, 10);
}
/**
* @return the ad
*/
public int getAd() {
return ad;
}
/**
* @param ad the ad to set
*/
public void setAd(int ad) {
this.ad = ad;
}
}
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JButton;
public abstract class Champion extends GameObject {
// 移动
public boolean up, down, left, right;
// 移动图集
static String[] imgs = new String[8];
// 第几张图片
int moveCount = 1;
//技能图片
Image abilityOne;
Image abilityTwo;
Image abilityThree;
//英雄头像
Image classical;
//技能冷却时间
int coolDownTimeOne;
int coolDownTimeTwo;
int coolDownTimeThree;
//三个技能是否处于冷却状态
boolean coolDownOne = true;
boolean coolDownTwo = true;
boolean coolDownThree = true;
//英雄列表
ArrayList<Champion> championList = new ArrayList<Champion>();
static {
for (int i = 1; i < 8; i++) {
imgs[i] = "img/" + i + ".png";
}
}
public Champion(GameFrame gameFrame, int x, int y) {
super(gameFrame);
setImg("img/stand.png");
setX(x);
setY(y);
setSpd(75);
setHp(24000);
setDis(250);
setAttackCoolDownTime(100);
setCurrentHp(getHp());
championList.add(new ChampionDaji(gameFrame));
championList.add(new ChampionHouyi(gameFrame));
}
public Champion(GameFrame gameFrame) {
// TODO Auto-generated constructor stub
super(gameFrame);
setImg("img/stand.png");
setX(700);
setY(3800);
setSpd(75);
setHp(24000);
setDis(250);
setAttackCoolDownTime(100);
setCurrentHp(getHp());
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_D) {
right = true;
}
if (key == KeyEvent.VK_A) {
left = true;
}
if (key == KeyEvent.VK_W) {
up = true;
}
if (key == KeyEvent.VK_S) {
down = true;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_D) {
right = false;
}
if (key == KeyEvent.VK_A) {
left = false;
}
if (key == KeyEvent.VK_W) {
up = false;
}
if (key == KeyEvent.VK_S) {
down = false;
}
}
public void move() {
if (up) {
setY(getY() - getSpd());
}
if (down) {
setY(getY() + getSpd());
}
if (left) {
setX(getX() - getSpd());
}
if (right) {
setX(getX() + getSpd());
}
if (up || down || left || right) {
setImg(imgs[moveCount]);
moveCount++;
if (moveCount == 8) {
moveCount = 1;
}
} else {
setImg("img/stand.png");
}
}
/**
* 添加三个技能按钮
* */
public void addButton() {
JButton button1 = new JButton();
button1.setSize(100, 100);
button1.setLocation(1056, 513);
button1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
abilityOne();
}
});
JButton button2 = new JButton();
button2.setSize(100, 100);
button2.setLocation(1090, 370);
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
abilityTwo();
}
});
JButton button3 = new JButton();
button3.setSize(100, 100);
button3.setLocation(1220, 300);
button3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
abilityThree();
}
});
gameFrame.add(button1);
gameFrame.add(button2);
gameFrame.add(button3);
}
public abstract void abilityOne();
public abstract void abilityTwo();
public abstract void abilityThree();
public abstract void abilityEffect(Graphics g);
@Override
public void paintSelf(Graphics g) {
// TODO Auto-generated method stub
// 生命值为0
if (getCurrentHp() <= 0) {
setAlive(false);
gameFrame.removeList.add(this);
} else {
// 添加生命值
addHp(g, 30, 80, 80, 20, Color.GREEN);
//绘制技能图片
g.drawImage(abilityOne, getX() + 360, getY() + 180, null);
g.drawImage(abilityTwo, getX() + 400, getY() + 40, null);
g.drawImage(abilityThree, getX() + 520, getY() - 30, null);
// 绘制图片
g.drawImage(this.getImg(), getX() - 33, getY() - 50, null);
// 改变画笔颜色
//g.setColor(Color.GREEN);
// 绘制中心圆点
//g.fillOval(getX(), getY(), 10, 10);
// 绘制矩形边框
//g.drawRect(getX() - 23, getY() - 50, 60, 120);
move();
abilityEffect(g);
}
}
@Override
public Rectangle getRec() {
// TODO Auto-generated method stub
return new Rectangle(getX() - 30, getY() - 60, 60, 120);
}
}
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Random;
import com.sxt.beast.Beast;
public class ChampionDaji extends Champion {
// 技能是否处于释放状态
boolean ifAbilityOne = false;
boolean ifAbilityTwo = false;
// 鼠标监视器
MouseMonitor m;
// 一技能多边形
Polygon p;
// 一技能三角函数
double sin;
double cos;
// 一技能已经攻击过的目标
ArrayList<GameObject> attacked;
// 一技能移动次数
int step = 0;
// 技能二目标
GameObject abilityTwoTarget;
// 技能二子弹
Bullet abilityTwoBullet;
// 三技能子弹列表
Bullet[] bulletList = { new Bullet(), new Bullet(), new Bullet(), new Bullet(), new Bullet() };
public ChampionDaji(GameFrame gameFrame) {
super(gameFrame);
abilityOne = Toolkit.getDefaultToolkit().getImage("img/abilityOne.jpg");
abilityTwo = Toolkit.getDefaultToolkit().getImage("img/abilityTwo.jpg");
abilityThree = Toolkit.getDefaultToolkit().getImage("img/abilityThree.jpg");
classical = Toolkit.getDefaultToolkit().getImage("img/Classical.jpg");
// 三个技能冷却时间
coolDownTimeOne = 6000;
coolDownTimeTwo = 8000;
coolDownTimeThree = 8000;
}
public void exit() {
this.gameFrame.removeMouseListener(m);
}
public void abilityOneMove() {
p.translate((int) (50 * cos), -(int) (50 * sin));
for (GameObject redObj : gameFrame.objList) {
// 是红色方小兵 && 发生碰撞 && 没在attacked列表里
if (redObj instanceof MinionRed && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {
// 小兵扣血,添加到attacked里
redObj.setCurrentHp(redObj.getCurrentHp() - 400);
attacked.add(redObj);
}else if (Beast.class.isAssignableFrom(redObj.getClass()) && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {
redObj.setCurrentHp(redObj.getCurrentHp() - 400);
attacked.add(redObj);
}
}
}
@Override
public void abilityOne() {
// TODO Auto-generated method stub
if (coolDownOne) {
m = new MouseMonitor();
p = new Polygon();
gameFrame.addMouseListener(m);
attacked = new ArrayList<GameObject>();
}
}
@Override
public void abilityTwo() {
// TODO Auto-generated method stub
if (coolDownTwo) {
boolean find = false;
for (GameObject redObj : gameFrame.objList) {
// 是红色小兵 && 距离小于250 && 存活
if ((redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass())) && recIntersectsCir(redObj.getRec(), getX(), getY(), 250)
&& redObj.isAlive()) {
// 添加子弹
abilityTwoBullet = new Bullet(gameFrame, this, redObj, 250, 60, "img/abilityTwoBullet.png");
gameFrame.objList.add(abilityTwoBullet);
// 给目标赋值
abilityTwoTarget = redObj;
// 释放二技能
ifAbilityTwo = true;
find = true;
break;
}
}
if (find) {
new AbilityTwoCD().start();
find = false;
}
}
}
/**
* 点击技能三释放技能 先将技能范围内目标储存到targetList里 提前定义五个子弹 技能释放时初始化五个子弹 子弹目标从targetList里随机选择
* 如果期间目标死亡,制作一个目标替身,生命值设置为true 子弹与目标或替身碰撞后消失
*/
@Override
public void abilityThree() {
// TODO Auto-generated method stub
// 三技能没在冷却状态
if (coolDownThree) {
// 创建列表来储存目标
ArrayList<GameObject> targetList = new ArrayList<GameObject>();
// 遍历redList
for (int i = 0; i < gameFrame.objList.size(); i++) {
GameObject target = gameFrame.objList.get(i);
// 是红色小兵 && 在技能范围里 && 存活
if ((target instanceof MinionRed || Beast.class.isAssignableFrom(target.getClass())) && recIntersectsCir(target.getRec(), getX(), getY(), 250)
&& target.isAlive()) {
targetList.add(target);
}
}
//找到目标
if(targetList.size() != 0) {
//初始化五个子弹,随机攻击列表里的目标
Random random = new Random();
int count = 0;
while(count < 5) {
int r = random.nextInt(targetList.size());
if(!targetList.get(r).isAlive()) {
//目标死亡,制作替身
GameObject substitute = targetList.get(r);
substitute.setAlive(true);
bulletList[count] = new Bullet(gameFrame, this, substitute, 250, 60, "img/abilityTwoBullet.png");
}else {
bulletList[count] = new Bullet(gameFrame, this, targetList.get(r), 250, 60, "img/abilityTwoBullet.png");
}
count++;
}
new AbilityThreeBulletCD().start();
new AbilityThreeCD().start();
}
}
}
@Override
public void abilityEffect(Graphics g) {
// TODO Auto-generated method stub
if (ifAbilityOne) {
g.setColor(Color.RED);
g.fillPolygon(p);
abilityOneMove();
step++;
if (step == 10) {
step = 0;
ifAbilityOne = false;
}
}
if (ifAbilityTwo) {
System.out.println(abilityTwoTarget.beControlled);
if (abilityTwoBullet.getRec().intersects(abilityTwoTarget.getRec())) {
new AbilityControllCD().start();
ifAbilityTwo = false;
}
}
}
// 技能一冷却时间
class AbilityOneCD extends Thread {
public void run() {
// 将技能一设置为冷却状态
coolDownOne = false;
// 线程休眠
try {
// one来表示一技能冷却时间
int one = coolDownTimeOne;
while (one > 0) {
Thread.sleep(1000);
System.out.println("一技能冷却时间: " + one / 1000);
one -= 1000;
}
} catch (Exception e) {
e.printStackTrace();
}
// 将技能一设置为攻击状态
coolDownOne = true;
// 线程终止
this.stop();
}
}
// 技能二冷却时间
class AbilityTwoCD extends Thread {
public void run() {
// 将技能二设置为冷却状态
coolDownTwo = false;
// 线程休眠
try {
// one来表示二技能冷却时间
int two = coolDownTimeTwo;
while (two > 0) {
Thread.sleep(1000);
System.out.println("二技能冷却时间: " + two / 1000);
two -= 1000;
}
} catch (Exception e) {
e.printStackTrace();
}
// 将技能二设置为攻击状态
coolDownTwo = true;
// 线程终止
this.stop();
}
}
// 技能二控制时间
class AbilityControllCD extends Thread {
public void run() {
abilityTwoTarget.beControlled = true;
// 线程休眠
try {
Thread.sleep(20000);
} catch (Exception e) {
e.printStackTrace();
}
abilityTwoTarget.beControlled = false;
this.stop();
}
}
// 技能三冷却时间
class AbilityThreeCD extends Thread {
public void run() {
// 将技能三设置为冷却状态
coolDownThree = false;
// 线程休眠
try {
// three来表示三技能冷却时间
int three = coolDownTimeThree;
while (three > 0) {
Thread.sleep(1000);
System.out.println("三技能冷却时间: " + three / 1000);
three -= 1000;
}
} catch (Exception e) {
e.printStackTrace();
}
// 将技能三设置为攻击状态
coolDownThree = true;
// 线程终止
this.stop();
}
}
//技能三子弹时间间隔
class AbilityThreeBulletCD extends Thread{
public void run() {
try {
gameFrame.objList.add(bulletList[0]);
Thread.sleep(200);
gameFrame.objList.add(bulletList[1]);
Thread.sleep(200);
gameFrame.objList.add(bulletList[2]);
Thread.sleep(200);
gameFrame.objList.add(bulletList[3]);
Thread.sleep(200);
gameFrame.objList.add(bulletList[4]);
}catch(Exception e) {
e.printStackTrace();
}
this.stop();
}
}
// 鼠标监视器
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;
}
}
}
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import com.sxt.beast.Beast;
public class ChampionHouyi extends Champion {
// 技能是否处于释放状态
boolean ifAbilityThree = false;
boolean ifAbilityTwo = false;
// 鼠标监视器
MouseMonitor m;
MouseMonitorTwo m2;
// 三技能多边形
Polygon p;
// 三技能三角函数
double sin;
double cos;
// 三技能命中的目标
GameObject abilityThreeTarget;
// 三技能是否出界
boolean ifXOutside;
boolean ifYOutside;
// 二技能位置
int X_AbilityTwo;
int Y_AbilityTwo;
public ChampionHouyi(GameFrame gameFrame) {
super(gameFrame);
abilityOne = Toolkit.getDefaultToolkit().getImage("img/HyabilityOne.jpg");
abilityTwo = Toolkit.getDefaultToolkit().getImage("img/HyabilityTwo.jpg");
abilityThree = Toolkit.getDefaultToolkit().getImage("img/HyabilityThree.jpg");
classical = Toolkit.getDefaultToolkit().getImage("img/后羿-辉光之辰.jpg");
// 三个技能冷却时间
coolDownTimeOne = 14000;
coolDownTimeTwo = 10000;
coolDownTimeThree = 28000;
// TODO Auto-generated constructor stub
}
public ChampionHouyi(GameFrame gameFrame, int i, int j) {
// TODO Auto-generated constructor stub
super(gameFrame, i, j);
}
public void exit(MouseAdapter ma) {
this.gameFrame.removeMouseListener(ma);
}
public void attack() {
if (isAttackCoolDown()) {
ArrayList<GameObject> targets = new ArrayList<GameObject>();// 目标列表,最多三个目标
for (GameObject redObj : this.gameFrame.redList) {
if (this.recIntersectsCir(redObj.getRec(), getX() - 250, getY() - 250, 500)) {
targets.add(redObj);
if (targets.size() == 3) {
break;
}
}
}
for (GameObject beastObj : this.gameFrame.beast.beastList) {
if (this.recIntersectsCir(beastObj.getRec(), getX() - 250, getY() - 250, 500)) {
targets.add(beastObj);
if (targets.size() == 3) {
break;
}
}
}
for (int i = 0; i < targets.size(); i++) {
Bullet bullet;
if (i == 0) {
bullet = new Bullet(gameFrame, this, targets.get(i), 400, 50, "img/bullet.gif");
} else {
bullet = new Bullet(gameFrame, this, targets.get(i), 200, 50, "img/bullet.gif");
}
gameFrame.objList.add(bullet);
}
new AttackCD().start();
}
}
public void abilityTwoAttack() {
for (GameObject redObj : this.gameFrame.objList) {
if (redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass())) {
if (this.recIntersectsCir(redObj.getRec(), X_AbilityTwo - 60, Y_AbilityTwo - 60, 120)) {
redObj.setCurrentHp(redObj.getCurrentHp() - 400);
}
if (this.recIntersectsCir(redObj.getRec(), X_AbilityTwo - 30, Y_AbilityTwo - 30, 60)) {
redObj.setCurrentHp(redObj.getCurrentHp() - 200);
}
}
}
}
public void abilityThreeMove() {
p.translate((int) (50 * cos), -(int) (50 * sin));
for (GameObject redObj : gameFrame.objList) {
// 是红色方小兵 && 发生碰撞
if ((redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass()))
&& p.intersects(redObj.getRec())) {
// 击中目标后,目标减血并眩晕,多边形消失
redObj.setCurrentHp(redObj.getCurrentHp() - 400);
abilityThreeTarget = redObj;
new AbilityControlCD().start();
ifAbilityThree = false;
new AbilityThreeCD().start();
}
}
if (!ifXOutside) {
for (int x : p.xpoints) {
if (x < 0 || x >= 5165) {
ifXOutside = true;
break;
}
}
}
if (!ifYOutside) {
for (int y : p.ypoints) {
if (y < 0 || y >= 4085) {
ifYOutside = true;
break;
}
}
}
}
/**
* 一技能 制作游戏界面攻击按钮的替身 替换攻击按钮 新的攻击按钮事件: 1. 定义目标列表 2. 添加目标,最多添加三个 3.
* 目标列表第一个造成400伤害,其余200伤害 4. 持续5秒,结束后替换攻击按钮️
*/
@Override
public void abilityOne() {
// TODO Auto-generated method stub
if (coolDownOne) {
new AbilityOneDuration().start();// 强化普攻持续时间
new AbilityOneCD().start();
}
}
/**
* 二技能 先点击按钮释放技能 再点击技能范围内任意位置 之后点击的位置会出现 两个大小不同的圆 在大圆内会受到300伤害 在小圆内受到额外200伤害
*/
@Override
public void abilityTwo() {
// TODO Auto-generated method stub
if (coolDownTwo) {
m2 = new MouseMonitorTwo();
gameFrame.addMouseListener(m2);
X_AbilityTwo = 0;
Y_AbilityTwo = 0;
}
}
@Override
public void abilityThree() {
// TODO Auto-generated method stub
if (coolDownThree) {
m = new MouseMonitor();
p = new Polygon();
gameFrame.addMouseListener(m);
ifAbilityThree = true;
ifXOutside = false;
ifYOutside = false;
}
}
@Override
public void abilityEffect(Graphics g) {
// TODO Auto-generated method stub
if (ifAbilityTwo) {
System.out.println("222");
g.setColor(Color.RED);
g.fillOval(X_AbilityTwo - 60, Y_AbilityTwo - 60, 120, 120);
g.setColor(Color.BLACK);
g.fillOval(X_AbilityTwo - 30, Y_AbilityTwo - 30, 60, 60);
abilityTwoAttack();
X_AbilityTwo = 0;
Y_AbilityTwo = 0;
ifAbilityTwo = false;
new AbilityTwoCD().start();
}
if (ifAbilityThree) {
System.out.println("333");
g.setColor(Color.RED);
g.fillPolygon(p);
abilityThreeMove();
// 如果出界,技能释放结束
if (ifXOutside || ifYOutside) {
ifAbilityThree = false;
p = new Polygon();
new AbilityThreeCD().start();
}
}
}
// 攻击冷却时间
class AttackCD extends Thread {
public void run() {
// 将攻击功能设置为冷却状态
setAttackCoolDown(false);
// 线程休眠
try {
Thread.sleep(getAttackCoolDownTime());
} catch (Exception e) {
e.printStackTrace();
}
// 将攻击功能设置为攻击状态
setAttackCoolDown(true);
// 线程终止
this.stop();
}
}
// 一技能冷却时间
class AbilityOneCD extends Thread {
public void run() {
// 将攻击功能设置为冷却状态
coolDownOne = false;
// 休眠
try {
// one用来储存冷却时间
int one = coolDownTimeOne;
while (coolDownTimeOne > 0) {
Thread.sleep(1000);
System.out.println("技能一冷却时间: " + coolDownTimeOne / 1000);
coolDownTimeOne -= 1000;
}
coolDownTimeOne = one;
} catch (Exception e) {
e.printStackTrace();
}
// 将攻击功能解除冷却状态
coolDownOne = true;
// 线程终止
this.stop();
}
}
// 技能一持续时间
class AbilityOneDuration extends Thread {
public void run() {
// 制作攻击按钮的替身
JButton substitute = gameFrame.attackButton;
gameFrame.remove(gameFrame.attackButton);
JButton button = new JButton();
button.setSize(130, 132);
button.setLocation(1150, 430);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取到的事件源就是按钮本身
attack();
}
});
gameFrame.add(button);
// 休眠
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
gameFrame.remove(button);
gameFrame.add(substitute);
// 线程终止
this.stop();
}
}
// 二技能冷却时间
class AbilityTwoCD extends Thread {
public void run() {
// 将二技能设置为冷却状态
coolDownTwo = false;
// 休眠
try {
int two = coolDownTimeTwo;
while (coolDownTimeTwo > 0) {
Thread.sleep(1000);
System.out.println("技能二冷却时间: " + coolDownTimeTwo / 1000);
coolDownTimeTwo -= 1000;
}
coolDownTimeTwo = two;
} catch (Exception e) {
e.printStackTrace();
}
// 将攻击功能解除冷却状态
coolDownTwo = true;
// 线程终止
this.stop();
}
}
// 技能三冷却时间
class AbilityThreeCD extends Thread {
public void run() {
// 将技能三设置为冷却状态
coolDownThree = false;
// 线程休眠
try {
// three来表示三技能冷却时间
int three = coolDownTimeThree;
while (three > 0) {
Thread.sleep(1000);
System.out.println("三技能冷却时间: " + three / 1000);
three -= 1000;
}
} catch (Exception e) {
e.printStackTrace();
}
// 将技能三设置为攻击状态
coolDownThree = true;
// 线程终止
this.stop();
}
}
// 技能三控制时间
class AbilityControlCD extends Thread {
public void run() {
abilityThreeTarget.beControlled = true;
// 线程休眠
try {
Thread.sleep(20000);
} catch (Exception e) {
e.printStackTrace();
}
abilityThreeTarget.beControlled = false;
this.stop();
}
}
// 鼠标监视器
private class MouseMonitorTwo extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {// 当鼠标点击时
System.out.println("pressed");
int mouseX = e.getX(), mouseY = e.getY(), playerX = 700, playerY = 350;
double dis = getDis(mouseX, mouseY, playerX, playerY);
if (dis < 250) {
X_AbilityTwo = e.getX() - playerX + getX();
Y_AbilityTwo = e.getY() - playerY + getY();
}
ifAbilityTwo = true;
exit(this);
}
}
// 鼠标监视器
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));
ifAbilityThree = true;
exit(this);
}
}
}
package com.sxt;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import com.sxt.beast.Beast;
public class GameFrame extends JFrame {
// 游戏模式 0 选择英雄,1 游戏开始,2 游戏胜利,3 游戏失败
int state = 0;
// 窗口尺寸
private int windowWidth = 1400;
private 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;
Champion champion = new ChampionHouyi(this,700,3800);
// 双方小兵
MinionBlue mb = new MinionBlue(this);
MinionRed mr = new MinionRed(this);
// 防御塔
Turret turret = new Turret(this);
//野怪
public Beast beast = new Beast(this);
// 攻击按钮
JButton attackButton;
// 游戏元素列表
public ArrayList<GameObject> objList = new ArrayList<GameObject>();
ArrayList<GameObject> redList = new ArrayList<GameObject>();// 红色方
ArrayList<GameObject> blueList = new ArrayList<GameObject>();// 蓝色方
public ArrayList<GameObject> removeList = new ArrayList<GameObject>();// 存放将要删除的元素
public void launch() {
// 设置尺寸
setSize(windowWidth, windowHeight);
// 窗口居中
setLocationRelativeTo(null);
// 关闭事件
setDefaultCloseOperation(3);
// 用户不能调整窗口大小
setResizable(false);
// 标题
setTitle("王者荣耀");
// 窗口可见
setVisible(true);
// 添加键盘监视器
this.addKeyListener(new GameFrame.KeyMonitor());
// 添加游戏元素
objList.add(background);
objList.addAll(turret.turretList);
objList.addAll(beast.beastList);
blueList.add(turret.turretList.get(0));
redList.add(turret.turretList.get(4));
/**
* 攻击按钮
*/
attackButton = new JButton();
attackButton.setSize(130, 132);
attackButton.setLocation(1150, 430);
attackButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 按钮事件
player.attack(redList);
}
});
this.add(attackButton);
while (true) {
if (state == 1) {
// 添加小兵
//mb.createMinion(this, blueList);
//mr.createMinion(this, redList);
// 添加防御塔
turret.addTurret();
}
repaint();
try {
Thread.sleep(17);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void paint(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(5984, 4452);
}
Graphics gImage = offScreenImage.getGraphics();
if (state == 0) {
for(int i = 0; i < champion.championList.size(); i++) {
//添加图片
Image classical = champion.championList.get(i).classical;
gImage.drawImage(classical, i*160, 20, null);
//添加按钮
JButton championButton = new JButton();
championButton.setSize(150, 150);
championButton.setLocation(i*150, 0);
int a = i;
championButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
state = 1;
player = champion.championList.get(a);
objList.add(player);
player.addButton();
}
});
this.add(championButton);
}
} else if (state == 1) {
for (int i = 0; i < objList.size(); i++) {
objList.get(i).paintSelf(gImage);
}
// 绘制攻击图片
gImage.drawImage(attack, player.getX() + 500, player.getY() + 100, null);
objList.removeAll(removeList);
} else if (state == 2) {//游戏胜利
gImage.drawImage(gameWin, 0, 5, null);
} else if (state == 3) {//游戏失败
gImage.drawImage(gameLose, 0, 5, null);
}
if (state != 1) {
g.drawImage(offScreenImage, 0, 0, null);
} else {
g.drawImage(offScreenImage, -player.getX() + 700, -player.getY() + 350, null);
}
/**
* 添加按钮后不能调用键盘事件 因为程序的焦点变成了按钮 this.requestFocus() 把焦点重新改变到游戏界面上
*/
this.requestFocus();
}
// main方法
public static void main(String[] args) {
GameFrame gameFrame = new GameFrame();
gameFrame.launch();
}
// 键盘事件
private class KeyMonitor extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
player.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
player.keyReleased(e);
}
}
}
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.util.ArrayList;
import com.sxt.beast.Beast;
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() {
// TODO Auto-generated constructor stub
}
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) < r) || (getDis(x, y, rec.x, rec.y + rec.height) < r)
|| (getDis(x, y, rec.x + rec.width, rec.y) < r)
|| (getDis(x, y, rec.x + rec.width, rec.y + rec.height) < r)) {
return true;
}
return false;
}
// 攻击方法
public void attack(ArrayList<GameObject> gameObjList) {
if (hasTarget) {
// 目标离开范围后寻找新的目标
if (!recIntersectsCir(target.getRec(), getX(), getY(), getDis())) {
setHasTarget(false);
}
// 目标死亡,寻找新目标
else if (!target.isAlive()) {
setHasTarget(false);
} else if (isAttackCoolDown() && isAlive()) {
Bullet bullet = null;
// 防御塔攻击
if (Turret.class.isAssignableFrom(getClass())) {
bullet = new Bullet(gameFrame, this, getTarget(), 500, 50);
}
// 小兵攻击
else if (Minion.class.isAssignableFrom(getClass())) {
bullet = new Bullet(gameFrame, this, getTarget(), 50, 30);
}
// 玩家攻击
else if (this instanceof Champion) {
bullet = new Bullet(gameFrame, this, getTarget(), 500, 50, "img/bullet.gif");
}
gameFrame.objList.add(bullet);
// 线程开始
new AttackCD().start();
}
} else {
// 遍历列表
for (GameObject obj : gameObjList) {
// 判断攻击范围(圆形)与敌方(矩形)是否相交
if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {
// 找到目标
setTarget(obj);
setHasTarget(true);
// 跳出循环
break;
}
}
// 玩家是否在攻击范围内
if (!hasTarget && gameObjList == gameFrame.blueList) {
if (recIntersectsCir(gameFrame.player.getRec(), getX(), getY(), getDis())) {
// 找到目标
setTarget(gameFrame.player);
setHasTarget(true);
}
} else {
for (GameObject obj : gameFrame.beast.beastList) {
// 判断攻击范围(圆形)与敌方(矩形)是否相交
if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {
// 找到目标
setTarget(obj);
setHasTarget(true);
// 跳出循环
break;
}
}
}
}
}
class AttackCD extends Thread {
public void run() {
// 将攻击功能设置为冷却状态
setAttackCoolDown(false);
// 线程休眠
try {
Thread.sleep(attackCoolDownTime);
} catch (Exception e) {
e.printStackTrace();
}
// 将攻击功能设置为攻击状态
setAttackCoolDown(true);
// 线程终止
this.stop();
}
}
// 绘制元素
public abstract void paintSelf(Graphics g);
// 返回矩形
public abstract Rectangle getRec();
/**
* @return the x
*/
public int getX() {
return x;
}
/**
* @param x the x to set
*/
public void setX(int x) {
this.x = x;
}
/**
* @return the y
*/
public int getY() {
return y;
}
/**
* @param y the y to set
*/
public void setY(int y) {
this.y = y;
}
/**
* @return the img
*/
public Image getImg() {
return img;
}
/**
* @param img the img to set
*/
public void setImg(String img) {
this.img = Toolkit.getDefaultToolkit().getImage(img);
}
/**
* @return the spd
*/
public int getSpd() {
return spd;
}
/**
* @param spd the spd to set
*/
public void setSpd(int spd) {
this.spd = spd;
}
/**
* @return the hp
*/
public int getHp() {
return hp;
}
/**
* @param hp the hp to set
*/
public void setHp(int hp) {
this.hp = hp;
}
/**
* @return the currentHp
*/
public int getCurrentHp() {
return currentHp;
}
/**
* @param currentHp the currentHp to set
*/
public void setCurrentHp(int currentHp) {
if (currentHp < getHp()) {
if (Beast.class.isAssignableFrom(getClass())) {
System.out.println("yes");
setTarget(gameFrame.player);
setHasTarget(true);
}
}
this.currentHp = currentHp;
}
/**
* @return the target
*/
public GameObject getTarget() {
return target;
}
/**
* @param target the target to set
*/
public void setTarget(GameObject target) {
this.target = target;
}
/**
* @return the hasTarget
*/
public boolean isHasTarget() {
return hasTarget;
}
/**
* @param hasTarget the hasTarget to set
*/
public void setHasTarget(boolean hasTarget) {
this.hasTarget = hasTarget;
}
/**
* @return the dis
*/
public int getDis() {
return dis;
}
/**
* @param dis the dis to set
*/
public void setDis(int dis) {
this.dis = dis;
}
/**
* @return the attackCoolDownTime
*/
public int getAttackCoolDownTime() {
return attackCoolDownTime;
}
/**
* @param attackCoolDownTime the attackCoolDownTime to set
*/
public void setAttackCoolDownTime(int attackCoolDownTime) {
this.attackCoolDownTime = attackCoolDownTime;
}
/**
* @return the attackCoolDown
*/
public boolean isAttackCoolDown() {
return attackCoolDown;
}
/**
* @param attackCoolDown the attackCoolDown to set
*/
public void setAttackCoolDown(boolean attackCoolDown) {
this.attackCoolDown = attackCoolDown;
}
/**
* @return the alive
*/
public boolean isAlive() {
return alive;
}
/**
* @param alive the alive to set
*/
public void setAlive(boolean alive) {
this.alive = alive;
}
}
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
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);
// TODO Auto-generated constructor stub
}
/**
* (1325, 3750) (4425, 3750) (5050, 3125) (5050, 1125)
*/
public abstract void move(ArrayList<GameObject> objList);
/**
* @param x: 下一步的横坐标
* @param y: 下一步的纵坐标
* @param objList: 小兵列表
* @return 下一步位置与其他小兵是否碰撞
*/
public boolean hitMinion(int x, int y, ArrayList<GameObject> objList) {
// 新的区域生成矩形
Rectangle r = new Rectangle(x - 16, y - 16, 45, 45);
for (GameObject obj : objList) {
// 相同类 && 不是自身
if (obj.getClass() == this.getClass() && obj != this) {
if (r.intersects(obj.getRec())) {
return true;
}
}
}
return false;
}
public void findTarget(ArrayList<GameObject> 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() {
double dis = getDis(getX(), getY(), getTarget().getX(), getTarget().getY());
int xSpeed = (int) (getSpd() * (getTarget().getX() - getX()) / dis);
int ySpeed = (int) (getSpd() * (getTarget().getY() - getY()) / dis);
if (!hitMinion(getX() + xSpeed, getY(), gameFrame.objList)) {
setX(getX() + xSpeed);
}
if (!hitMinion(getX(), getY() + ySpeed, gameFrame.objList)) {
setY(getY() + ySpeed);
}
}
public void createMinion(GameFrame gameFrame, ArrayList<GameObject> 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.stop();
}
}
// 每波小兵生成时间
class NextLine extends Thread {
public void run() {
nextLine = false;
// 休眠15s
try {
Thread.sleep(15000);
} catch (Exception e) {
e.printStackTrace();
}
nextLine = true;
// 线程终止
this.stop();
}
}
@Override
public void paintSelf(Graphics g) {
// TODO Auto-generated method stub
// 生命值为0
if (getCurrentHp() <= 0) {
setAlive(false);
gameFrame.removeList.add(this);
if (this instanceof MinionBlue) {
gameFrame.blueList.remove(this);
} else {
gameFrame.redList.remove(this);
}
} else {
// 添加生命值
if (this instanceof MinionBlue) {
this.addHp(g, 17, 28, 45, 10, Color.GREEN);
} else {
this.addHp(g, 17, 28, 45, 10, Color.RED);
}
g.drawImage(getImg(), getX() - 16, getY() - 16, null);
//绘制检测范围圆形
//g.setColor(Color.RED);
//g.fillOval(getX(), getY(), 10, 10);
//g.drawRect(getX() - 16, getY() - 16, 45, 45);
// 小兵移动
if (!beControlled) {
if (this instanceof MinionBlue) {
move(gameFrame.redList);
} else {
move(gameFrame.blueList);
}
}
}
}
@Override
public Rectangle getRec() {
// TODO Auto-generated method stub
return new Rectangle(getX() - 16, getY() - 16, 45, 45);
}
/**
* @return the ifFindTarget
*/
public boolean isIfFindTarget() {
return ifFindTarget;
}
/**
* @param ifFindTarget the ifFindTarget to set
*/
public void setIfFindTarget(boolean ifFindTarget) {
this.ifFindTarget = ifFindTarget;
}
}
package com.sxt;
import java.util.ArrayList;
public class MinionBlue extends Minion {
public MinionBlue(GameFrame gameFrame) {
super(gameFrame);
setImg("img/blue.jpg");
setX(1325);
setY(3750);
// TODO Auto-generated constructor stub
}
@Override
public void move(ArrayList<GameObject> objList) {
// TODO Auto-generated method stub
if (isIfFindTarget()) {
// 离开检测范围
if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {
setIfFindTarget(false);
} else {
if (!isHasTarget()) {
moveToTarget();
}
attack(objList);
}
} else {
findTarget(objList);
// 原路线移动
if (getX() < 4425) {
setSpd(25);
if (!hitMinion(getX() + getSpd(), getY(), gameFrame.blueList)) {
setX(getX() + getSpd());
}
} else if (getX() < 5100 && getX() >= 4425) {
setSpd(20);
if (!hitMinion(getX() + getSpd(), getY(), gameFrame.blueList)) {
setX(getX() + getSpd());
}
if (!hitMinion(getX(), getY() - getSpd(), gameFrame.blueList)) {
setY(getY() - getSpd());
}
} else if (getX() >= 4900) {
setSpd(18);
if (!hitMinion(getX(), getY() - getSpd(), gameFrame.blueList)) {
setY(getY() - getSpd());
}
}
}
}
}
package com.sxt;
import java.util.ArrayList;
public class MinionRed extends Minion {
public MinionRed(GameFrame gameFrame) {
super(gameFrame);
setImg("img/red.jpg");
setX(5050);
setY(1125);
// TODO Auto-generated constructor stub
}
@Override
public void move(ArrayList<GameObject> objList) {
// TODO Auto-generated method stub
if (isIfFindTarget()) {
// 离开检测范围
if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {
setIfFindTarget(false);
} else {
if (!isHasTarget()) {
moveToTarget();
}
attack(objList);
}
} else {
findTarget(objList);
// 原路线移动
if (getY() < 3125) {
setSpd(18);
if (!hitMinion(getX(), getY() + getSpd(), gameFrame.redList)) {
setY(getY() + getSpd());
}
} else if (getY() < 3750 && getY() >= 3125) {
setSpd(20);
if (!hitMinion(getX(), getY() + getSpd(), gameFrame.redList)) {
setY(getY() + getSpd());
}
if (!hitMinion(getX() - getSpd(), getY(), gameFrame.redList)) {
setX(getX() - getSpd());
}
} else if (getY() >= 3750) {
setSpd(25);
if (!hitMinion(getX() - getSpd(), getY(), gameFrame.redList)) {
setX(getX() - getSpd());
}
}
}
}
}
package com.sxt;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
public class Turret extends GameObject {
ArrayList<Turret> turretList = new ArrayList<Turret>();
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));
// TODO Auto-generated constructor stub
}
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 addTurret() {
/**
* 添加到objList里会被绘制出来,添加到redList和blueList才会被攻击 前一个防御塔爆炸后再把后一个添加到列表里
*/
if (!gameFrame.turret.turretBlueOne.isAlive() && gameFrame.turret.turretBlueTwo.isAlive()
&& gameFrame.blueList.indexOf(gameFrame.turret.turretBlueTwo) == -1) {
gameFrame.blueList.add(gameFrame.turret.turretBlueTwo);
}
if (!gameFrame.turret.turretBlueTwo.isAlive() && gameFrame.turret.turretBlueThree.isAlive()
&& gameFrame.blueList.indexOf(gameFrame.turret.turretBlueThree) == -1) {
gameFrame.blueList.add(gameFrame.turret.turretBlueThree);
}
if (!gameFrame.turret.turretBlueThree.isAlive() && gameFrame.turret.turretBlueBase.isAlive()
&& gameFrame.blueList.indexOf(gameFrame.turret.turretBlueBase) == -1) {
gameFrame.blueList.add(gameFrame.turret.turretBlueBase);
}
if (!gameFrame.turret.turretBlueBase.isAlive()) {
//游戏失败
gameFrame.state = 3;
}
if (!gameFrame.turret.turretRedOne.isAlive() && gameFrame.turret.turretRedTwo.isAlive()
&& gameFrame.redList.indexOf(gameFrame.turret.turretRedTwo) == -1) {
gameFrame.redList.add(gameFrame.turret.turretRedTwo);
}
if (!gameFrame.turret.turretRedTwo.isAlive() && gameFrame.turret.turretRedThree.isAlive()
&& gameFrame.redList.indexOf(gameFrame.turret.turretRedThree) == -1) {
gameFrame.redList.add(gameFrame.turret.turretRedThree);
}
if (!gameFrame.turret.turretRedThree.isAlive() && gameFrame.turret.turretRedBase.isAlive()
&& gameFrame.redList.indexOf(gameFrame.turret.turretRedBase) == -1) {
gameFrame.redList.add(gameFrame.turret.turretRedBase);
}
if (!gameFrame.turret.turretRedBase.isAlive()) {
//游戏胜利
gameFrame.state = 2;
}
}
@Override
public void paintSelf(Graphics g) {
// 生命值为0
if (getCurrentHp() <= 0) {
setAlive(false);
gameFrame.removeList.add(this);
if (this instanceof TurretBlue) {
gameFrame.blueList.remove(this);
} else {
gameFrame.redList.remove(this);
}
} else {
// 添加生命值
if (this instanceof TurretBlue) {
this.addHp(g, 50, 130, 100, 20, Color.GREEN);
attack(gameFrame.redList);
} else {
this.addHp(g, 50, 130, 100, 20, Color.RED);
attack(gameFrame.blueList);
}
g.drawImage(getImg(), getX() - 50, getY() - 100, null);
g.drawOval(getX() - 300, getY() - 300, 600, 600);
}
}
@Override
public Rectangle getRec() {
// TODO Auto-generated method stub
return new Rectangle(getX() - 50, getY() - 100, 100, 180);
}
}
package com.sxt;
public class TurretBlue extends Turret {
public TurretBlue(GameFrame gameFrame) {
super(gameFrame);
// TODO Auto-generated constructor stub
}
public TurretBlue(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
}
}
package com.sxt;
public class TurretRed extends Turret {
public TurretRed(GameFrame gameFrame) {
super(gameFrame);
// TODO Auto-generated constructor stub
}
public TurretRed(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
}
}
package com.sxt.beast;
import com.sxt.GameFrame;
public class Bear extends Beast {
public Bear(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setImg("img/bear.jpg");
width = 85;
height = 112;
setDis(65);
// TODO Auto-generated constructor stub
}
}
package com.sxt.beast;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import com.sxt.*;
public class Beast extends GameObject {
public ArrayList<Beast> beastList = new ArrayList<Beast>();
int width;
int height;
// 初始坐标
int initialX;
int initialY;
// 有没有仇恨值
public boolean isAggressive = false;
// 复活的元素
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 Xiyi(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());
setSpd(10);
setAttackCoolDownTime(2000);
initialX = getX();
initialY = getY();
beast = this;
}
public void moveToTarget() {
double dis = getDis(getX(), getY(), getTarget().getX(), getTarget().getY());
if (dis > 500) {
isAggressive = false;
setHasTarget(false);
} else {
int xSpeed = (int) (getSpd() * (getTarget().getX() - getX()) / dis);
int ySpeed = (int) (getSpd() * (getTarget().getY() - getY()) / dis);
setX(getX() + xSpeed);
setY(getY() + ySpeed);
}
}
public void moveToInitialLocation() {
double dis = getDis(getX(), getY(), initialX, initialY);
if (dis < getSpd()) {
setX(initialX);
setY(initialY);
isAggressive = true;
} else {
int xSpeed = (int) (getSpd() * (initialX - getX()) / dis);
int ySpeed = (int) (getSpd() * (initialY - getY()) / dis);
setX(getX() + xSpeed);
setY(getY() + ySpeed);
}
}
/**
判断有没有目标及野怪的仇恨值(又没有攻击性)
true,判断是否到攻击范围
false,向目标移动,若中途离开出生点距离大于300或与目标距离大于400,则不再有攻击性。
true,发射子弹,线程开始
false,没有目标,回到出生地,自动回血,再次有攻击性
*/
public void move() {
if (isHasTarget() && isAggressive) {
if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), getDis())) {
moveToTarget();
} else if (isAttackCoolDown() && isAlive()) {
Bullet bullet = new Bullet(gameFrame, this, getTarget(), 500, 50, "img/bullet.gif");
gameFrame.objList.add(bullet);
new AttackCD().start();
}
} else {
moveToInitialLocation();
if (getCurrentHp() < getHp()) {
setCurrentHp(getCurrentHp() + 100);
}
}
}
@Override
public void paintSelf(Graphics g) {
// TODO Auto-generated method stub// 生命值为0
if (getCurrentHp() <= 0) {
System.out.println("beast die");
setAlive(false);
gameFrame.removeList.add(this);
gameFrame.beast.beastList.remove(this);
new ReviveCD().start();
} else {
// 添加生命值
addHp(g, width / 2, 80, width, 20, Color.GREEN);
g.drawImage(getImg(), getX() - width / 2, getY() - height / 2, null);
g.setColor(Color.RED);
g.fillOval(getX(), getY(), 10, 10);
g.drawOval(getX() - getDis(), getY() - getDis(), 2 * getDis(), 2 * getDis());
move();
}
}
@Override
public Rectangle getRec() {
// TODO Auto-generated method stub
return new Rectangle(getX() - width / 2, getY() - height / 2, width, height);
}
class AttackCD extends Thread {
public void run() {
// 将攻击功能设置为冷却状态
setAttackCoolDown(false);
// 线程休眠
try {
Thread.sleep(getAttackCoolDownTime());
} catch (Exception e) {
e.printStackTrace();
}
// 将攻击功能设置为攻击状态
setAttackCoolDown(true);
// 线程终止
this.stop();
}
}
class ReviveCD extends Thread {
public void run() {
// 线程休眠
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
Beast reviveBeast;
if (beast instanceof RedBuff) {
reviveBeast = new RedBuff(3045, 3170, gameFrame);
} else if (beast instanceof Bear) {
reviveBeast = new Bear(2800, 2855, gameFrame);
} else if (beast instanceof Bird) {
reviveBeast = new Bird(3570, 3380, gameFrame);
} else if (beast instanceof Xiyi) {
reviveBeast = new Xiyi(4585, 2365, gameFrame);
} else if (beast instanceof BlueBuff) {
reviveBeast = new BlueBuff(4025, 2295, gameFrame);
} else {
reviveBeast = new Wolf(4235, 1945, gameFrame);
}
gameFrame.objList.add(reviveBeast);
gameFrame.beast.beastList.add(reviveBeast);
}
}
}
package com.sxt.beast;
import com.sxt.GameFrame;
public class Bird extends Beast {
public Bird(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setImg("img/红隼.jpg");
width = 122;
height = 98;
setDis(125);
// TODO Auto-generated constructor stub
}
}
package com.sxt.beast;
import com.sxt.GameFrame;
public class BlueBuff extends Beast {
public BlueBuff(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setImg("img/blueBuff.jpg");
width = 142;
height = 176;
setDis(70);
// TODO Auto-generated constructor stub
}
}
package com.sxt.beast;
import com.sxt.GameFrame;
public class RedBuff extends Beast {
public RedBuff(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setImg("img/redBuff.jpg");
width = 103;
height = 150;
setDis(70);
// TODO Auto-generated constructor stub
}
}
package com.sxt.beast;
import com.sxt.GameFrame;
public class Wolf extends Beast {
public Wolf(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setImg("img/wolf.jpg");
width = 145;
height = 140;
setDis(65);
// TODO Auto-generated constructor stub
}
}
package com.sxt.beast;
import com.sxt.GameFrame;
public class Xiyi extends Beast {
public Xiyi(int x, int y, GameFrame gameFrame) {
super(x, y, gameFrame);
setImg("img/蜥蜴.jpg");
width = 111;
height = 65;
setDis(125);
// TODO Auto-generated constructor stub
}
}
三.结果呈现