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

news2024/11/18 23:31:06

一.准备工作

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

三.结果呈现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能联盟的首件神兵利器——“Purple Llama” 项目,旨为保护工智能模型安全性

Meta公司&#xff08;Meta Platform Inc&#xff09;&#xff0c;原名Facebook&#xff0c;创立于2004年2月4日&#xff0c;市值5321.71亿美元。总部位于美国加利福尼亚州门洛帕克。 Meta 公司推出了名为“Purple Llama”的项目&#xff0c;旨在保护和加固其开源人工智能模型。…

【MODBUS】Modbus的3种传输方式

概述 1979年&#xff0c;Modicon 首先推出了串行Modbus标准&#xff0c;后来由于网络的普及&#xff0c;需要更高的传输速度&#xff0c;1997年制定了基于TCP网络的Modbus标准。 所以总的可分为两个传输模式:基于串行链路的和基于以太网TCP/IP的。但是我个人还是习惯分为3种传…

【MySQL 索引】InooDB 索引实现

1 索引定义 维基百科对数据库索引的定义: 数据库索引是数据库管理系统&#xff08;DBMS&#xff09;中的一个排序数据结构, 以协助快速查询和更新数据库表中的数据。 MongoDB对索引的定义: 索引是一种特殊的数据结构, 以有序和便于遍历的形式存储数据集合中特定字段或一组字段…

蓝桥杯专题-真题版含答案-【制作表格】【5位黑洞数】【泊松分酒】【亲密数】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

UG NX二次开发(C++)-库缺少需要的入口点的原因与解决方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、“库缺少需要的入口点”错误展示3、可能出现的原因与解决方案3.1 对于采用CTRL+U方式调用3.2 对于menu菜单下调用1、前言 在UG NX二次开发过程中,有时会遇到形形色色的bug,比如有个读…

可视化监控云平台/智能监控EasyCVR如何使用脚本创建ramdisk挂载并在ramdisk中临时运行

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防管理视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存…

【Spring Boot】内网穿透实现远程调用调试

文章目录 1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址 4.…

管理类联考——英语二——考点+记忆篇——大作文——表格

大作文Remarkablechangesconcerning主题词havebeenwitnessedinTheabovechartthoroughlyrevealedthefascinatingissue.Onecanseethat年份1,事物1wasonly数字1.ButwithinashortdurationofXyears,事物1bumpedto数字2in年份2.Apartfromthat,事物2hasenjoyedaslightdeclineduringthe…

基于3D-CGAN的跨模态MR脑肿瘤分割图像合成

3D CGAN BASED CROSS-MODALITY MR IMAGE SYNTHESIS FOR BRAIN TUMOR SEGMENTATION 基于3D-CGAN的跨模态MR脑肿瘤分割图像合成背景贡献实验方法Subject-specific local adaptive fusion&#xff08;针对特定主题的局部自适应融合&#xff09;Brain tumor segmentation model 损失…

外汇天眼:如果美元开始降息,会为市场带来哪些影响?

一、美元降息的影响 美元一旦开始降息&#xff0c;将对全球经济产生重要影响。 降息政策将带动美国内部的消费和投资增长。 透过降低借贷成本&#xff0c;鼓励个人和企业增加支出&#xff0c;刺激经济活动。 以最新数据为例&#xff0c;美国的消费者信心指数正在上升&#xff…

4.qml 3D-Light、DirectionalLight、PointLight、SpotLight、AxisHelper类深入学习

今天我们学习灯光类 首先来学习Light类&#xff0c;它是所有灯光的虚基类&#xff0c;该类是无法创建的&#xff0c;主要是为子类提供很多公共属性。 常用属性如下所示&#xff1a; ambientColor : color&#xff0c;该属性定义在被该光照亮之前应用于材质的环境颜色。默认值…

Halcon参考手册异常检测知识总结

1.1异常检测介绍 本章将介绍如何使用基于深度学习的异常检测和全局上下文异常检测。通过这两种方法&#xff0c;我们想要检测图像是否包含异常(异常是指偏离正常的事物&#xff0c;未知的事物)。 异常检测或全局上下文异常检测模型学习无异常图像的共同特征。经过训练的模型将…

CentOS7 OpenSSL升级到OpenSSH9.5p1

原文链接&#xff1a; CentOS7 OpenSSL升级1.1.1w&#xff1b;OpenSSH 升级 9.5p1 保姆级教程 openssl从3.1.0升级到3.1.1遇到的问题 注意操作时需要联网请参考如下链接 内网服务器联网安装依赖参见我的另一篇文章 一、 前言 OpenSSH 的加密功能需要用到OpenSSL&#xff0c;所…

STM32-UART-DMA HAL库缓冲收发

文章目录 1、说明1.1、注意事项&#xff1a;1.2、接收部分1.3、发送部分 2、代码2.1、初始化2.2、缓冲接收2.3、缓冲发送2.4、格式化打印 1、说明 1.1、注意事项&#xff1a; HAL库的DMA底层基本都会默认开启中断使能&#xff0c;如果在STM32CubeMx禁用了中断相关的功能&…

基于ssm企业人事管理系统的设计与实现论文

摘 要 进入信息时代以来&#xff0c;很多数据都需要配套软件协助处理&#xff0c;这样可以解决传统方式带来的管理困扰。比如耗时长&#xff0c;成本高&#xff0c;维护数据困难&#xff0c;数据易丢失等缺点。本次使用数据库工具MySQL和编程技术SSM开发的企业人事管理系统&am…

人工智能与天文:技术前沿与未来展望

人工智能与天文&#xff1a;技术前沿与未来展望 一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域的应用越来越广泛。在天文领域&#xff0c;AI也发挥着越来越重要的作用。本文将探讨人工智能与天文学的结合&#xff0c;以及这种结合带…

动态规划习题

动态规划的核心思想是利用子问题的解来构建整个问题的解。为此&#xff0c;我们通常使用一个表格或数组来存储子问题的解&#xff0c;以便在需要时进行查找和使用。 1.最大字段和 #include <iostream> using namespace std; #define M 200000int main() {int n, a[M], d…

STM32 寄存器配置笔记——I2C 读写AT24C02 EEPROM

一、简介 本文主要介绍STM32F10xx系列如何使用软件模拟I2C总线读写AT24C02的EEPROM数据。 二、概述 I2C协议是一种用于同步、半双工、串行总线(由单片机时钟线、单数据交换器数据线组成)上的协议。规定了总线空闲状态、起始条件、停止条件、数据有效性、字节格式、响应确认信号…

设计模式之建造者模式(二)

目录 概述概念角色类图适用场景 详述画小人业务类的介绍代码解析 建造者基本代码类介绍代码解析 总结设计原则其他 概述 概念 建造者模式是一种创建型设计模式&#xff0c;它可以将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 角色 …

Win11 TensorRT环境部署

一、CUDA和CUDNN安装 cuda和cudnn网上有很多安装教程&#xff0c;这里列举了一些&#xff0c;就不详细说了&#xff0c;具体链接如下&#xff1a; csdn.net - CUDA安装教程&#xff08;超详细&#xff09; 原创 zhihu.com - 深度学习之CUDACUDNN详细安装教程 tencent.com - C…