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码转成的二维码显示在…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

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

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...