首先创建一个新的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.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
championList = new ArrayList(); -
- 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.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.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
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
(); - }
- }
-
- @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
targetList = new ArrayList(); - // 遍历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
targets = new ArrayList();// 目标列表,最多三个目标 - 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
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.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
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
objList) ; -
- /**
- * @param x: 下一步的横坐标
- * @param y: 下一步的纵坐标
- * @param objList: 小兵列表
- * @return 下一步位置与其他小兵是否碰撞
- */
- public boolean hitMinion(int x, int y, ArrayList
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
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
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
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
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
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));
-
- // 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.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
beastList = new ArrayList(); - 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
- }
- }


ps:图像放主页了,有需要可以下载