主要功能
键盘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