Java王者荣耀
GameFrame
图片
package 王者荣耀;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.swing.JButton;
import javax.swing.JFrame;public class GameFrame extends JFrame {/*** */private static final long serialVersionUID = 1L;// 游戏开始 0, 游戏胜利1,游戏失败2int state = 0;// 窗口尺寸final int windowWidth = 1400;final int windowHeight = 700;// 双缓冲图片private Image offScreenImage = null;// 攻击图片private Image attack = Toolkit.getDefaultToolkit().getImage("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\attack.jpg");//游戏胜利失败图片private Image gameWin = Toolkit.getDefaultToolkit().getImage("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\gameWin.png");private Image gameLose = Toolkit.getDefaultToolkit().getImage("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\gameLose.png");// 游戏背景Background background = new Background(this);// 游戏玩家Champion player = new ChampionDaji(this);// 双方小兵MinionBlue mb = new MinionBlue(this);MinionRed mr = new MinionRed(this);//野怪public Beast beast = new Beast(this);// 防御塔Turret turret = new Turret(this);// 游戏元素列表public ArrayList<GameObject> objList = new ArrayList<>();ArrayList<GameObject> redList = new ArrayList<>();// 红色方ArrayList<GameObject> blueList = new ArrayList<>();// 蓝色方public ArrayList<GameObject> removeList = new ArrayList<>();// 存放将要删除的元素public void launch() {// 设置尺寸setSize(windowWidth, windowHeight);// 窗口居中setLocationRelativeTo(null);// 关闭事件setDefaultCloseOperation(3);// 用户不能调整窗口大小setResizable(false);// 标题setTitle("王者荣耀");// 窗口可见setVisible(true);// 添加键盘监视器this.addKeyListener(new GameFrame.KeyMonitor());// 添加游戏元素objList.add(background);objList.add(player);objList.addAll(beast.beastList);objList.addAll(turret.turretList);for (int i = 0; i < 4; i++) {blueList.add(turret.turretList.get(i));}for (int i = 4; i < 8; i++) {redList.add(turret.turretList.get(i));}/*** 攻击按钮*/JButton button = new JButton();button.setSize(130, 132);button.setLocation(1150, 430);button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 按钮事件player.attack(redList);}});this.add(button);player.addButton();while (true) {mb.createMinion(this, blueList);mr.createMinion(this, redList);repaint();try {Thread.sleep(25);} 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){turret.isLive();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 ==1) {//游戏胜利gImage.drawImage(gameWin, player.getX()-700, player.getY()-300 , null);} else if (state == 2) {//游戏失败gImage.drawImage(gameLose, player.getX()-700, player.getY()-300, null);}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 {@Overridepublic void keyPressed(KeyEvent e) {int key = e.getKeyCode();player.keyPressed(e);}@Overridepublic void keyReleased(KeyEvent e) {int key = e.getKeyCode();player.keyReleased(e);}}static Clip clip;}
GameObject
package 王者荣耀;import java.awt.*;
import java.util.ArrayList;//游戏元素的父类
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() {}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) {// 矩形于圆相交: 圆心到至少一个矩形定点的距离小于rif ((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);}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;}}}}}//public abstract void addTurret();class AttackCD extends Thread {public void run() {// 将攻击功能设置为冷却状态setAttackCoolDown(false);// 线程休眠try {Thread.sleep(attackCoolDownTime);} catch (Exception e) {e.printStackTrace();}// 将攻击功能设置为攻击状态setAttackCoolDown(true);// 线程终止this.interrupt();}}// 绘制元素public abstract void paintSelf(Graphics g);// 返回矩形public abstract Rectangle getRec();public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Image getImg() {return img;}public void setImg(String img) {this.img = Toolkit.getDefaultToolkit().getImage(img);}public int getSpd() {return spd;}public void setSpd(int spd) {this.spd = spd;}public int getHp() {return hp;}public void setHp(int hp) {this.hp = hp;}public int getCurrentHp() {return currentHp;}public void setCurrentHp(int currentHp) {this.currentHp = currentHp;}public GameObject getTarget() {return target;}public void setTarget(GameObject target) {this.target = target;}public boolean isHasTarget() {return hasTarget;}public void setHasTarget(boolean hasTarget) {this.hasTarget = hasTarget;}public int getDis() {return dis;}public void setDis(int dis) {this.dis = dis;}public int getAttackCoolDownTime() {return attackCoolDownTime;}public void setAttackCoolDownTime(int attackCoolDownTime) {this.attackCoolDownTime = attackCoolDownTime;}public boolean isAttackCoolDown() {return attackCoolDown;}public void setAttackCoolDown(boolean attackCoolDown) {this.attackCoolDown = attackCoolDown;}public boolean isAlive() {return alive;}public void setAlive(boolean alive) {this.alive = alive;}
}
Turret
package 王者荣耀;import java.awt.*;
import java.util.ArrayList;
//防御塔类
public class Turret extends GameObject{ArrayList<Turret> turretList = new ArrayList<>();public Turret turretBlueOne;public Turret turretBlueTwo;public Turret turretBlueThree;public Turret turretBlueBase;public Turret turretRedOne;public Turret turretRedTwo;public Turret turretRedThree;public Turret turretRedBase;public Turret(GameFrame gameFrame) {super(gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\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));}public Turret(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\turret.png");setHp(6000);setCurrentHp(getHp());setAttackCoolDownTime(1000);setDis(300);}public void isLive(){if(gameFrame.turret.turretBlueBase.getCurrentHp()==0){gameFrame.state=2;}if(gameFrame.turret.turretRedBase.getCurrentHp()==0){gameFrame.state=1;}}@Overridepublic void paintSelf(Graphics g) {// 生命值为0if (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.fillOval(getX(), getY(), 10, 10);g.drawRect(getX() - 50, getY() - 100, 100, 180);g.drawOval(getX() - 300, getY() - 300, 600, 600);}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - 50, getY() - 100, 100, 180);}
}
TurretBlue
package 王者荣耀;//蓝方防御塔
public class TurretBlue extends Turret{public TurretBlue(GameFrame gameFrame){super(gameFrame);}public TurretBlue(int x,int y,GameFrame gameFrame){super(x,y,gameFrame);}
}
TurretRed
package 王者荣耀;//蓝方防御塔
public class TurretRed extends Turret{//有参构造public TurretRed(GameFrame gameFrame){super(gameFrame);}public TurretRed(int x,int y,GameFrame gameFrame){super(x,y,gameFrame);}
}
Champion
package 王者荣耀;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;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;//技能冷却时间int coolDownTimeOne;int coolDownTimeTwo;int coolDownTimeThree;//三个技能是否处于冷却状态boolean coolDownOne = true;boolean coolDownTwo = true;boolean coolDownThree = true;static {for (int i = 1; i < 8; i++) {imgs[i] = "D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\move" + i +".png";}}public Champion(GameFrame gameFrame) {super(gameFrame);//定义英雄的图片和坐标setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\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("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\stand.png");}}//添加三个技能按钮public void addButton() {JButton button1 = new JButton();button1.setSize(100, 100);button1.setLocation(1056, 513);button1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {abilityOne();}});JButton button2 = new JButton();button2.setSize(100, 100);button2.setLocation(1090, 370);button2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {abilityTwo();}});JButton button3 = new JButton();button3.setSize(100, 100);button3.setLocation(1220, 300);button3.addActionListener(new ActionListener() {@Overridepublic 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);@Overridepublic void paintSelf(Graphics g) {// 生命值为0if (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);}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - 30, getY() - 60, 60, 120);}}
ChampionDaji
package 王者荣耀;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;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("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\Daji\\abilityOne.jpg");abilityTwo = Toolkit.getDefaultToolkit().getImage("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\Daji\\abilityTwo.jpg");abilityThree = Toolkit.getDefaultToolkit().getImage("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\Daji\\abilityThree.jpg");// 三个技能冷却时间coolDownTimeOne = 3000;coolDownTimeTwo = 5000;coolDownTimeThree = 8000;}public void exit() {this.gameFrame.removeMouseListener(m);}public void abilityOneMove() {p.translate((int) (50 * cos), -(int) (50 * sin));for (GameObject redObj : gameFrame.redList) {// 是红色方小兵 && 发生碰撞 && 没在attacked列表里if (redObj instanceof MinionRed && p.intersects(redObj.getRec()) && attacked.indexOf(redObj) == -1) {// 小兵扣血,添加到attacked里redObj.setCurrentHp(redObj.getCurrentHp() - 400);attacked.add(redObj);}}}@Overridepublic void abilityOne() {if (coolDownOne) {m = new MouseMonitor();p = new Polygon();gameFrame.addMouseListener(m);attacked = new ArrayList<GameObject>();}}public void abilityTwo() {if (coolDownTwo) {boolean find = false;for (GameObject redObj : gameFrame.objList) {// 是红色小兵 && 距离小于250 && 存活if (redObj instanceof MinionRed && recIntersectsCir(redObj.getRec(), getX(), getY(), 250)&& redObj.isAlive()) {// 添加子弹abilityTwoBullet = new Bullet(gameFrame, this, redObj, 250, 60, "D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\Daji\\abilityTwoBullet.png");gameFrame.objList.add(abilityTwoBullet);// 给目标赋值abilityTwoTarget = redObj;// 释放二技能ifAbilityTwo = true;find = true;break;}}if (find) {new AbilityTwoCD().start();find = false;}}}/*** 点击技能三释放技能 先将技能范围内目标储存到targetList里 提前定义五个子弹 技能释放时初始化五个子弹 子弹目标从targetList里随机选择* 如果期间目标死亡,制作一个目标替身,生命值设置为true 子弹与目标或替身碰撞后消失*/@Overridepublic void abilityThree() {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 && 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, 150, 60,"D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\Daji\\abilityTwoBullet.png");} else {bulletList[count] = new Bullet(gameFrame, this, targetList.get(r), 150, 60,"D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\Daji\\abilityTwoBullet.png");}count++;}new AbilityThreeBulletCD().start();// 三技能进入冷却new AbilityThreeCD().start();}}}@Overridepublic void abilityEffect(Graphics g) {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.interrupt();}}// 技能二冷却时间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.interrupt();}}// 技能二控制时间class AbilityControllCD extends Thread {public void run() {abilityTwoTarget.beControlled = true;// 线程休眠try {Thread.sleep(20000);} catch (Exception e) {e.printStackTrace();}abilityTwoTarget.beControlled = false;this.interrupt();}}//技能三冷却状态class AbilityThreeCD extends Thread {public void run() {// 将攻击功能设置为冷却状态coolDownThree = false;// 休眠try {int three = coolDownTimeThree;while (coolDownTimeThree > 0) {Thread.sleep(1000);System.out.println("技能三冷却时间: " + coolDownTimeThree / 1000);coolDownTimeThree -= 1000;}coolDownTimeThree = three;} catch (Exception e) {e.printStackTrace();}// 将攻击功能解除冷却状态coolDownThree = true;// 线程终止this.interrupt();}}class AbilityThreeBulletCD extends Thread {public void run() {// 休眠try {System.out.println("Thread start");gameFrame.objList.add(bulletList[0]);Thread.sleep(100);gameFrame.objList.add(bulletList[1]);Thread.sleep(100);gameFrame.objList.add(bulletList[2]);Thread.sleep(100);gameFrame.objList.add(bulletList[3]);Thread.sleep(100);gameFrame.objList.add(bulletList[4]);} catch (Exception e) {e.printStackTrace();}// 线程终止this.interrupt();}}// 鼠标监视器private class MouseMonitor extends MouseAdapter {@Overridepublic 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;}}
}
Minion
package 王者荣耀;import java.awt.*;
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);}/*** (1325, 3750) (4425, 3750) (5050, 3125) (5050, 1125)*/public abstract void move(ArrayList<GameObject> objList);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() {int dis = (int) getDis(getX(), getY(), getTarget().getX(), getTarget().getY());if(dis!=0) {int xSpeed = (getSpd() * (getTarget().getX() - getX()) / dis);int ySpeed = (getSpd() * (getTarget().getY() - getY()) / dis);setX(getX() + xSpeed);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.5stry {Thread.sleep(1500);} catch (Exception e) {e.printStackTrace();}nextMinion = true;// 线程终止this.interrupt();}}// 每波小兵生成时间class NextLine extends Thread {public void run() {nextLine = false;// 休眠15stry {Thread.sleep(15000);} catch (Exception e) {e.printStackTrace();}nextLine = true;// 线程终止this.interrupt();}}@Overridepublic void paintSelf(Graphics g) {// 生命值为0if (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);g.drawOval(getX() - 200, getY() - 200, 400, 400);// 小兵移动if (!beControlled) {if (this instanceof MinionBlue) {move(gameFrame.redList);} else {move(gameFrame.blueList);}}}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - 16, getY() - 16, 45, 45);}public boolean isIfFindTarget() {return ifFindTarget;}public void setIfFindTarget(boolean ifFindTarget) {this.ifFindTarget = ifFindTarget;}}
MinionBlue类、MinionRed类所需图片
MinionBlue
package 王者荣耀;import java.util.ArrayList;public class MinionBlue extends Minion{public MinionBlue(GameFrame gameFrame) {super(gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\minion\\blue.jpg");setX(1325);setY(3750);}@Overridepublic void move(ArrayList<GameObject> objList) {if(isIfFindTarget()) {//离开检测范围if(!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {setIfFindTarget(false);}else {if(!isHasTarget()) {moveToTarget();}attack(objList);}}else {findTarget(objList);//原路线移动if(getX() < 4425) {setSpd(5);setX(getX() + getSpd());}else if(getX() < 5100 && getX() >= 4425) {setSpd(20);setX(getX() + getSpd());setY(getY() - getSpd());}else if(getX() >= 4900) {setSpd(18);setY(getY() - getSpd());}}}
}
MinionRed
package 王者荣耀;import java.util.ArrayList;public class MinionRed extends Minion {public MinionRed(GameFrame gameFrame) {super(gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\minion\\red.jpg");setX(5050);setY(1125);}@Overridepublic void move(ArrayList<GameObject> objList) {if (isIfFindTarget()) {// 离开检测范围if (!recIntersectsCir(getTarget().getRec(), getX(), getY(), 200)) {setIfFindTarget(false);} else {if (!isHasTarget()) {moveToTarget();}attack(objList);}} else {findTarget(objList);// 原路线移动if (getY() < 3125) {setSpd(28);setY(getY() + getSpd());} else if (getY() < 3750 && getY() >= 3125) {setSpd(20);setY(getY() + getSpd());setX(getX() - getSpd());} else if (getY() >= 3750) {setSpd(25);setX(getX() - getSpd());}}}}
Bullet
package 王者荣耀;import java.awt.*;//子弹类
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);}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);}public Bullet() {super();}public void move() {//子弹与目标碰撞,子弹消失,目标减血if (recIntersectsRec(getRec(), target.getRec())) {target.setCurrentHp(target.getCurrentHp() - getAd());gameFrame.removeList.add(this);}int dis = (int) getDis(getX(), getY(), target.getX(), target.getY());if (dis != 0) {int xSpeed = (getSpd() * (target.getX() - getX()) / dis);int ySpeed = (getSpd() * (target.getY() - getY()) / dis);setX(getX() + xSpeed);setY(getY() + ySpeed);}}@Overridepublic void paintSelf(Graphics g) {g.drawImage(getImg(), getX()-16, getY()-16, null);g.setColor(Color.BLACK);g.fillOval(getX()-5, getY()-5, 10, 10);g.drawRect(getX()-5, getY()-5, 10, 10);move();}@Overridepublic Rectangle getRec() {return new Rectangle(getX()-5, getY()-5, 10, 10);}public int getAd() {return ad;}public void setAd(int ad) {this.ad = ad;}
}
Background
package 王者荣耀;import java.awt.*;
//背景类
public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg = Toolkit.getDefaultToolkit().getImage("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\Map.jpg");public void paintSelf(Graphics g){g.drawImage(bg,0,0,null);}@Overridepublic Rectangle getRec() {return null;}
}
Beast
package 王者荣耀;import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;public class Beast extends GameObject {public ArrayList<Beast> beastList = new ArrayList<>();int width;int height;// 复活的元素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());beast = this;}@Overridepublic void paintSelf(Graphics g) {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());}}@Overridepublic Rectangle getRec() {return new Rectangle(getX() - width / 2, getY() - height / 2, width, height);}//野怪复活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);}}}
Bear类、Bird类、BlueBuff类、RedBuff类、Wolf类、Xiyi类所需图片
Bear
package 王者荣耀;public class Bear extends Beast {public Bear(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\beast\\bear.jpg");width = 85;height = 112;setDis(65);}}
Bird
package 王者荣耀;public class Bird extends Beast {public Bird(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\beast\\红隼.jpg");width = 122;height = 98;setDis(125);}}
BlueBuff
package 王者荣耀;public class BlueBuff extends Beast {public BlueBuff(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\beast\\blueBuff.jpg");width = 142;height = 176;setDis(70);}}
RedBuff
package 王者荣耀;public class RedBuff extends Beast {public RedBuff(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\beast\\redBuff.jpg");width = 103;height = 150;setDis(70);}
}
Wolf
package 王者荣耀;public class Wolf extends Beast {public Wolf(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\beast\\wolf.jpg");width = 145;height = 140;setDis(65);}}
Xiyi
package 王者荣耀;
public class Xiyi extends Beast {public Xiyi(int x, int y, GameFrame gameFrame) {super(x, y, gameFrame);setImg("D:\\Java\\王者荣耀图片(1)(1)\\王者荣耀图片\\beast\\蜥蜴.jpg");width = 111;height = 65;setDis(125);}
}
相关文章:

Java王者荣耀
GameFrame 图片 package 王者荣耀;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;import javax.soun…...

【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令
🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🍠操作寄存器实现UART🍟UART原理🍟编程 🍠…...
python 左值查找 右值查找
左值查找 在一组数据中查找出 数字x 在这组数据中第一次出现的索引并输出,没有找到则输出-1查找方式:二分查找 数据前提:一组数据要有序一组数据: arr [2, 3, 3, 3, 5, 7, 9, 11, 13, 15, 17]测试: 示例1ÿ…...
机器学习之自监督学习(四)MoCo系列翻译与总结(二)
MoCo中相关工作的对比分析 去噪自动编码器(Denoising Autoencoder)是一种用于学习数据表示的神经网络模型。它的主要目标是通过去除输入数据中的噪声,学习到输入数据的有用表示,从而提高模型对干净数据的鲁棒性。下面是对去噪自动…...
元宇宙企业3d数字展厅轻松低本搭建更全面、多元、趣味化的展览
对所有企业来说,拥有一个3D线上展厅是互联网营销必不可少的部分,但是3D线上展厅定制周期长费用高,让很多企业公司望而却步,web3d开发公司制作的3D线上企业展厅制作平台备导览地图、语音解说、交互热点、全景漫游、自主行走、链接跳…...
华为OD机试真题-开源项目热榜-2023年OD统一考试(C卷)
题目描述: 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue、MR的数量,开源项目的热…...

深入探索Maven:优雅构建Java项目的新方式(一)
Maven高级 1,分模块开发1.1 分模块开发设计1.2 分模块开发实现 2,依赖管理2.1 依赖传递与冲突问题2.2 可选依赖和排除依赖方案一:可选依赖方案二:排除依赖 3,聚合和继承3.1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤…...

Shopee如何入驻?如何防封?
Shopee作为东南亚领航电商平台,面向东南亚蓝海市场,近年来随着东南亚市场蒸蒸日上,虾皮也吸引了大批量的跨境商家入驻。那么接下来就给想要入驻的虾皮小白一个详细的安全入驻教程。 一、商家如何入驻 虾皮与LAZADA最大的区别就是商家即卖家&…...

2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书
2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书 2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷A模块基础设施设置/安全加固(200分)A-1:登录安全加固(Windows, Linux&am…...

Python编程基础
Python是一种简单易学的编程语言,广泛应用于Web开发、数据分析、人工智能等领域。无论您是初学者还是有一定编程经验的人士,都可以从Python的基础知识开始建立自己的编程技能。 目录 理论Python语言的发展程序设计语言的分类静态语言与脚本语言的区别 代…...

python类和对象
1.使用对象组织数据 class Student:nameNone #记录名字 stu1Student() #创建对象 stu1.name"abc" #为对象属性赋值2.类的定义和使用 2.1成员方法的定义语法 传参的时候self是透明的,不用管 class Stu:nameNonedef sayHi(self):print(f"你好&#x…...

ubuntu操作系统中docker下Hadoop分布式前置环境配置实验
版本: centos7 hadoop 3.1.3 java JDK:1.8 集群规划: masterslave1slave2HDFS NameNode DataNode DataNode SecondryNameNode DataNode YARNNodeManager ResourceManage NodeManager NodeManager 1.docker容器: 把普通用户加入到docker组&am…...

【Linux学习笔记】protobuf 基本数据编码
https://zhuanlan.zhihu.com/p/557457644https://zhuanlan.zhihu.com/p/557457644 [新文导读] 从Base64到Protobuf,详解Protobuf的数据编码原理本篇将从Base64再到Base128编码,带你一起从底层来理解Protobuf的数据编码原理。本文结构总体与 Protobuf 官…...

OpenCV快速入门:图像分析——图像分割和图像修复
文章目录 前言一、图像分割1.1 漫水填充法1.1.1 漫水填充法原理1.1.2 漫水填充法实现步骤1.1.3 代码实现 1.2 分水岭法1.2.1 分水岭法原理1.2.2 分水岭法实现步骤1.2.3 代码实现 1.3 GrabCut法1.3.1 GrabCut法原理1.3.2 GrabCut法实现步骤1.3.3 代码实现 1.4 Mean-Shift法1.4.1…...

BART - 磁共振重建库 linux系统安装 MATLAB 使用
本文主要介绍如何在linux系统中安装伯克利大学的磁共振重建库BART 和在matlab中的配置使用。 安装必要的库 (linux 命令行) $ sudo apt-get install make gcc libfftw3-dev liblapacke-dev libpng-dev libopenblas-dev 下载编译BART 文件 (官网链接:BART Toolbox) 命令行下…...
在linux下在官网的nginxtar包 的安装方式并配置全局变量
在Linux系统中,Nginx是一种流行的Web服务器和反向代理服务器,它可以提供高性能的静态内容服务和动态内容服务。本文将详细介绍如何在Linux系统中安装Nginx,并配置全局变量。 安装Nginx 以下是在Linux系统中安装Nginx的步骤: 1.…...
Java中数据库查询方法MapListProcessor的应用
1.供应链系统的销售合同捉过了两个金额一样的,同一个项目 2.合同号也一样,oaid不一样,但是从OA前台只有一个 3.一个是建云的一个是泛微的 4.做下过滤,如果同一个合同编号,在泛微里面有的,建云的就不获取了 …...

一键换肤功能
使用css3的css变量来实现 示例: 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&qu…...

Oracle SQL 注入上的 Django GIS 函数和聚合漏洞 (CVE-2020-9402)
漏洞描述 Django 于2020年3 月4日发布了一个安全更新,修复了 GIS 函数和聚合中的 SQL 注入漏洞。 参考链接: Django security releases issued: 3.0.4, 2.2.11, and 1.11.29 | Weblog | Django 该漏洞要求开发者使用 JSONField/HStoreField;此外&…...
MYSQL 排序和分组怎么做?
文章目录 前言MySQL 排序语法在命令提示符中使用 ORDER BY 子句在PHP脚本中使用 ORDER BY 子句 MySQL 分组GROUP BY 语法实例演示使用 WITH ROLLUP 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱👓博…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...