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;
}
}
2.
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;
}
}
3.
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
}
}
三.结果呈现
相关文章:

java简易制作-王者荣耀游戏
一.准备工作 首先创建一个新的Java项目命名为“王者荣耀”,并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 创建一个名为“img”的文件夹来储存所需的图片素材。 二.代码呈现 package com.sxt; import javax…...

手撕分布式缓存---多节点的调取
经过上一个章节的学习,我们已经知晓了如何搭建了HTTP Server,通过HTTP协议与我们定义的路由,我们可以远程访问这个节点;基于这一点,我们可以部署多台实现了HTTP的缓存服务从而实现分布式的特性。这一章节我们要基于此背…...

C/C++编程中的算法实现技巧与案例分析
C/C编程语言因其高效、灵活和底层的特性,被广大开发者用于实现各种复杂算法。本文将通过10个具体的算法案例,详细探讨C/C在算法实现中的技巧和应用。 一、冒泡排序(Bubble Sort) 冒泡排序(Bubble Sort)是一…...

干货分享 | 如何在TSMaster中对常用总线报文信号进行过滤?
TSMaster软件平台支持对不同总线(CAN、LIN、FlexRay)的报文和信号过滤,过滤方法一般有全局接收过滤、数据流过滤、窗口过滤、字符串过滤、可编程过滤,针对不同的总线信号过滤器的使用方法也基本相同。今天重点和大家分享一下关于T…...

k8s链接数据库故障Waiting for table metadata lock
场景:早上来发现一个程序,链接mysql数据库有点问题,随后排查,因为容器在k8s里面。所以尝试重启了pod没有效果 一、重启pod: 这里是几种在Kubernetes中重启Pod的方法: 删除Pod,利用Deployment重建 kubectl delete pod mypodDepl…...

数字经济如何驱动企业高质量发展? ——核心机制、模式选择与推进路径
文章目录 每日一句正能量前言核心机制信息化和智能化作为数字经济的核心机制信息化和智能化如何提升企业生产效率和管理水平数据的获取、分析和利用对企业发展的影响 模式选择电子商务模式的选择共享经济模式的选择数据驱动的业务模式选择 推进路径建设数字化基础设施培养数字化…...
机器学习——支持向量机
目录 一、基于最大间隔分隔数据 二、寻找最大间隔 1. 最大间隔 2. 拉格朗日乘子法 3. 对偶问题 三、SMO高效优化算法 四、软间隔 五、SMO算法实现 1. 简化版SMO算法 2. 完整版SMO算法 3. 可视化决策结果 六、核函数 1. 线性不可分——高维可分 2. 核函数 …...
mq的作用
使用mq优点 mq是一种常见的中间件,在项目中经常用到,它具有异步、解耦、削峰填谷的作用。 异步 比如下单流程,A服务—>B服务,总的耗时是A耗时时间B耗时时间,而改为A—>mq---->B后,A发送mq后立刻…...

AUTOSAR组织引入了Rust语言的原因是什么?有哪些好处?与C++相比它有什么优点?并推荐一些入门学习Rust语言链接等
AUTOSAR(汽车开放系统架构)是一个由汽车制造商、供应商和其他来自电子、半导体和软件行业的公司组成的全球发展伙伴关系,自2003年以来一直致力于为汽车行业开发和引入开放、标准化的软件平台。 AUTOSAR 最近宣布成立一个新的工作组,用于探索在汽车软件中使用 Rust 编程语言…...

基于PyCharm实现串口GUI编程
工具效果如下如所示 下面简单介绍一下操作流程 1.打开PyCharm软件 2.创建一个工程 3.给该工程命名 4.在main.py里面黏贴如下的代码 # This is a sample Python script. # Press ShiftF10 to execute it or replace it with your code. # Press Double Shift to search everyw…...

【1.8计算机组成与体系结构】磁盘管理
目录 1.磁盘基本结构与存取过程1.1 磁盘基本结构1.2 磁盘的存取过程 2.磁盘优化分布存储3.磁盘单缓冲区与双缓冲区4.磁盘移臂调度算法 1.磁盘基本结构与存取过程 1.1 磁盘基本结构 磁盘:柱面,磁道,扇区。 1.2 磁盘的存取过程 存取时间寻…...
1663:【 例 1】取石子游戏 1
【题目描述】 有一种有趣的游戏,玩法如下: 玩家: 2 人; 道具: N 颗石子; 规则: 1、游戏双方轮流取石子; 2、每人每次取走若干颗石子(最少取 1 颗,最多取…...
Django去访问web api接口Object of type Session is not JSON serializable
解决方案:settings.py中加入 :SESSION_SERIALIZER django.contrib.sessions.serializers.PickleSerializer 事由:Django去访问一个web api接口,两次连接之间需要通过Session()保持身份验证。 def sendCode(request): mobile jso…...

每日一题,二维平面
给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形,请你计算并返回两个矩形覆盖的总面积。 每个矩形由其 左下 顶点和 右上 顶点坐标表示: 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。 第二个矩形由其左下顶点 (bx1, …...
【jupyter notebook】jupyter notebook 调用另一个jupyter notebook 的函数
总结 使用 %run 魔法命令将 Notebook 转换为py文件使用 nbimporter 库手动复制代码优点notebook最前面加上即可最基本方法就跟导入py文件一样,不会被执行一遍快缺点所有的代码都会执行一遍修改原文件就要重新转换,且 从自定义的 .py 文件中导入函数时&a…...

Linux--学习记录(3)
G重要编译参数 -g(GDB调试) -g选项告诉gcc产生能被GNU调试器GDB使用的调试信息,以调试程序编译带调试信息的可执行文件g -g hello.c -o hello编译过程: -E(预处理) g -E hello.c -o hello.i-S(编…...

自然语言处理阅读第一弹
Transformer架构 encoder和decoder区别 Embeddings from Language Model (ELMO) 一种基于上下文的预训练模型,用于生成具有语境的词向量。原理讲解ELMO中的几个问题 Bidirectional Encoder Representations from Transformers (BERT) BERT就是原生transformer中的Encoder两…...

Spring Boot+Mybatis设置sql日志打印
在全局配置文件添加以下内容:logging.level.com.demo.mapperdebug,com.demo.mapper:src下的mapper路径,debug:设置日志打印级别为debug,亦可设置为:ERROR、WARN、INFO application.properties …...

步进电机电流设置的3种方法
本文介绍步进电机电流设置的3种方法。 步进电机电流设置包括运行电流(IRun)和保持电流(IHold)2种。电机运行时需要有较大电流以保证有足够的力矩使物体运动,而停止的时候,为了减少电机发热及降低功耗&…...
uniapp-使用返回的base64转换成图片
在实际开发的时候 需要后端实时的给我返回二维码 他给我返回的是加密后的base64字符串 我需要利用这个base64转换到canvas画布上展示 或者以图片的形式展示在页面内 在canvas画布上展示 使用官方的uni.getFileSystemManager().writeFile()方法可将base64码转成的二维码显示在…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...