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

}

}

package com.sxt;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Polygon;

import java.awt.Toolkit;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.util.ArrayList;

import java.util.Random;

import com.sxt.beast.Beast;

public class ChampionDaji extends Champion {

// 技能是否处于释放状态

boolean ifAbilityOne = false;

boolean ifAbilityTwo = false;

// 鼠标监视器

MouseMonitor m;

// 一技能多边形

Polygon p;

// 一技能三角函数

double sin;

double cos;

// 一技能已经攻击过的目标

ArrayList<GameObject> attacked;

// 一技能移动次数

int step = 0;

// 技能二目标

GameObject abilityTwoTarget;

// 技能二子弹

Bullet abilityTwoBullet;

// 三技能子弹列表

Bullet[] bulletList = { new Bullet(), new Bullet(), new Bullet(), new Bullet(), new Bullet() };

public ChampionDaji(GameFrame gameFrame) {

super(gameFrame);

abilityOne = Toolkit.getDefaultToolkit().getImage("img/abilityOne.jpg");

abilityTwo = Toolkit.getDefaultToolkit().getImage("img/abilityTwo.jpg");

abilityThree = Toolkit.getDefaultToolkit().getImage("img/abilityThree.jpg");

classical = Toolkit.getDefaultToolkit().getImage("img/Classical.jpg");

// 三个技能冷却时间

coolDownTimeOne = 6000;

coolDownTimeTwo = 8000;

coolDownTimeThree = 8000;

}

public void exit() {

this.gameFrame.removeMouseListener(m);

}

public void abilityOneMove() {

p.translate((int) (50 * cos), -(int) (50 * sin));

for (GameObject redObj : gameFrame.objList) {

// 是红色方小兵 && 发生碰撞 && 没在attacked列表里

if (redObj instanceof MinionRed && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {

// 小兵扣血,添加到attacked里

redObj.setCurrentHp(redObj.getCurrentHp() - 400);

attacked.add(redObj);

}else if (Beast.class.isAssignableFrom(redObj.getClass()) && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {

redObj.setCurrentHp(redObj.getCurrentHp() - 400);

attacked.add(redObj);

}

}

}

@Override

public void abilityOne() {

// TODO Auto-generated method stub

if (coolDownOne) {

m = new MouseMonitor();

p = new Polygon();

gameFrame.addMouseListener(m);

attacked = new ArrayList<GameObject>();

}

}

@Override

public void abilityTwo() {

// TODO Auto-generated method stub

if (coolDownTwo) {

boolean find = false;

for (GameObject redObj : gameFrame.objList) {

// 是红色小兵 && 距离小于250 && 存活

if ((redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass())) && recIntersectsCir(redObj.getRec(), getX(), getY(), 250)

&& redObj.isAlive()) {

// 添加子弹

abilityTwoBullet = new Bullet(gameFrame, this, redObj, 250, 60, "img/abilityTwoBullet.png");

gameFrame.objList.add(abilityTwoBullet);

// 给目标赋值

abilityTwoTarget = redObj;

// 释放二技能

ifAbilityTwo = true;

find = true;

break;

}

}

if (find) {

new AbilityTwoCD().start();

find = false;

}

}

}

/**

* 点击技能三释放技能 先将技能范围内目标储存到targetList里 提前定义五个子弹 技能释放时初始化五个子弹 子弹目标从targetList里随机选择

* 如果期间目标死亡,制作一个目标替身,生命值设置为true 子弹与目标或替身碰撞后消失

*/

@Override

public void abilityThree() {

// TODO Auto-generated method stub

// 三技能没在冷却状态

if (coolDownThree) {

// 创建列表来储存目标

ArrayList<GameObject> targetList = new ArrayList<GameObject>();

// 遍历redList

for (int i = 0; i < gameFrame.objList.size(); i++) {

GameObject target = gameFrame.objList.get(i);

// 是红色小兵 && 在技能范围里 && 存活

if ((target instanceof MinionRed || Beast.class.isAssignableFrom(target.getClass())) && recIntersectsCir(target.getRec(), getX(), getY(), 250)

&& target.isAlive()) {

targetList.add(target);

}

}

//找到目标

if(targetList.size() != 0) {

//初始化五个子弹,随机攻击列表里的目标

Random random = new Random();

int count = 0;

while(count < 5) {

int r = random.nextInt(targetList.size());

if(!targetList.get(r).isAlive()) {

//目标死亡,制作替身

GameObject substitute = targetList.get(r);

substitute.setAlive(true);

bulletList[count] = new Bullet(gameFrame, this, substitute, 250, 60, "img/abilityTwoBullet.png");

}else {

bulletList[count] = new Bullet(gameFrame, this, targetList.get(r), 250, 60, "img/abilityTwoBullet.png");

}

count++;

}

new AbilityThreeBulletCD().start();

new AbilityThreeCD().start();

}

}

}

@Override

public void abilityEffect(Graphics g) {

// TODO Auto-generated method stub

if (ifAbilityOne) {

g.setColor(Color.RED);

g.fillPolygon(p);

abilityOneMove();

step++;

if (step == 10) {

step = 0;

ifAbilityOne = false;

}

}

if (ifAbilityTwo) {

System.out.println(abilityTwoTarget.beControlled);

if (abilityTwoBullet.getRec().intersects(abilityTwoTarget.getRec())) {

new AbilityControllCD().start();

ifAbilityTwo = false;

}

}

}

// 技能一冷却时间

class AbilityOneCD extends Thread {

public void run() {

// 将技能一设置为冷却状态

coolDownOne = false;

// 线程休眠

try {

// one来表示一技能冷却时间

int one = coolDownTimeOne;

while (one > 0) {

Thread.sleep(1000);

System.out.println("一技能冷却时间: " + one / 1000);

one -= 1000;

}

} catch (Exception e) {

e.printStackTrace();

}

// 将技能一设置为攻击状态

coolDownOne = true;

// 线程终止

this.stop();

}

}

// 技能二冷却时间

class AbilityTwoCD extends Thread {

public void run() {

// 将技能二设置为冷却状态

coolDownTwo = false;

// 线程休眠

try {

// one来表示二技能冷却时间

int two = coolDownTimeTwo;

while (two > 0) {

Thread.sleep(1000);

System.out.println("二技能冷却时间: " + two / 1000);

two -= 1000;

}

} catch (Exception e) {

e.printStackTrace();

}

// 将技能二设置为攻击状态

coolDownTwo = true;

// 线程终止

this.stop();

}

}

// 技能二控制时间

class AbilityControllCD extends Thread {

public void run() {

abilityTwoTarget.beControlled = true;

// 线程休眠

try {

Thread.sleep(20000);

} catch (Exception e) {

e.printStackTrace();

}

abilityTwoTarget.beControlled = false;

this.stop();

}

}

// 技能三冷却时间

class AbilityThreeCD extends Thread {

public void run() {

// 将技能三设置为冷却状态

coolDownThree = false;

// 线程休眠

try {

// three来表示三技能冷却时间

int three = coolDownTimeThree;

while (three > 0) {

Thread.sleep(1000);

System.out.println("三技能冷却时间: " + three / 1000);

three -= 1000;

}

} catch (Exception e) {

e.printStackTrace();

}

// 将技能三设置为攻击状态

coolDownThree = true;

// 线程终止

this.stop();

}

}

//技能三子弹时间间隔

class AbilityThreeBulletCD extends Thread{

public void run() {

try {

gameFrame.objList.add(bulletList[0]);

Thread.sleep(200);

gameFrame.objList.add(bulletList[1]);

Thread.sleep(200);

gameFrame.objList.add(bulletList[2]);

Thread.sleep(200);

gameFrame.objList.add(bulletList[3]);

Thread.sleep(200);

gameFrame.objList.add(bulletList[4]);

}catch(Exception e) {

e.printStackTrace();

}

this.stop();

}

}

// 鼠标监视器

private class MouseMonitor extends MouseAdapter {

@Override

public void mousePressed(MouseEvent e) {// 当鼠标点击时

int mouseX = e.getX(), mouseY = e.getY(), playerX = 700, playerY = 350;

double dis = getDis(mouseX, mouseY, playerX, playerY);

// 三角函数

cos = (mouseX - playerX) / dis;

sin = -(mouseY - playerY) / dis;

// 坐标差

int difX = (int) (60 * sin);

int difY = (int) (60 * cos);

p.addPoint(getX() - difX, getY() - difY);

p.addPoint(getX() + difX, getY() + difY);

p.addPoint(getX() + difX + (int) (20 * cos), getY() + difY - (int) (20 * sin));

p.addPoint(getX() - difX + (int) (20 * cos), getY() - difY - (int) (20 * sin));

exit();

new AbilityOneCD().start();

ifAbilityOne = true;

}

}

}

package com.sxt;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Polygon;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.util.ArrayList;

import javax.swing.JButton;

import com.sxt.beast.Beast;

public class ChampionHouyi extends Champion {

// 技能是否处于释放状态

boolean ifAbilityThree = false;

boolean ifAbilityTwo = false;

// 鼠标监视器

MouseMonitor m;

MouseMonitorTwo m2;

// 三技能多边形

Polygon p;

// 三技能三角函数

double sin;

double cos;

// 三技能命中的目标

GameObject abilityThreeTarget;

// 三技能是否出界

boolean ifXOutside;

boolean ifYOutside;

// 二技能位置

int X_AbilityTwo;

int Y_AbilityTwo;

public ChampionHouyi(GameFrame gameFrame) {

super(gameFrame);

abilityOne = Toolkit.getDefaultToolkit().getImage("img/HyabilityOne.jpg");

abilityTwo = Toolkit.getDefaultToolkit().getImage("img/HyabilityTwo.jpg");

abilityThree = Toolkit.getDefaultToolkit().getImage("img/HyabilityThree.jpg");

classical = Toolkit.getDefaultToolkit().getImage("img/后羿-辉光之辰.jpg");

// 三个技能冷却时间

coolDownTimeOne = 14000;

coolDownTimeTwo = 10000;

coolDownTimeThree = 28000;

// TODO Auto-generated constructor stub

}

public ChampionHouyi(GameFrame gameFrame, int i, int j) {

// TODO Auto-generated constructor stub

super(gameFrame, i, j);

}

public void exit(MouseAdapter ma) {

this.gameFrame.removeMouseListener(ma);

}

public void attack() {

if (isAttackCoolDown()) {

ArrayList<GameObject> targets = new ArrayList<GameObject>();// 目标列表,最多三个目标

for (GameObject redObj : this.gameFrame.redList) {

if (this.recIntersectsCir(redObj.getRec(), getX() - 250, getY() - 250, 500)) {

targets.add(redObj);

if (targets.size() == 3) {

break;

}

}

}

for (GameObject beastObj : this.gameFrame.beast.beastList) {

if (this.recIntersectsCir(beastObj.getRec(), getX() - 250, getY() - 250, 500)) {

targets.add(beastObj);

if (targets.size() == 3) {

break;

}

}

}

for (int i = 0; i < targets.size(); i++) {

Bullet bullet;

if (i == 0) {

bullet = new Bullet(gameFrame, this, targets.get(i), 400, 50, "img/bullet.gif");

} else {

bullet = new Bullet(gameFrame, this, targets.get(i), 200, 50, "img/bullet.gif");

}

gameFrame.objList.add(bullet);

}

new AttackCD().start();

}

}

public void abilityTwoAttack() {

for (GameObject redObj : this.gameFrame.objList) {

if (redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass())) {

if (this.recIntersectsCir(redObj.getRec(), X_AbilityTwo - 60, Y_AbilityTwo - 60, 120)) {

redObj.setCurrentHp(redObj.getCurrentHp() - 400);

}

if (this.recIntersectsCir(redObj.getRec(), X_AbilityTwo - 30, Y_AbilityTwo - 30, 60)) {

redObj.setCurrentHp(redObj.getCurrentHp() - 200);

}

}

}

}

public void abilityThreeMove() {

p.translate((int) (50 * cos), -(int) (50 * sin));

for (GameObject redObj : gameFrame.objList) {

// 是红色方小兵 && 发生碰撞

if ((redObj instanceof MinionRed || Beast.class.isAssignableFrom(redObj.getClass()))

&& p.intersects(redObj.getRec())) {

// 击中目标后,目标减血并眩晕,多边形消失

redObj.setCurrentHp(redObj.getCurrentHp() - 400);

abilityThreeTarget = redObj;

new AbilityControlCD().start();

ifAbilityThree = false;

new AbilityThreeCD().start();

}

}

if (!ifXOutside) {

for (int x : p.xpoints) {

if (x < 0 || x >= 5165) {

ifXOutside = true;

break;

}

}

}

if (!ifYOutside) {

for (int y : p.ypoints) {

if (y < 0 || y >= 4085) {

ifYOutside = true;

break;

}

}

}

}

/**

* 一技能 制作游戏界面攻击按钮的替身 替换攻击按钮 新的攻击按钮事件: 1. 定义目标列表 2. 添加目标,最多添加三个 3.

* 目标列表第一个造成400伤害,其余200伤害 4. 持续5秒,结束后替换攻击按钮️

*/

@Override

public void abilityOne() {

// TODO Auto-generated method stub

if (coolDownOne) {

new AbilityOneDuration().start();// 强化普攻持续时间

new AbilityOneCD().start();

}

}

/**

* 二技能 先点击按钮释放技能 再点击技能范围内任意位置 之后点击的位置会出现 两个大小不同的圆 在大圆内会受到300伤害 在小圆内受到额外200伤害

*/

@Override

public void abilityTwo() {

// TODO Auto-generated method stub

if (coolDownTwo) {

m2 = new MouseMonitorTwo();

gameFrame.addMouseListener(m2);

X_AbilityTwo = 0;

Y_AbilityTwo = 0;

}

}

@Override

public void abilityThree() {

// TODO Auto-generated method stub

if (coolDownThree) {

m = new MouseMonitor();

p = new Polygon();

gameFrame.addMouseListener(m);

ifAbilityThree = true;

ifXOutside = false;

ifYOutside = false;

}

}

@Override

public void abilityEffect(Graphics g) {

// TODO Auto-generated method stub

if (ifAbilityTwo) {

System.out.println("222");

g.setColor(Color.RED);

g.fillOval(X_AbilityTwo - 60, Y_AbilityTwo - 60, 120, 120);

g.setColor(Color.BLACK);

g.fillOval(X_AbilityTwo - 30, Y_AbilityTwo - 30, 60, 60);

abilityTwoAttack();

X_AbilityTwo = 0;

Y_AbilityTwo = 0;

ifAbilityTwo = false;

new AbilityTwoCD().start();

}

if (ifAbilityThree) {

System.out.println("333");

g.setColor(Color.RED);

g.fillPolygon(p);

abilityThreeMove();

// 如果出界,技能释放结束

if (ifXOutside || ifYOutside) {

ifAbilityThree = false;

p = new Polygon();

new AbilityThreeCD().start();

}

}

}

// 攻击冷却时间

class AttackCD extends Thread {

public void run() {

// 将攻击功能设置为冷却状态

setAttackCoolDown(false);

// 线程休眠

try {

Thread.sleep(getAttackCoolDownTime());

} catch (Exception e) {

e.printStackTrace();

}

// 将攻击功能设置为攻击状态

setAttackCoolDown(true);

// 线程终止

this.stop();

}

}

// 一技能冷却时间

class AbilityOneCD extends Thread {

public void run() {

// 将攻击功能设置为冷却状态

coolDownOne = false;

// 休眠

try {

// one用来储存冷却时间

int one = coolDownTimeOne;

while (coolDownTimeOne > 0) {

Thread.sleep(1000);

System.out.println("技能一冷却时间: " + coolDownTimeOne / 1000);

coolDownTimeOne -= 1000;

}

coolDownTimeOne = one;

} catch (Exception e) {

e.printStackTrace();

}

// 将攻击功能解除冷却状态

coolDownOne = true;

// 线程终止

this.stop();

}

}

// 技能一持续时间

class AbilityOneDuration extends Thread {

public void run() {

// 制作攻击按钮的替身

JButton substitute = gameFrame.attackButton;

gameFrame.remove(gameFrame.attackButton);

JButton button = new JButton();

button.setSize(130, 132);

button.setLocation(1150, 430);

button.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// 获取到的事件源就是按钮本身

attack();

}

});

gameFrame.add(button);

// 休眠

try {

Thread.sleep(5000);

} catch (Exception e) {

e.printStackTrace();

}

gameFrame.remove(button);

gameFrame.add(substitute);

// 线程终止

this.stop();

}

}

// 二技能冷却时间

class AbilityTwoCD extends Thread {

public void run() {

// 将二技能设置为冷却状态

coolDownTwo = false;

// 休眠

try {

int two = coolDownTimeTwo;

while (coolDownTimeTwo > 0) {

Thread.sleep(1000);

System.out.println("技能二冷却时间: " + coolDownTimeTwo / 1000);

coolDownTimeTwo -= 1000;

}

coolDownTimeTwo = two;

} catch (Exception e) {

e.printStackTrace();

}

// 将攻击功能解除冷却状态

coolDownTwo = true;

// 线程终止

this.stop();

}

}

// 技能三冷却时间

class AbilityThreeCD extends Thread {

public void run() {

// 将技能三设置为冷却状态

coolDownThree = false;

// 线程休眠

try {

// three来表示三技能冷却时间

int three = coolDownTimeThree;

while (three > 0) {

Thread.sleep(1000);

System.out.println("三技能冷却时间: " + three / 1000);

three -= 1000;

}

} catch (Exception e) {

e.printStackTrace();

}

// 将技能三设置为攻击状态

coolDownThree = true;

// 线程终止

this.stop();

}

}

// 技能三控制时间

class AbilityControlCD extends Thread {

public void run() {

abilityThreeTarget.beControlled = true;

// 线程休眠

try {

Thread.sleep(20000);

} catch (Exception e) {

e.printStackTrace();

}

abilityThreeTarget.beControlled = false;

this.stop();

}

}

// 鼠标监视器

private class MouseMonitorTwo extends MouseAdapter {

@Override

public void mousePressed(MouseEvent e) {// 当鼠标点击时

System.out.println("pressed");

int mouseX = e.getX(), mouseY = e.getY(), playerX = 700, playerY = 350;

double dis = getDis(mouseX, mouseY, playerX, playerY);

if (dis < 250) {

X_AbilityTwo = e.getX() - playerX + getX();

Y_AbilityTwo = e.getY() - playerY + getY();

}

ifAbilityTwo = true;

exit(this);

}

}

// 鼠标监视器

private class MouseMonitor extends MouseAdapter {

@Override

public void mousePressed(MouseEvent e) {// 当鼠标点击时

int mouseX = e.getX(), mouseY = e.getY(), playerX = 700, playerY = 350;

double dis = getDis(mouseX, mouseY, playerX, playerY);

// 三角函数

cos = (mouseX - playerX) / dis;

sin = -(mouseY - playerY) / dis;

// 坐标差

int difX = (int) (60 * sin);

int difY = (int) (60 * cos);

p.addPoint(getX() - difX, getY() - difY);

p.addPoint(getX() + difX, getY() + difY);

p.addPoint(getX() + difX + (int) (20 * cos), getY() + difY - (int) (20 * sin));

p.addPoint(getX() - difX + (int) (20 * cos), getY() - difY - (int) (20 * sin));

ifAbilityThree = true;

exit(this);

}

}

}

package com.sxt;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.util.ArrayList;

import javax.swing.JButton;

import javax.swing.JFrame;

import com.sxt.beast.Beast;

public class GameFrame extends JFrame {

// 游戏模式 0 选择英雄,1 游戏开始,2 游戏胜利,3 游戏失败

int state = 0;

// 窗口尺寸

private int windowWidth = 1400;

private int windowHeight = 700;

// 双缓冲图片

private Image offScreenImage = null;

// 攻击图片

private Image attack = Toolkit.getDefaultToolkit().getImage("img/attack.jpg");

//游戏胜利失败图片

private Image gameWin = Toolkit.getDefaultToolkit().getImage("img/gameWin.png");

private Image gameLose = Toolkit.getDefaultToolkit().getImage("img/gameLose.png");

// 游戏背景

Background background = new Background(this);

// 游戏玩家

Champion player;

Champion champion = new ChampionHouyi(this,700,3800);

// 双方小兵

MinionBlue mb = new MinionBlue(this);

MinionRed mr = new MinionRed(this);

// 防御塔

Turret turret = new Turret(this);

//野怪

public Beast beast = new Beast(this);

// 攻击按钮

JButton attackButton;

// 游戏元素列表

public ArrayList<GameObject> objList = new ArrayList<GameObject>();

ArrayList<GameObject> redList = new ArrayList<GameObject>();// 红色方

ArrayList<GameObject> blueList = new ArrayList<GameObject>();// 蓝色方

public ArrayList<GameObject> removeList = new ArrayList<GameObject>();// 存放将要删除的元素

public void launch() {

// 设置尺寸

setSize(windowWidth, windowHeight);

// 窗口居中

setLocationRelativeTo(null);

// 关闭事件

setDefaultCloseOperation(3);

// 用户不能调整窗口大小

setResizable(false);

// 标题

setTitle("王者荣耀");

// 窗口可见

setVisible(true);

// 添加键盘监视器

this.addKeyListener(new GameFrame.KeyMonitor());

// 添加游戏元素

objList.add(background);

objList.addAll(turret.turretList);

objList.addAll(beast.beastList);

blueList.add(turret.turretList.get(0));

redList.add(turret.turretList.get(4));

/**

* 攻击按钮

*/

attackButton = new JButton();

attackButton.setSize(130, 132);

attackButton.setLocation(1150, 430);

attackButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// 按钮事件

player.attack(redList);

}

});

this.add(attackButton);

while (true) {

if (state == 1) {

// 添加小兵

//mb.createMinion(this, blueList);

//mr.createMinion(this, redList);

// 添加防御塔

turret.addTurret();

}

repaint();

try {

Thread.sleep(17);

} catch (Exception e) {

e.printStackTrace();

}

}

}

public void paint(Graphics g) {

if (offScreenImage == null) {

offScreenImage = this.createImage(5984, 4452);

}

Graphics gImage = offScreenImage.getGraphics();

if (state == 0) {

for(int i = 0; i < champion.championList.size(); i++) {

//添加图片

Image classical = champion.championList.get(i).classical;

gImage.drawImage(classical, i*160, 20, null);

//添加按钮

JButton championButton = new JButton();

championButton.setSize(150, 150);

championButton.setLocation(i*150, 0);

int a = i;

championButton.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

state = 1;

player = champion.championList.get(a);

objList.add(player);

player.addButton();

}

});

this.add(championButton);

}

} else if (state == 1) {

for (int i = 0; i < objList.size(); i++) {

objList.get(i).paintSelf(gImage);

}

// 绘制攻击图片

gImage.drawImage(attack, player.getX() + 500, player.getY() + 100, null);

objList.removeAll(removeList);

} else if (state == 2) {//游戏胜利

gImage.drawImage(gameWin, 0, 5, null);

} else if (state == 3) {//游戏失败

gImage.drawImage(gameLose, 0, 5, null);

}

if (state != 1) {

g.drawImage(offScreenImage, 0, 0, null);

} else {

g.drawImage(offScreenImage, -player.getX() + 700, -player.getY() + 350, null);

}

/**

* 添加按钮后不能调用键盘事件 因为程序的焦点变成了按钮 this.requestFocus() 把焦点重新改变到游戏界面上

*/

this.requestFocus();

}

// main方法

public static void main(String[] args) {

GameFrame gameFrame = new GameFrame();

gameFrame.launch();

}

// 键盘事件

private class KeyMonitor extends KeyAdapter {

@Override

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();

player.keyPressed(e);

}

@Override

public void keyReleased(KeyEvent e) {

int key = e.getKeyCode();

player.keyReleased(e);

}

}

}

package com.sxt;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Rectangle;

import java.awt.Toolkit;

import java.util.ArrayList;

import com.sxt.beast.Beast;

public abstract class GameObject {

// 坐标

private int x;

private int y;

// 图片

private Image img;

// 游戏界面

public GameFrame gameFrame;

// 速度

private int spd;

// 初始生命值

private int hp;

// 当前生命值

private int currentHp;

// 攻击目标

private GameObject target;

// 是否有目标

private boolean hasTarget = false;

// 攻击距离

private int dis;

// 攻击时间间隔

private int attackCoolDownTime;

// 攻击是否冷却

private boolean attackCoolDown = true;

// 是否存活

private boolean alive = true;

// 是否被控制

boolean beControlled = false;

public GameObject(GameFrame gameFrame) {

this.gameFrame = gameFrame;

}

public GameObject(int x, int y, GameFrame gameFrame) {

this.x = x;

this.y = y;

this.gameFrame = gameFrame;

}

public GameObject() {

// TODO Auto-generated constructor stub

}

public void addHp(Graphics g, int difX, int difY, int width, int height, Color color) {

// 绘制外部轮廓

g.setColor(Color.black);

g.drawRect(getX() - difX, getY() - difY, width, height);

// 填充矩形

g.setColor(color);

g.fillRect(getX() - difX, getY() - difY, (int) (width * getCurrentHp() / getHp()), height);

}

public double getDis(int x1, int y1, int x2, int y2) {

return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));

}

// 矩形矩形碰撞检测

public boolean recIntersectsRec(Rectangle r1, Rectangle r2) {

return r1.intersects(r2);

}

public boolean recIntersectsCir(Rectangle rec, int x, int y, int r) {

/** 矩形于圆相交: 圆心到至少一个矩形定点的距离小于r */

if ((getDis(x, y, rec.x, rec.y) < r) || (getDis(x, y, rec.x, rec.y + rec.height) < r)

|| (getDis(x, y, rec.x + rec.width, rec.y) < r)

|| (getDis(x, y, rec.x + rec.width, rec.y + rec.height) < r)) {

return true;

}

return false;

}

// 攻击方法

public void attack(ArrayList<GameObject> gameObjList) {

if (hasTarget) {

// 目标离开范围后寻找新的目标

if (!recIntersectsCir(target.getRec(), getX(), getY(), getDis())) {

setHasTarget(false);

}

// 目标死亡,寻找新目标

else if (!target.isAlive()) {

setHasTarget(false);

} else if (isAttackCoolDown() && isAlive()) {

Bullet bullet = null;

// 防御塔攻击

if (Turret.class.isAssignableFrom(getClass())) {

bullet = new Bullet(gameFrame, this, getTarget(), 500, 50);

}

// 小兵攻击

else if (Minion.class.isAssignableFrom(getClass())) {

bullet = new Bullet(gameFrame, this, getTarget(), 50, 30);

}

// 玩家攻击

else if (this instanceof Champion) {

bullet = new Bullet(gameFrame, this, getTarget(), 500, 50, "img/bullet.gif");

}

gameFrame.objList.add(bullet);

// 线程开始

new AttackCD().start();

}

} else {

// 遍历列表

for (GameObject obj : gameObjList) {

// 判断攻击范围(圆形)与敌方(矩形)是否相交

if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {

// 找到目标

setTarget(obj);

setHasTarget(true);

// 跳出循环

break;

}

}

// 玩家是否在攻击范围内

if (!hasTarget && gameObjList == gameFrame.blueList) {

if (recIntersectsCir(gameFrame.player.getRec(), getX(), getY(), getDis())) {

// 找到目标

setTarget(gameFrame.player);

setHasTarget(true);

}

} else {

for (GameObject obj : gameFrame.beast.beastList) {

// 判断攻击范围(圆形)与敌方(矩形)是否相交

if (recIntersectsCir(obj.getRec(), getX(), getY(), getDis())) {

// 找到目标

setTarget(obj);

setHasTarget(true);

// 跳出循环

break;

}

}

}

}

}

class AttackCD extends Thread {

public void run() {

// 将攻击功能设置为冷却状态

setAttackCoolDown(false);

// 线程休眠

try {

Thread.sleep(attackCoolDownTime);

} catch (Exception e) {

e.printStackTrace();

}

// 将攻击功能设置为攻击状态

setAttackCoolDown(true);

// 线程终止

this.stop();

}

}

// 绘制元素

public abstract void paintSelf(Graphics g);

// 返回矩形

public abstract Rectangle getRec();

/**

* @return the x

*/

public int getX() {

return x;

}

/**

* @param x the x to set

*/

public void setX(int x) {

this.x = x;

}

/**

* @return the y

*/

public int getY() {

return y;

}

/**

* @param y the y to set

*/

public void setY(int y) {

this.y = y;

}

/**

* @return the img

*/

public Image getImg() {

return img;

}

/**

* @param img the img to set

*/

public void setImg(String img) {

this.img = Toolkit.getDefaultToolkit().getImage(img);

}

/**

* @return the spd

*/

public int getSpd() {

return spd;

}

/**

* @param spd the spd to set

*/

public void setSpd(int spd) {

this.spd = spd;

}

/**

* @return the hp

*/

public int getHp() {

return hp;

}

/**

* @param hp the hp to set

*/

public void setHp(int hp) {

this.hp = hp;

}

/**

* @return the currentHp

*/

public int getCurrentHp() {

return currentHp;

}

/**

* @param currentHp the currentHp to set

*/

public void setCurrentHp(int currentHp) {

if (currentHp < getHp()) {

if (Beast.class.isAssignableFrom(getClass())) {

System.out.println("yes");

setTarget(gameFrame.player);

setHasTarget(true);

}

}

this.currentHp = currentHp;

}

/**

* @return the target

*/

public GameObject getTarget() {

return target;

}

/**

* @param target the target to set

*/

public void setTarget(GameObject target) {

this.target = target;

}

/**

* @return the hasTarget

*/

public boolean isHasTarget() {

return hasTarget;

}

/**

* @param hasTarget the hasTarget to set

*/

public void setHasTarget(boolean hasTarget) {

this.hasTarget = hasTarget;

}

/**

* @return the dis

*/

public int getDis() {

return dis;

}

/**

* @param dis the dis to set

*/

public void setDis(int dis) {

this.dis = dis;

}

/**

* @return the attackCoolDownTime

*/

public int getAttackCoolDownTime() {

return attackCoolDownTime;

}

/**

* @param attackCoolDownTime the attackCoolDownTime to set

*/

public void setAttackCoolDownTime(int attackCoolDownTime) {

this.attackCoolDownTime = attackCoolDownTime;

}

/**

* @return the attackCoolDown

*/

public boolean isAttackCoolDown() {

return attackCoolDown;

}

/**

* @param attackCoolDown the attackCoolDown to set

*/

public void setAttackCoolDown(boolean attackCoolDown) {

this.attackCoolDown = attackCoolDown;

}

/**

* @return the alive

*/

public boolean isAlive() {

return alive;

}

/**

* @param alive the alive to set

*/

public void setAlive(boolean alive) {

this.alive = alive;

}

}

package com.sxt;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.ArrayList;

public abstract class Minion extends GameObject {

// 是否生成下一个小兵

private boolean nextMinion = true;

// 是否生成下一波小兵

private boolean nextLine = true;

// 生成小兵数量

private int minionCount = 0;

// 是否检测到目标

private boolean ifFindTarget = false;

public Minion(GameFrame gameFrame) {

super(gameFrame);

setHp(800);

setCurrentHp(getHp());

setDis(100);

setAttackCoolDownTime(2000);

// TODO Auto-generated constructor stub

}

/**

* (1325, 3750) (4425, 3750) (5050, 3125) (5050, 1125)

*/

public abstract void move(ArrayList<GameObject> objList);

/**

* @param x: 下一步的横坐标

* @param y: 下一步的纵坐标

* @param objList: 小兵列表

* @return 下一步位置与其他小兵是否碰撞

*/

public boolean hitMinion(int x, int y, ArrayList<GameObject> objList) {

// 新的区域生成矩形

Rectangle r = new Rectangle(x - 16, y - 16, 45, 45);

for (GameObject obj : objList) {

// 相同类 && 不是自身

if (obj.getClass() == this.getClass() && obj != this) {

if (r.intersects(obj.getRec())) {

return true;

}

}

}

return false;

}

public void findTarget(ArrayList<GameObject> objList) {

for (GameObject obj : objList) {

if (recIntersectsCir(obj.getRec(), getX(), getY(), 200)) {

setTarget(obj);

setIfFindTarget(true);

}

}

if (objList == gameFrame.blueList) {

if (recIntersectsCir(gameFrame.player.getRec(), getX(), getY(), 200)) {

setTarget(gameFrame.player);

setIfFindTarget(true);

}

}

}

public void moveToTarget() {

double dis = getDis(getX(), getY(), getTarget().getX(), getTarget().getY());

int xSpeed = (int) (getSpd() * (getTarget().getX() - getX()) / dis);

int ySpeed = (int) (getSpd() * (getTarget().getY() - getY()) / dis);

if (!hitMinion(getX() + xSpeed, getY(), gameFrame.objList)) {

setX(getX() + xSpeed);

}

if (!hitMinion(getX(), getY() + ySpeed, gameFrame.objList)) {

setY(getY() + ySpeed);

}

}

public void createMinion(GameFrame gameFrame, ArrayList<GameObject> minionList) {

if (nextLine) {

if (nextMinion) {

// 蓝色方小兵

if (minionList == this.gameFrame.blueList) {

MinionBlue mb = new MinionBlue(gameFrame);

gameFrame.objList.add(mb);

minionList.add(mb);

}

// 红色方小兵

else {

MinionRed mr = new MinionRed(gameFrame);

gameFrame.objList.add(mr);

minionList.add(mr);

}

minionCount++;

new NextMinion().start();

}

if (minionCount == 3) {

minionCount = 0;

new NextLine().start();

}

}

}

// 每个小兵生成时间

class NextMinion extends Thread {

public void run() {

nextMinion = false;

// 休眠1.5s

try {

Thread.sleep(1500);

} catch (Exception e) {

e.printStackTrace();

}

nextMinion = true;

// 线程终止

this.stop();

}

}

// 每波小兵生成时间

class NextLine extends Thread {

public void run() {

nextLine = false;

// 休眠15s

try {

Thread.sleep(15000);

} catch (Exception e) {

e.printStackTrace();

}

nextLine = true;

// 线程终止

this.stop();

}

}

@Override

public void paintSelf(Graphics g) {

// TODO Auto-generated method stub

// 生命值为0

if (getCurrentHp() <= 0) {

setAlive(false);

gameFrame.removeList.add(this);

if (this instanceof MinionBlue) {

gameFrame.blueList.remove(this);

} else {

gameFrame.redList.remove(this);

}

} else {

// 添加生命值

if (this instanceof MinionBlue) {

this.addHp(g, 17, 28, 45, 10, Color.GREEN);

} else {

this.addHp(g, 17, 28, 45, 10, Color.RED);

}

g.drawImage(getImg(), getX() - 16, getY() - 16, null);

//绘制检测范围圆形

//g.setColor(Color.RED);

//g.fillOval(getX(), getY(), 10, 10);

//g.drawRect(getX() - 16, getY() - 16, 45, 45);

// 小兵移动

if (!beControlled) {

if (this instanceof MinionBlue) {

move(gameFrame.redList);

} else {

move(gameFrame.blueList);

}

}

}

}

@Override

public Rectangle getRec() {

// TODO Auto-generated method stub

return new Rectangle(getX() - 16, getY() - 16, 45, 45);

}

/**

* @return the ifFindTarget

*/

public boolean isIfFindTarget() {

return ifFindTarget;

}

/**

* @param ifFindTarget the ifFindTarget to set

*/

public void setIfFindTarget(boolean ifFindTarget) {

this.ifFindTarget = ifFindTarget;

}

}

package com.sxt;

import java.util.ArrayList;

public class MinionBlue extends Minion {

public MinionBlue(GameFrame gameFrame) {

super(gameFrame);

setImg("img/blue.jpg");

setX(1325);

setY(3750);

// TODO Auto-generated constructor stub

}

@Override

public void move(ArrayList<GameObject> objList) {

// TODO Auto-generated method stub

if (isIfFindTarget()) {

// 离开检测范围

if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {

setIfFindTarget(false);

} else {

if (!isHasTarget()) {

moveToTarget();

}

attack(objList);

}

} else {

findTarget(objList);

// 原路线移动

if (getX() < 4425) {

setSpd(25);

if (!hitMinion(getX() + getSpd(), getY(), gameFrame.blueList)) {

setX(getX() + getSpd());

}

} else if (getX() < 5100 && getX() >= 4425) {

setSpd(20);

if (!hitMinion(getX() + getSpd(), getY(), gameFrame.blueList)) {

setX(getX() + getSpd());

}

if (!hitMinion(getX(), getY() - getSpd(), gameFrame.blueList)) {

setY(getY() - getSpd());

}

} else if (getX() >= 4900) {

setSpd(18);

if (!hitMinion(getX(), getY() - getSpd(), gameFrame.blueList)) {

setY(getY() - getSpd());

}

}

}

}

}

package com.sxt;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.ArrayList;

public class Turret extends GameObject {

ArrayList<Turret> turretList = new ArrayList<Turret>();

public Turret turretBlueOne;

public Turret turretBlueTwo;

public Turret turretBlueThree;

public Turret turretBlueBase;

public Turret turretRedOne;

public Turret turretRedTwo;

public Turret turretRedThree;

public Turret turretRedBase;

public Turret(GameFrame gameFrame) {

super(gameFrame);

setImg("img/turret.png");

// 初始化八个防御塔

turretList.add(turretBlueOne = new TurretBlue(1860, 3790, gameFrame));

turretList.add(turretBlueTwo = new TurretBlue(2650, 3820, gameFrame));

turretList.add(turretBlueThree = new TurretBlue(3995, 3830, gameFrame));

turretList.add(turretBlueBase = new TurretBlue(1130, 3650, gameFrame));

turretList.add(turretRedOne = new TurretRed(5100, 3030, gameFrame));

turretList.add(turretRedTwo = new TurretRed(5120, 2100, gameFrame));

turretList.add(turretRedThree = new TurretRed(5060, 1570, gameFrame));

turretList.add(turretRedBase = new TurretRed(4850, 1100, gameFrame));

// TODO Auto-generated constructor stub

}

public Turret(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

setImg("img/turret.png");

setHp(6000);

setCurrentHp(getHp());

setAttackCoolDownTime(1000);

setDis(300);

}

public void addTurret() {

/**

* 添加到objList里会被绘制出来,添加到redList和blueList才会被攻击 前一个防御塔爆炸后再把后一个添加到列表里

*/

if (!gameFrame.turret.turretBlueOne.isAlive() && gameFrame.turret.turretBlueTwo.isAlive()

&& gameFrame.blueList.indexOf(gameFrame.turret.turretBlueTwo) == -1) {

gameFrame.blueList.add(gameFrame.turret.turretBlueTwo);

}

if (!gameFrame.turret.turretBlueTwo.isAlive() && gameFrame.turret.turretBlueThree.isAlive()

&& gameFrame.blueList.indexOf(gameFrame.turret.turretBlueThree) == -1) {

gameFrame.blueList.add(gameFrame.turret.turretBlueThree);

}

if (!gameFrame.turret.turretBlueThree.isAlive() && gameFrame.turret.turretBlueBase.isAlive()

&& gameFrame.blueList.indexOf(gameFrame.turret.turretBlueBase) == -1) {

gameFrame.blueList.add(gameFrame.turret.turretBlueBase);

}

if (!gameFrame.turret.turretBlueBase.isAlive()) {

//游戏失败

gameFrame.state = 3;

}

if (!gameFrame.turret.turretRedOne.isAlive() && gameFrame.turret.turretRedTwo.isAlive()

&& gameFrame.redList.indexOf(gameFrame.turret.turretRedTwo) == -1) {

gameFrame.redList.add(gameFrame.turret.turretRedTwo);

}

if (!gameFrame.turret.turretRedTwo.isAlive() && gameFrame.turret.turretRedThree.isAlive()

&& gameFrame.redList.indexOf(gameFrame.turret.turretRedThree) == -1) {

gameFrame.redList.add(gameFrame.turret.turretRedThree);

}

if (!gameFrame.turret.turretRedThree.isAlive() && gameFrame.turret.turretRedBase.isAlive()

&& gameFrame.redList.indexOf(gameFrame.turret.turretRedBase) == -1) {

gameFrame.redList.add(gameFrame.turret.turretRedBase);

}

if (!gameFrame.turret.turretRedBase.isAlive()) {

//游戏胜利

gameFrame.state = 2;

}

}

@Override

public void paintSelf(Graphics g) {

// 生命值为0

if (getCurrentHp() <= 0) {

setAlive(false);

gameFrame.removeList.add(this);

if (this instanceof TurretBlue) {

gameFrame.blueList.remove(this);

} else {

gameFrame.redList.remove(this);

}

} else {

// 添加生命值

if (this instanceof TurretBlue) {

this.addHp(g, 50, 130, 100, 20, Color.GREEN);

attack(gameFrame.redList);

} else {

this.addHp(g, 50, 130, 100, 20, Color.RED);

attack(gameFrame.blueList);

}

g.drawImage(getImg(), getX() - 50, getY() - 100, null);

g.drawOval(getX() - 300, getY() - 300, 600, 600);

}

}

@Override

public Rectangle getRec() {

// TODO Auto-generated method stub

return new Rectangle(getX() - 50, getY() - 100, 100, 180);

}

}package com.sxt;

public class TurretBlue extends Turret {

public TurretBlue(GameFrame gameFrame) {

super(gameFrame);

// TODO Auto-generated constructor stub

}

public TurretBlue(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

}

}

package com.sxt;

public class TurretRed extends Turret {

public TurretRed(GameFrame gameFrame) {

super(gameFrame);

// TODO Auto-generated constructor stub

}

public TurretRed(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

}

}

package com.sxt.beast;

import com.sxt.GameFrame;

public class Bear extends Beast {

public Bear(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

setImg("img/bear.jpg");

width = 85;

height = 112;

setDis(65);

// TODO Auto-generated constructor stub

}

}

package com.sxt.beast;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.ArrayList;

import com.sxt.*;

public class Beast extends GameObject {

public ArrayList<Beast> beastList = new ArrayList<Beast>();

int width;

int height;

// 初始坐标

int initialX;

int initialY;

// 有没有仇恨值

public boolean isAggressive = false;

// 复活的元素

Beast beast = null;

public Beast(GameFrame gameFrame) {

super(gameFrame);

beastList.add(new RedBuff(3045, 3170, gameFrame));

beastList.add(new Bear(2800, 2855, gameFrame));

beastList.add(new Bird(3570, 3380, gameFrame));

beastList.add(new Xiyi(4585, 2365, gameFrame));

beastList.add(new BlueBuff(4025, 2295, gameFrame));

beastList.add(new Wolf(4235, 1945, gameFrame));

}

public Beast(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

setHp(1000);

setCurrentHp(getHp());

setSpd(10);

setAttackCoolDownTime(2000);

initialX = getX();

initialY = getY();

beast = this;

}

public void moveToTarget() {

double dis = getDis(getX(), getY(), getTarget().getX(), getTarget().getY());

if (dis > 500) {

isAggressive = false;

setHasTarget(false);

} else {

int xSpeed = (int) (getSpd() * (getTarget().getX() - getX()) / dis);

int ySpeed = (int) (getSpd() * (getTarget().getY() - getY()) / dis);

setX(getX() + xSpeed);

setY(getY() + ySpeed);

}

}

public void moveToInitialLocation() {

double dis = getDis(getX(), getY(), initialX, initialY);

if (dis < getSpd()) {

setX(initialX);

setY(initialY);

isAggressive = true;

} else {

int xSpeed = (int) (getSpd() * (initialX - getX()) / dis);

int ySpeed = (int) (getSpd() * (initialY - getY()) / dis);

setX(getX() + xSpeed);

setY(getY() + ySpeed);

}

}

/**

判断有没有目标及野怪的仇恨值(又没有攻击性)

true,判断是否到攻击范围

false,向目标移动,若中途离开出生点距离大于300或与目标距离大于400,则不再有攻击性。

true,发射子弹,线程开始

false,没有目标,回到出生地,自动回血,再次有攻击性

*/

public void move() {

if (isHasTarget() && isAggressive) {

if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), getDis())) {

moveToTarget();

} else if (isAttackCoolDown() && isAlive()) {

Bullet bullet = new Bullet(gameFrame, this, getTarget(), 500, 50, "img/bullet.gif");

gameFrame.objList.add(bullet);

new AttackCD().start();

}

} else {

moveToInitialLocation();

if (getCurrentHp() < getHp()) {

setCurrentHp(getCurrentHp() + 100);

}

}

}

@Override

public void paintSelf(Graphics g) {

// TODO Auto-generated method stub// 生命值为0

if (getCurrentHp() <= 0) {

System.out.println("beast die");

setAlive(false);

gameFrame.removeList.add(this);

gameFrame.beast.beastList.remove(this);

new ReviveCD().start();

} else {

// 添加生命值

addHp(g, width / 2, 80, width, 20, Color.GREEN);

g.drawImage(getImg(), getX() - width / 2, getY() - height / 2, null);

g.setColor(Color.RED);

g.fillOval(getX(), getY(), 10, 10);

g.drawOval(getX() - getDis(), getY() - getDis(), 2 * getDis(), 2 * getDis());

move();

}

}

@Override

public Rectangle getRec() {

// TODO Auto-generated method stub

return new Rectangle(getX() - width / 2, getY() - height / 2, width, height);

}

class AttackCD extends Thread {

public void run() {

// 将攻击功能设置为冷却状态

setAttackCoolDown(false);

// 线程休眠

try {

Thread.sleep(getAttackCoolDownTime());

} catch (Exception e) {

e.printStackTrace();

}

// 将攻击功能设置为攻击状态

setAttackCoolDown(true);

// 线程终止

this.stop();

}

}

class ReviveCD extends Thread {

public void run() {

// 线程休眠

try {

Thread.sleep(5000);

} catch (Exception e) {

e.printStackTrace();

}

Beast reviveBeast;

if (beast instanceof RedBuff) {

reviveBeast = new RedBuff(3045, 3170, gameFrame);

} else if (beast instanceof Bear) {

reviveBeast = new Bear(2800, 2855, gameFrame);

} else if (beast instanceof Bird) {

reviveBeast = new Bird(3570, 3380, gameFrame);

} else if (beast instanceof Xiyi) {

reviveBeast = new Xiyi(4585, 2365, gameFrame);

} else if (beast instanceof BlueBuff) {

reviveBeast = new BlueBuff(4025, 2295, gameFrame);

} else {

reviveBeast = new Wolf(4235, 1945, gameFrame);

}

gameFrame.objList.add(reviveBeast);

gameFrame.beast.beastList.add(reviveBeast);

}

}

}

package com.sxt.beast;

import com.sxt.GameFrame;

public class Bird extends Beast {

public Bird(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

setImg("img/红隼.jpg");

width = 122;

height = 98;

setDis(125);

// TODO Auto-generated constructor stub

}

}

package com.sxt.beast;

import com.sxt.GameFrame;

public class BlueBuff extends Beast {

public BlueBuff(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

setImg("img/blueBuff.jpg");

width = 142;

height = 176;

setDis(70);

// TODO Auto-generated constructor stub

}

}

package com.sxt.beast;

import com.sxt.GameFrame;

public class RedBuff extends Beast {

public RedBuff(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

setImg("img/redBuff.jpg");

width = 103;

height = 150;

setDis(70);

// TODO Auto-generated constructor stub

}

}

package com.sxt.beast;

import com.sxt.GameFrame;

public class Wolf extends Beast {

public Wolf(int x, int y, GameFrame gameFrame) {

super(x, y, gameFrame);

setImg("img/wolf.jpg");

width = 145;

height = 140;

setDis(65);

// TODO Auto-generated constructor stub

}

}

package com.sxt.beast;

import com.sxt.GameFrame;

public class 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

}

}

三.结果呈现

相关推荐
Thomas_YXQ3 小时前
Unity3D Lua如何支持面向对象详解
开发语言·游戏·junit·性能优化·lua·unity3d
java_python源码5 小时前
[含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的游戏用户行为分析与个性化推荐系统
python·游戏
峰度偏偏1 天前
【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配
算法·游戏·unity·ue5·ue4·godot
恩爸编程2 天前
纯前端js完成游戏吃豆人
前端·javascript·游戏·游戏程序·开源软件·游戏策划·游戏机
infiniteWei2 天前
【ChatGPT】实现贪吃蛇游戏
游戏·chatgpt
FairGuard手游加固2 天前
FairGuard游戏加固实机演示
游戏
Mac分享吧2 天前
狂野飙车8+(Asphalt 8+) for Mac 赛车竞速游戏 安装教程
游戏·macos·游戏程序·macbook·玩游戏·苹果电脑·狂野飙车
kim56593 天前
excel版数独游戏(已完成)
算法·游戏·excel·数独
qiaoqiaohonghu3 天前
c/c++ 用easyx图形库写一个射击游戏
c语言·c++·游戏
叫我:松哥3 天前
基于python flask的网页五子棋实现,包括多种语言,可以悔棋、重新开始
开发语言·python·算法·游戏·flask