java简易制作-王者荣耀游戏

一.准备工作

首先创建一个新的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);

}

}

4,

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;

}

}

}

5,

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);

}

}

}

6,

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);

}

}

}

7,

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;

}

}

8,

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;

}

}

9,

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());

}

}

}

}

}

10,

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());

}

}

}

}

}

11,

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);

}

}

12,

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);

}

}

13,

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);

}

}

14,

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

}

}

15,

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);

}

}

}

16,

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

}

}

17,

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

}

}

18,

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

}

}

19,

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

}

}

20,

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

}

}

三.结果呈现

相关推荐
计算机学姐1 分钟前
基于SpringBoot+Vue的在线投票系统
java·vue.js·spring boot·后端·学习·intellij-idea·mybatis
一休哥助手16 分钟前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
救救孩子把17 分钟前
深入理解 Java 对象的内存布局
java
落落落sss20 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
苏宸啊23 分钟前
顺序表及其代码实现
数据结构·算法
万物皆字节25 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
lin zaixi()26 分钟前
贪心思想之——最大子段和问题
数据结构·算法
夜雨翦春韭32 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
简单.is.good37 分钟前
【测试】接口测试与接口自动化
开发语言·python
我行我素,向往自由39 分钟前
速成java记录(上)
java·速成