王者荣耀java版

键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮二:控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小兵每隔一段时间自动生成,在王者峡谷下路移动,遇到敌人则自动攻击。防御塔可以自动识别敌人进行攻击。野怪分为RedBuff,BlueBuff,普通野怪,死亡后都可以复活。游戏胜利的条件是红方水晶生命值为零,游戏失败条件是蓝方水晶生命值为零。游戏的设计模式为可以偷塔。

一、主窗口类

package com.sxt;
 
import com.sxt.beast.Beast;
 
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 {
    // 游戏开始 0, 游戏胜利1,游戏失败2
    int state = 0;
    // 窗口尺寸
    final int windowWidth = 1400;
    final  int windowHeight = 700;
    // 双缓冲图片
    private Image offScreenImage = null;
    // 攻击图片
    private Image attack = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\attack.jpg");
    //游戏胜利失败图片
    private Image gameWin = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\gameWin.png");
    private Image gameLose = Toolkit.getDefaultToolkit().getImage("C:\\Users\\23839\\IdeaProjects\\asd\\src\\imgs\\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);
        playMusic();
       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() {
            @Override
            public 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 {
        @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);
        }
    }
    static Clip clip;
    public static void playMusic() {
        try
        {
            //这里面放 绝对路径,音频必须是wav格式,用音频转换软件 把mp3 转成wav格式
            File musicPath = new File("C:\\Users\\23839\\IdeaProjects\\PlaneWar\\PlayMusic\\bgm.wav");
 
            if(musicPath.exists())
            {
                AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
                clip = AudioSystem.getClip();
                clip.open(audioInput);
                FloatControl gainControl = (FloatControl)clip.getControl(FloatControl.Type.MASTER_GAIN);
                gainControl.setValue(-20.0f);//设置音量,范围为 -60.0f 到 6.0f
                clip.start();
                clip.loop(Clip.LOOP_CONTINUOUSLY);
            }
            else
            {
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
 
}

二,游戏元素父类

作用:初始化基本变量,定义addHp()方法,两点之间的距离方法,矩形与矩形的碰撞检测方法,矩形与圆形的碰撞检测方法,定义防御塔,英雄,小兵的攻击方法,用线程实现攻击的冷却时间。

package com.sxt;
 
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) {
        // 矩形于圆相交: 圆心到至少一个矩形定点的距离小于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);
                }
                gameFrame.objList.add(bullet);
                // 线程开始
                new AttackCD().start();
            }
        } else {
            // 遍历列
以下是一个简单的Java王者荣耀小游戏的实现,包括背景和野怪类: 引用: ```java package com.sxt; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class GameFrame extends Frame { Image bg = GameUtil.getImage("images/bg.jpg"); Image planeImg = GameUtil.getImage("images/plane.png"); Plane plane = new Plane(planeImg,250,250); Shell[] shells = new Shell[50]; Explode bao; Date startTime = new Date(); Date endTime; int period;//游戏持续的时间 @Override public void paint(Graphics g) {//自动被调用。g相当于一只画笔 Color c = g.getColor(); g.drawImage(bg,0,0,null); plane.drawSelf(g);//画飞机 //画出所有的炮弹 for(int i=0;i<shells.length;i++){ shells[i].draw(g); //飞机和炮弹的碰撞检测 boolean peng = shells[i].getRect().intersects(plane.getRect()); if(peng){ plane.live = false; if(bao==null){ bao = new Explode(plane.x,plane.y); endTime = new Date(); period = (int)((endTime.getTime()-startTime.getTime())/1000); } bao.draw(g); break; } } if(!plane.live){ g.setColor(Color.RED); Font f = new Font("宋体",Font.BOLD,50); g.setFont(f); g.drawString("时间:"+period+"秒",int)plane.x,(int)plane.y); } g.setColor(c); } //帮助我们反复重画窗口! class PaintThread extends Thread{ @Override public void run() { while(true){ repaint();//重画 try { Thread.sleep(40);//1s=1000ms } catch (InterruptedException e) { e.printStackTrace(); } } } } //定义键盘监听的内部类 class KeyMonitor extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { plane.addDirection(e); } @Override public void keyReleased(KeyEvent e) { plane.minusDirection(e); } } /** * 初始化窗口 */ public void launchFrame(){ this.setTitle("尚学堂学员_飞机大战"); this.setVisible(true); this.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT); this.setLocation(300,50); this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); new PaintThread().start();//启动重画窗口的线程 addKeyListener(new KeyMonitor());//给窗口增加键盘监听 //初始化50个炮弹 for(int i=0;i<shells.length;i++){ shells[i] = new Shell(); } } public static void main(String[] args) { GameFrame f = new GameFrame(); f.launchFrame(); } } ``` 引用: ```java package com.sxt; import java.awt.*; public class WildMonster extends GameObject{ Image img = GameUtil.getImage("images/monster.png"); double speed = 3; double degree; public WildMonster() { x = 200; y = 200; width = 50; height = 50; degree = Math.random()*Math.PI*2; } public void draw(Graphics g){ g.drawImage(img,(int)x,(int)y,null); x += speed*Math.cos(degree); y += speed*Math.sin(degree); if(x<0||x>Constant.GAME_WIDTH-width){ degree = Math.PI-degree; } if(y<30||y>Constant.GAME_HEIGHT-height){ degree = -degree; } } @Override public Rectangle getRect() { return new Rectangle((int)x,(int)y,width,height); } } ```
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值