目录:
之前想写一个打斗之类的游戏,但是发现网上相关资料很少,有是有,但是要收费,所以只能自己慢慢琢磨了,刚开始的时候啥也不会,所以先从贪吃蛇慢慢做起,了解了一下做游戏的框架,再跟着视频写了飞机大战,黄金矿工等小游戏,也稍微看了一点超级玛丽,坦克大战,我写的这个游戏主角移动就是参考了超级玛丽的移动。虽然和原版比有很大差距,但咱也没那么大要求嘛。
新手可放心食用......
游戏效果展示:
游戏介绍:
主角:
包含四个主角(关羽,张飞,赵云,魏延),每个主角攻击力,血量,技能,移动速度,被动都不相同。
键盘事件:
A:向左移动
D:向右移动
S:防御,减少敌人三分之二的攻击,但不能移动
W:跳跃,冷却1秒
J:拳击,可以在移动,跳跃时使用,无冷却
K:飞踢,必须在点击跳跃的时候,点击K键方可使用,冷却0.5秒
L:连击,移动和跳跃会打断连击,冷却0.5秒
I:技能,一直按压I键,来释放完整的技能,冷却3秒
O:冲锋,向前突进一段距离,并对敌人造成伤害,冷却0.5秒
游戏开始时,点击空格暂停游戏;死亡或胜利后,点击空格重新开始游戏。
主角介绍:
1.关羽:
血量:4000,攻击:100,速度:5
被动:过五关斩六将:随着击杀敌人的数量增加,攻击力不断增加,每击杀一个敌人,增加2点攻击力
2.张飞:
血量:3400,攻击:80,速度:5
被动:愈战愈勇: 随着生命的降低,攻击力不断增加,每损失100生命值,增加1点的攻击力
3.赵云:
血量:2800,攻击:120,速度:6
被动:单枪匹马:在场的敌人数量越多,攻击力越高,场上每多1个敌人,攻击力增加5;冷静的头脑:喝酒不会增加赵云的攻击力
4.魏延:
血量:5000,攻击:50,速度:3
被动:以战养战:击杀敌人后,恢复所杀敌人血量的百分之十的血量
关卡和敌人:
含有三个关卡,五种小怪(蛮兵,枪兵,重刀兵,刺客,重锤兵),三个Boss,
道具(食物):
包含四种食物
包子:恢复100血量;鸡肉:恢复200血量;猪肉:恢复300血量;酒:永久增加10攻击力
图片效果展示:
游戏主角介绍:
游戏打斗场面:
结束效果:
视频介绍:
思维导图:
一、GameFrame 主窗口类
1.变量:
int width = 1000, height = 416;
//双缓存
private Image offScreenImg = null;
//head 为了随机选择gameState = 0 时的背景图片
int head;
//bgWald为了实现背景的移动
public static int bgWalk = 0;
//游戏状态 0未开始,1选择人物,2开始游戏,3暂停,4失败,5胜利,
//6按键介绍,7关羽的被动介绍,8张飞,9赵云,10魏延,11,敌人的介绍,12开始游戏的进度条
public static int gameState;
//建立角色对象
public static Role role = null;
public static Role role1 = null;//关羽
public static Role role2 = null;//张飞
public static Role role3 = null;//赵云
public static Role role4 = null;//魏延
//小怪的最大数量(每一关小怪的最大数量是不同的)
int soldierCount;
//小怪出现的速度(每一关小怪的生成速度都是不同的)
int appearEnemySpeed;
//击杀小怪的数量,用于关羽的被动和魏延的被动2
public static int killEnemyCount;
//主角被攻击前的血量,用于张飞的被动
public static float isCutAgoHp;
//敌人在场上的数量,用于赵云的被动
public static int nowEnemyCount;
//Boss
Enemy boss1 = null;
Enemy boss2 = null;
Enemy boss3 = null;
//临时敌人对象,用来实现状态12
Enemy temporaryEnemy;
//关卡集合
public static List<Image> allBgImg = new ArrayList<>();
//用来表示目前到达了那一关
int nowBgNum = 0;
2.初始化:
public void launch() {
this.setFocusable(true);
setTitle("Lizhuang");
setSize(width,height);
setResizable(false);//大小不可变
setLocationRelativeTo(null);//居中
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭退出程序
setVisible(true);
//实现键盘监听,控制主角移动
this.addKeyListener(new GameFame.KeyMonitor());
//往关卡列表中添加背景,共三个关卡
allBgImg.add(GameUtils.bg1Img);
allBgImg.add(GameUtils.bg2Img);
allBgImg.add(GameUtils.bg3Img);
//初始化关羽对象
role1 = new Role(100,270,64,79,GameUtils.hp1,GameUtils.atk1,GameUtils.walkSpeed1,
GameUtils.stand_LImg1,GameUtils.stand_RImg1,GameUtils.defend_LImg1,GameUtils.defend_RImg1,
GameUtils.run_LListImg1,GameUtils.run_RListImg1,8,GameUtils.quickGo_LListImg1,GameUtils.quickGo_RListImg1,3,
GameUtils.jump_LListImg1,GameUtils.jump_RListImg1,21,GameUtils.cut_LListImg1,GameUtils.cut_RListImg1,3,
GameUtils.flyKick_LListImg1,GameUtils.flyKick_RListImg1,5,GameUtils.longAttack_LListImg1,GameUtils.longAttack_RListImg1,9,
GameUtils.skill_LListImg1,GameUtils.skill_RListImg1,11);
//初始化张飞对象
role2 = new Role(100,270,72,77,GameUtils.hp2,GameUtils.atk2,GameUtils.walkSpeed2,
GameUtils.stand_LImg2,GameUtils.stand_RImg2,GameUtils.defend_LImg2,GameUtils.defend_RImg2,
GameUtils.run_LListImg2,GameUtils.run_RListImg2,8,GameUtils.quickGo_LListImg2,GameUtils.quickGo_RListImg2,3,
GameUtils.jump_LListImg2,GameUtils.jump_RListImg2,21,GameUtils.cut_LListImg2,GameUtils.cut_RListImg2,3,
GameUtils.flyKick_LListImg2,GameUtils.flyKick_RListImg2,6,GameUtils.longAttack_LListImg2,GameUtils.longAttack_RListImg2,7,
GameUtils.skill_LListImg2,GameUtils.skill_RListImg2,11);
//初始化赵云对象
role3 = new Role(100,270,56,76,GameUtils.hp3,GameUtils.atk3,GameUtils.walkSpeed3,
GameUtils.stand_LImg3,GameUtils.stand_RImg3,GameUtils.defend_LImg3,GameUtils.defend_RImg3,
GameUtils.run_LListImg3,GameUtils.run_RListImg3,8,GameUtils.quickGo_LListImg3,GameUtils.quickGo_RListImg3,5,
GameUtils.jump_LListImg3,GameUtils.jump_RListImg3,21,GameUtils.cut_LListImg3,GameUtils.cut_RListImg3,6,
GameUtils.flyKick_LListImg3,GameUtils.flyKick_RListImg3,3,GameUtils.longAttack_LListImg3,GameUtils.longAttack_RListImg3,7,
GameUtils.skill_LListImg3,GameUtils.skill_RListImg3,7);
//初始化魏延对象
role4 = new Role(100,270,62,76,GameUtils.hp4,GameUtils.atk4,GameUtils.walkSpeed4,
GameUtils.stand_LImg4,GameUtils.stand_RImg4,GameUtils.defend_LImg4,GameUtils.defend_RImg4,
GameUtils.run_LListImg4,GameUtils.run_RListImg4,8,GameUtils.quickGo_LListImg4,GameUtils.quickGo_RListImg4,3,
GameUtils.jump_LListImg4,GameUtils.jump_RListImg4,21,GameUtils.cut_LListImg4,GameUtils.cut_RListImg4,5,
GameUtils.flyKick_LListImg4,GameUtils.flyKick_RListImg4,6,GameUtils.longAttack_LListImg4,GameUtils.longAttack_RListImg4,9,
GameUtils.skill_LListImg4,GameUtils.skill_RListImg4,10);
//初始化临时敌人对象
temporaryEnemy = new Enemy(0,270,68,79,GameUtils.hpEnemy2,GameUtils.atkEnemy2,10,
GameUtils.stand_LEnemyImg2,GameUtils.stand_REnemyImg2,GameUtils.run_LEnemyListImg2,GameUtils.run_REnemyListImg2,5,
GameUtils.quickGo_LEnemyListImg2,GameUtils.quickGo_REnemyListImg2,3,
GameUtils.cut_LEnemyListImg2,GameUtils.cut_REnemyListImg2,4,
GameUtils.skill_LEnemyListImg2,GameUtils.skill_REnemyListImg2,4);
//初始化图片
GameUtils.init();
//初始化gameState = 0 时的背景图(随机选择图片)
head = (int)(Math.random()*3+1);
//鼠标点击监听,在游戏状态为1的时候,选择角色
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Point p = new Point(e.getX(),e.getY());
//鼠标点击来开始游戏或者看按键帮助
if (gameState == 0) {
if (p.x>330 && p.x<554 && p.y>300 && p.y<354) gameState = 1;
if (p.x>880 && p.x<980 && p.y>50 && p.y<89) gameState = 6;
}
//鼠标点击来选择人物
if (gameState == 1){
if (p.x>150 && p.x<216 && p.y>50 && p.y<150) {
gameState = 7;//改变游戏状态
role = role1;//设置主角
}else if (p.x>350 && p.x<416 && p.y>50 && p.y<150){
gameState = 8;
role = role2;
}else if (p.x>550 && p.x<616 && p.y>50 && p.y<150){
gameState = 9;
role = role3;
}else if (p.x>750 && p.x<816 && p.y>50 && p.y<150){
gameState = 10;
role = role4;
}else if (p.x>20 && p.x<141 && p.y>40 && p.y<77) {
gameState = 0;//返回按钮
}
}
if (gameState == 6) {
if (p.x>20 && p.x<141 && p.y>40 && p.y<77) gameState = 0;//返回按钮
if (p.x>920 && p.x<983 && p.y>320 && p.y<383) gameState = 11;//进入状态11:敌人的介绍
}
if (gameState == 7 || gameState == 8 || gameState == 9 || gameState == 10) {
if (p.x>20 && p.x<141 && p.y>40 && p.y<77) gameState = 1;//返回按钮
if (p.x>400 && p.x<522 && p.y>300 && p.y<338) gameState = 12;//开始按钮,进入状态12:开始游戏的进度条
}
if (gameState == 11) {
if (p.x>20 && p.x<141 && p.y>40 && p.y<77) gameState = 6;//返回按钮
}
}
});
//重复绘制
while(true) {
if (gameState == 2) creatObj();//创建敌人
repaint();
try {
Thread.sleep(100);
} catch (Exception e) {}
}
}
3.重置(用于重新开始游戏):
public void init() {
bgWalk = 0;
nowBgNum = 0;
GameUtils.gameObjListImg.clear();//删除列表中的所有元素
GameUtils.enemyListImg.clear();
GameUtils.bossListImg.clear();
soldierCount = 0;//小怪数量清零
boss1 = null;
boss2 = null;
boss3 = null;
if (role == role1) role.hp = GameUtils.hp1;//恢复主角的血量
if (role == role2) role.hp = GameUtils.hp2;
if (role == role3) role.hp = GameUtils.hp3;
if (role == role4) role.hp = GameUtils.hp4;
}
4.创建敌人:
public void creatObj() {
int n = (int)(Math.random()*3);//一次性随机数
int site = 0;//小怪出现的位置,小怪的随机出现位置只有在左边和右边
if (n == 0) site = 0;
if (n == 1 || n == 2) site = 900;//小怪大约有三分之二的概率从右边出现
//小怪随机添加
int n2 = (int)(Math.random()*10);
//如果是第1关,只有蛮兵,枪兵,小怪的生成速度是每100帧
if (nowBgNum == 0 && appearEnemySpeed >= 100 && soldierCount < 8) {
appearEnemySpeed = 0;
if (n2 <= 5) {//有一半的概率生成蛮兵
//将小怪1添加到enemyListImg中
GameUtils.enemyListImg.add(new Enemy(site,270,56,93,GameUtils.hpEnemy1,GameUtils.atkEnemy1,GameUtils.walkSpeedEnemy1,
GameUtils.stand_LEnemyImg1,GameUtils.stand_REnemyImg1,GameUtils.run_LEnemyListImg1,GameUtils.run_REnemyListImg1,6,
GameUtils.quickGo_LEnemyListImg1,GameUtils.quickGo_REnemyListImg1,6,
GameUtils.cut_LEnemyListImg1,GameUtils.cut_REnemyListImg1,5,
GameUtils.skill_LEnemyListImg1,GameUtils.skill_REnemyListImg1,4));
}else {//将小怪2添加到enemyListImg中
GameUtils.enemyListImg.add(new Enemy(site,270,68,79,GameUtils.hpEnemy2,GameUtils.atkEnemy2,GameUtils.walkSpeedEnemy2,
GameUtils.stand_LEnemyImg2,GameUtils.stand_REnemyImg2,GameUtils.run_LEnemyListImg2,GameUtils.run_REnemyListImg2,5,
GameUtils.quickGo_LEnemyListImg2,GameUtils.quickGo_REnemyListImg2,3,
GameUtils.cut_LEnemyListImg2,GameUtils.cut_REnemyListImg2,4,
GameUtils.skill_LEnemyListImg2,GameUtils.skill_REnemyListImg2,4));
}
soldierCount++;
nowEnemyCount+=5;
}
//如果是第2关,只有重刀兵,刺客
if (nowBgNum == 1 && appearEnemySpeed >= 60 && soldierCount < 15) {
appearEnemySpeed = 0;
if (n2 <= 5) {
GameUtils.enemyListImg.add(new Enemy(site,270,80,64,GameUtils.hpEnemy3,GameUtils.atkEnemy3,GameUtils.walkSpeedEnemy3,
GameUtils.stand_LEnemyImg3,GameUtils.stand_REnemyImg3,GameUtils.run_LEnemyListImg3,GameUtils.run_REnemyListImg3,2,
GameUtils.quickGo_LEnemyListImg3,GameUtils.quickGo_REnemyListImg3,3,
GameUtils.cut_LEnemyListImg3,GameUtils.cut_REnemyListImg3,3,
GameUtils.skill_LEnemyListImg3,GameUtils.skill_REnemyListImg3,3));
}else {
GameUtils.enemyListImg.add(new Enemy(site,270,48,80,GameUtils.hpEnemy4,GameUtils.atkEnemy4,GameUtils.walkSpeedEnemy4,
GameUtils.stand_LEnemyImg4,GameUtils.stand_REnemyImg4,GameUtils.run_LEnemyListImg4,GameUtils.run_REnemyListImg4,5,
GameUtils.quickGo_LEnemyListImg4,GameUtils.quickGo_REnemyListImg4,3,
GameUtils.cut_LEnemyListImg4,GameUtils.cut_REnemyListImg4,3,
GameUtils.skill_LEnemyListImg4,GameUtils.skill_REnemyListImg4,4));
}
soldierCount++;
nowEnemyCount+=5;
}
//如果是第3关,5个兵种都有几率出现,但主要是重锤兵
if (nowBgNum == 2 && appearEnemySpeed >= 80 && soldierCount < 20) {
appearEnemySpeed = 0;
switch (n2) {
case 0:
GameUtils.enemyListImg.add(new Enemy(site,270,56,93,GameUtils.hpEnemy1,GameUtils.atkEnemy1,GameUtils.walkSpeedEnemy1,
GameUtils.stand_LEnemyImg1,GameUtils.stand_REnemyImg1,GameUtils.run_LEnemyListImg1,GameUtils.run_REnemyListImg1,6,
GameUtils.quickGo_LEnemyListImg1,GameUtils.quickGo_REnemyListImg1,3,
GameUtils.cut_LEnemyListImg1,GameUtils.cut_REnemyListImg1,5,
GameUtils.skill_LEnemyListImg1,GameUtils.skill_REnemyListImg1,4));
break;
case 1,2:
GameUtils.enemyListImg.add(new Enemy(site,270,68,79,GameUtils.hpEnemy2,GameUtils.atkEnemy2,GameUtils.walkSpeedEnemy2,
GameUtils.stand_LEnemyImg2,GameUtils.stand_REnemyImg2,GameUtils.run_LEnemyListImg2,GameUtils.run_REnemyListImg2,5,
GameUtils.quickGo_LEnemyListImg2,GameUtils.quickGo_REnemyListImg2,3,
GameUtils.cut_LEnemyListImg2,GameUtils.cut_REnemyListImg2,4,
GameUtils.skill_LEnemyListImg2,GameUtils.skill_REnemyListImg2,4));
break;
case 3,4:
GameUtils.enemyListImg.add(new Enemy(site,270,80,64,GameUtils.hpEnemy3,GameUtils.atkEnemy3,GameUtils.walkSpeedEnemy3,
GameUtils.stand_LEnemyImg3,GameUtils.stand_REnemyImg3,GameUtils.run_LEnemyListImg3,GameUtils.run_REnemyListImg3,2,
GameUtils.quickGo_LEnemyListImg3,GameUtils.quickGo_REnemyListImg3,3,
GameUtils.cut_LEnemyListImg3,GameUtils.cut_REnemyListImg3,3,
GameUtils.skill_LEnemyListImg3,GameUtils.skill_REnemyListImg3,3));
break;
case 5,6:
GameUtils.enemyListImg.add(new Enemy(site,270,48,80,GameUtils.hpEnemy4,GameUtils.atkEnemy4,GameUtils.walkSpeedEnemy4,
GameUtils.stand_LEnemyImg4,GameUtils.stand_REnemyImg4,GameUtils.run_LEnemyListImg4,GameUtils.run_REnemyListImg4,5,
GameUtils.quickGo_LEnemyListImg4,GameUtils.quickGo_REnemyListImg4,3,
GameUtils.cut_LEnemyListImg4,GameUtils.cut_REnemyListImg4,3,
GameUtils.skill_LEnemyListImg4,GameUtils.skill_REnemyListImg4,4));
break;
case 7,8,9:
GameUtils.enemyListImg.add(new Enemy(site,270,80,80,GameUtils.hpEnemy5,GameUtils.atkEnemy5,GameUtils.walkSpeedEnemy5,
GameUtils.stand_LEnemyImg5,GameUtils.stand_REnemyImg5,GameUtils.run_LEnemyListImg5,GameUtils.run_REnemyListImg5,4,
GameUtils.quickGo_LEnemyListImg5,GameUtils.quickGo_REnemyListImg5,3,
GameUtils.cut_LEnemyListImg5,GameUtils.cut_REnemyListImg5,3,
GameUtils.skill_LEnemyListImg5,GameUtils.skill_REnemyListImg5,4));
break;
}
soldierCount++;
nowEnemyCount+=5;
}
//如果没有Boss,而且背景移动到头了,添加Boss1
if (boss1 == null && bgWalk <= -3500 && nowBgNum == 0) {
boss1 = new Enemy(900,200,96,112,GameUtils.hpBoss1,GameUtils.atkBoss1,GameUtils.walkSpeedBoss1,
GameUtils.stand_LBossImg1,GameUtils.stand_RBossImg1,GameUtils.run_LBossListImg1,GameUtils.run_RBossListImg1,5,
GameUtils.quickGo_LBossListImg1,GameUtils.quickGo_RBossListImg1,3,
GameUtils.cut_LBossListImg1,GameUtils.cut_RBossListImg1,5,
GameUtils.skill_LBossListImg1,GameUtils.skill_RBossListImg1,5);
GameUtils.bossListImg.add(boss1);//将Boss添加到bossListImg中
nowEnemyCount+=5;
}
//在第2关创建Boss2
if (boss2 == null && bgWalk <= -3500 && nowBgNum == 1) {
boss2 = new Enemy(900,200,160,96,GameUtils.hpBoss2,GameUtils.atkBoss2,GameUtils.walkSpeedBoss2,
GameUtils.stand_LBossImg2,GameUtils.stand_RBossImg2,GameUtils.run_LBossListImg2,GameUtils.run_RBossListImg2,4,
GameUtils.quickGo_LBossListImg2,GameUtils.quickGo_RBossListImg2,3,
GameUtils.cut_LBossListImg2,GameUtils.cut_RBossListImg2,4,
GameUtils.skill_LBossListImg2,GameUtils.skill_RBossListImg2,2);
GameUtils.bossListImg.add(boss2);
nowEnemyCount+=5;
}
//在第3关创建Boss3
if (boss3 == null && bgWalk <= -3500 && nowBgNum == 2) {
boss3 = new Enemy(900,200,112,128,GameUtils.hpBoss3,GameUtils.atkBoss3,GameUtils.walkSpeedBoss3,
GameUtils.stand_LBossImg3,GameUtils.stand_RBossImg3,GameUtils.run_LBossListImg3,GameUtils.run_RBossListImg3,4,
GameUtils.quickGo_LBossListImg3,GameUtils.quickGo_RBossListImg3,3,
GameUtils.cut_LBossListImg3,GameUtils.cut_RBossListImg3,5,
GameUtils.skill_LBossListImg3,GameUtils.skill_RBossListImg3,5);
GameUtils.bossListImg.add(boss3);
nowEnemyCount+=5;
}
}
5.绘制图片:
@Override
public void paint(Graphics g) {
if (offScreenImg == null) offScreenImg = createImage(width,height);
Graphics gImage = offScreenImg.getGraphics();
gImage.fillRect(0, 0, width, height);
//0未开始
if (gameState == 0) {
//随机设置背景
if (head == 1) gImage.drawImage(GameUtils.title1Img,0,0,null);
if (head == 2) gImage.drawImage(GameUtils.title2Img,0,0,null);
if (head == 3) gImage.drawImage(GameUtils.title3Img,0,0,null);
gImage.drawImage(GameUtils.begin1Img,330,300,null);//开始游戏
gImage.drawImage(GameUtils.helpImg,880,50,null);//游戏帮助
}
//1选择人物
if (gameState == 1) {
gImage.drawImage(GameUtils.title4Img,0,0,null);
gImage.drawImage(GameUtils.returnImg,20,40,null);//返回的按钮
gImage.drawImage(GameUtils.header1Img,150,50,null);
gImage.drawImage(GameUtils.header2Img,350,50,null);
gImage.drawImage(GameUtils.header3Img,550,50,null);
gImage.drawImage(GameUtils.header4Img,750,50,null);
}
//2开始游戏
if (gameState == 2) {
//Music.startPlay();
//实现背景的移动
if (role.getStatus().indexOf("right") != -1) {
//bgWalk是为了实现背景的移动,人物向右走的时候,背景也跟着动;人物向左走的时候,背景不会动
bgWalk += -(role.getXSpeed()*2.5);
if (bgWalk < -4120) bgWalk = -4120;// //防止bgWalk超出范围
}
//绘制背景
gImage.drawImage(allBgImg.get(nowBgNum),bgWalk,0,null);
//绘制人物
gImage.drawImage(role.getShow(), role.getX(),role.getY(),null);
gImage.drawImage(GameUtils.bloodImg,15,35,null);//绘制血条,血条长200
gImage.setColor(Color.red);
if (role == role1) {
gImage.fillRect(30,47,(int)role.getHp()/(int)(GameUtils.hp1/200),8);
//关羽被动,随着击杀敌人的数量增加,攻击力不断增加
role.atk += killEnemyCount*2;
killEnemyCount = 0;//清零,防止重复加
}
if (role == role2) {
gImage.fillRect(30,47,(int)role.getHp()/(int)(GameUtils.hp2/200),8);
//张飞的被动在Role中
}
if (role == role3) {
gImage.fillRect(30,47,(int)role.getHp()/(int)(GameUtils.hp3/200),8);
//赵云被动,在场的敌人数量越多,攻击力越高
role.atk = GameUtils.atk3 + nowEnemyCount;
}
if (role == role4) {
gImage.fillRect(30,47,(int)role.getHp()/(int)(GameUtils.hp4/200),8);
//魏延被动,击杀敌人后,恢复所杀敌人血量的百分之五的血量,被动在Enemy
}
gImage.drawImage(GameUtils.atkImg,25,70,null);//绘制主角的攻击力
gImage.setColor(Color.yellow);
gImage.fillRect(25,71,(int)role.getAtk(),7);
role.isWound();//是否受伤
role.eatFood();//吃食物
//遍历小怪列表
for (int i = 0;i<GameUtils.enemyListImg.size();i++) {
//绘制敌人
gImage.drawImage(GameUtils.enemyListImg.get(i).getShow(),GameUtils.enemyListImg.get(i).getX(),GameUtils.enemyListImg.get(i).getY(),null);
GameUtils.enemyListImg.get(i).action();//让敌人开始一系列动作
//绘制血条的白色背景
gImage.setColor(Color.white);
gImage.fillRect(GameUtils.enemyListImg.get(i).getX()-10,GameUtils.enemyListImg.get(i).getY()-10,100,5);//填充的矩形长度是100
//绘制血条
gImage.setColor(Color.red);
gImage.fillRect(GameUtils.enemyListImg.get(i).getX()-10,GameUtils.enemyListImg.get(i).getY()-10,
(int)GameUtils.enemyListImg.get(i).getHp()/(int)(GameUtils.hpEnemy1/100),5);
}
//遍历Boss列表
for (int i = 0;i<GameUtils.bossListImg.size();i++) {
gImage.drawImage(GameUtils.bossListImg.get(i).getShow(),GameUtils.bossListImg.get(i).getX(),GameUtils.bossListImg.get(i).getY(),null);
GameUtils.bossListImg.get(i).action();//让Boss开始一系列动作
//绘制血条的白色背景
gImage.setColor(Color.white);
gImage.fillRect(GameUtils.bossListImg.get(i).getX()-10,GameUtils.bossListImg.get(i).getY()-10,100,5);//填充的矩形长度是100
//绘制血条
gImage.setColor(Color.red);
gImage.fillRect(GameUtils.bossListImg.get(i).getX()-10,GameUtils.bossListImg.get(i).getY()-10,
(int)GameUtils.bossListImg.get(i).getHp()/(int)(GameUtils.hpBoss1/100),5);
}
//绘制食物(主角吃食物的代码在Role中)
for (int i = 0;i<GameUtils.gameObjListImg.size();i++) {
gImage.drawImage(GameUtils.gameObjListImg.get(i).getImg(),GameUtils.gameObjListImg.get(i).getX(),GameUtils.gameObjListImg.get(i).getY(),null);
}
//删除已经吃过的食物
GameUtils.gameObjListImg.removeAll(GameUtils.removeObjListImg);
//删除已经死亡的敌人
GameUtils.enemyListImg.removeAll(GameUtils.removeEnemyListImg);//在gameListImg中删除死掉的小怪
GameUtils.bossListImg.removeAll(GameUtils.removeEnemyListImg);//在bossListImg中删除死掉的Boss
//判断游戏胜利的条件
if (GameUtils.enemyListImg.size() == 0 && GameUtils.bossListImg.size() == 0 && bgWalk <= -4100 && role.getX() >= 950) {
if (nowBgNum == 2) gameState = 5;//全部关卡都已经通过,胜利了
nowBgNum ++;
bgWalk = 0;//将背景的移动清零
soldierCount = 0;//将小怪的数量清零
role.setX(50);//改正主角的位置
role.setY(270);
}
}
//3暂停
if (gameState == 3) {
gImage.drawImage(GameUtils.title5Img,0,0,null);
gImage.setColor(Color.red);
gImage.setFont(new Font("仿宋",Font.BOLD+ Font.ITALIC,40));
gImage.drawString("大人,战事紧急,还请速速回去", 200,350);
}
//4失败
if (gameState == 4) {
//绘制角色死后的图片
gImage.drawImage(GameUtils.failImg, 380,100,null);
if (role == role1) gImage.drawImage(GameUtils.did1Img,430,200,null);
if (role == role2) gImage.drawImage(GameUtils.did2Img,430,200,null);
if (role == role3) gImage.drawImage(GameUtils.did3Img,430,200,null);
if (role == role4) gImage.drawImage(GameUtils.did4Img,430,200,null);
}
//5胜利
if (gameState == 5) {
gImage.drawImage(GameUtils.title9Img,0,0,null);
gImage.setColor(Color.red);
gImage.setFont(new Font("仿宋",Font.BOLD+ Font.ITALIC,40));
gImage.drawString("胜利", 450,100);
}
//6按键介绍
if (gameState == 6) {
gImage.setColor(Color.red);
gImage.setFont(new Font("仿宋",Font.BOLD+ Font.ITALIC,30));
gImage.drawString("按键介绍", 380,80);
gImage.setFont(new Font("仿宋",Font.BOLD+ Font.ITALIC,20));
gImage.drawString("A:向左移动", 100,120);
gImage.drawString("D:向右移动", 100,140);
gImage.drawString("S:防御,减少敌人三分之二的攻击,但不能移动", 100,160);
gImage.drawString("W:跳跃,冷却1秒", 100,180);
gImage.drawString("J:拳击,可以在移动,跳跃时使用,无冷却", 100,200);
gImage.drawString("K:飞踢,必须在点击跳跃的时候,点击K键方可使用,冷却0.5秒", 100,220);
gImage.drawString("L:连击,又名王八拳,移动和跳跃会打断连击,冷却0.5秒", 100,240);
gImage.drawString("I:技能,一直按压I键,来释放完整的技能,冷却3秒", 100,260);
gImage.drawString("O:冲锋,向前突进一段距离,并对敌人造成伤害,冷却0.5秒", 100,280);
gImage.drawString("游戏开始时,点击空格暂停游戏",100,320);
gImage.drawString("死亡或胜利后,点击空格重新开始游戏",100,340);
gImage.drawImage(GameUtils.returnImg,20,40,null);//返回的按钮
gImage.drawImage(GameUtils.introduceEnemyImg,920,320,null);//下一个介绍的按钮
}
//7,8,9,10,四个主角的被动介绍
if (gameState == 7 || gameState == 8 || gameState == 9 || gameState == 10){
gImage.drawImage(GameUtils.title7Img,0,0,null);
gImage.setColor(Color.red);
gImage.setFont(new Font("仿宋",Font.BOLD+ Font.ITALIC,20));
gImage.drawImage(GameUtils.begin2Img,400,300,null);//开始的按钮
gImage.drawImage(GameUtils.returnImg,20,40,null);//返回的按钮
//7关羽的被动介绍
if (gameState == 7) {
gImage.drawImage(GameUtils.header1Img,440,50,null);
gImage.drawString("关羽",450,180);
gImage.drawString("血量:4000,攻击:100,速度:5",310,240);
gImage.drawString("被动:过五关斩六将:随着击杀敌人的数量增加,攻击力不断增加,每击杀一个敌人,增加2点攻击力", 60,280);
}
//8张飞的被动介绍
if (gameState == 8) {
gImage.drawImage(GameUtils.header2Img,440,50,null);
gImage.drawString("张飞",450,180);
gImage.drawString("血量:3400,攻击:80,速度:5",310,240);
gImage.drawString("被动:愈战愈勇: 随着生命的降低,攻击力不断增加,每损失100生命值,增加1点的攻击力", 100,280);
}
//9赵云的被动介绍
if (gameState == 9) {
gImage.drawImage(GameUtils.header3Img,440,50,null);
gImage.drawString("赵云",450,180);
gImage.drawString("血量:2800,攻击:120,速度:6",310,240);
gImage.drawString("被动:单枪匹马:在场的敌人数量越多,攻击力越高,场上每多1个敌人,攻击力增加5", 100,280);
gImage.drawString("冷静的头脑:喝酒不会增加赵云的攻击力",290,300);
}
//10魏延的被动介绍
if (gameState == 10) {
gImage.drawImage(GameUtils.header4Img,440,50,null);
gImage.drawString("魏延",450,180);
gImage.drawString("血量:5000,攻击:50,速度:3",310,240);
gImage.drawString("被动:以战养战:击杀敌人后,恢复所杀敌人血量的百分之十的血量", 160,280);
}
}
//11敌人的介绍
if (gameState == 11) {
gImage.drawImage(GameUtils.title6Img,0,0,null);
gImage.drawImage(GameUtils.returnImg,20,40,null);//返回的按钮
gImage.setColor(Color.red);
gImage.setFont(new Font("仿宋",Font.ITALIC,10));
gImage.drawImage(GameUtils.stand_REnemyImg1,40,100,null);//小怪1
gImage.drawString("蛮兵,血量:1000,攻击:2",10,220);
gImage.drawImage(GameUtils.stand_REnemyImg2,190,100,null);//小怪2
gImage.drawString("枪兵,血量:1000,攻击:3",160,220);
gImage.drawImage(GameUtils.stand_REnemyImg3,360,120,null);//小怪3
gImage.drawString("重刀兵,血量:1000,攻击:5",320,220);
gImage.drawImage(GameUtils.stand_REnemyImg4,520,110,null);//小怪4
gImage.drawString("刺客,血量:1000,攻击:6",480,220);
gImage.drawImage(GameUtils.stand_REnemyImg5,670,110,null);//小怪5
gImage.drawString("重锤兵,血量:1000,攻击:8",630,220);
gImage.drawImage(GameUtils.stand_RBossImg1,30,260,null);//Boss1
gImage.drawString("Boss1,血量:4000,攻击:6",10,390);
gImage.drawImage(GameUtils.stand_RBossImg2,150,260,null);//Boss2
gImage.drawString("Boss2,血量:4000,攻击:9",170,390);
gImage.drawImage(GameUtils.stand_RBossImg3,330,250,null);//Boss3
gImage.drawString("Boss3,血量:4000,攻击:12",320,390);
//食物的介绍
gImage.drawImage(GameUtils.food1Img,510,340,null);//Boss3
gImage.drawString("包子:恢复100血量",480,390);
gImage.drawImage(GameUtils.food2Img,600,340,null);//Boss3
gImage.drawString("鸡肉:恢复200血量",580,390);
gImage.drawImage(GameUtils.food3Img,690,340,null);//Boss3
gImage.drawString("猪肉:恢复300血量",680,390);
gImage.drawImage(GameUtils.drinkImg,790,330,null);//Boss3
gImage.drawString("酒:增加10攻击力",780,390);
}
//12开始游戏的进度条
if (gameState == 12) {
gImage.drawImage(GameUtils.title8Img,0,0,null);
gImage.drawImage(GameUtils.waitImg,0,350,null);
//绘制临时的小怪走路
gImage.drawImage(temporaryEnemy.getShow(),temporaryEnemy.getX(),temporaryEnemy.getY(),null);
temporaryEnemy.rightMove();
if (temporaryEnemy.getX() >= 920) gameState = 2;
gImage.setColor(Color.red);
gImage.setFont(new Font("仿宋",Font.ITALIC,20));
int n = (int)(Math.random()*6);
switch (n) {
case 0:
gImage.drawString("据说曹公极好人妻......",760,400);
break;
case 1:
gImage.drawString("追杀曹贼中......",760,400);
break;
case 2:
gImage.drawString("正在赶往战场......",760,400);
break;
case 3:
gImage.drawString("曹贼!!!哪里逃......",760,400);
break;
case 4:
gImage.drawString("匡扶汉室......",760,400);
break;
case 5:
gImage.drawString("敌人正在赶来的路上......",760,400);
break;
}
}
appearEnemySpeed++;
//绘制双缓存图片
g.drawImage(offScreenImg,0,0,null);
}
6.键盘控制(键盘控制的具体代码在Role类中):
class KeyMonitor extends KeyAdapter{
//按下键盘
@Override
public void keyPressed(KeyEvent e) {
//按压空格键
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
//暂停功能
if (gameState == 2) {
gameState = 3;
}else if (gameState == 3) {
gameState = 2;
}
//重新开始功能
if (gameState == 4 || gameState == 5) {
gameState = 1;
init();//初始化一切
creatObj();//重新创建敌人
}
}
if(gameState == 2) role.keyPressed(e);//进入了游戏,开始通过键盘按压来控制人物移动
}
//松开键盘
@Override
public void keyReleased(KeyEvent e) {
if (gameState == 2) role.keyReleased(e);
}
}
7.主入口:
public static void main(String[] args) {
new GameFame().launch();
}
二、GameUtils 工具类
1.背景,道具图片:
//背景
public static Image bg1Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/Round6.png");
public static Image bg2Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/Round1.png");
public static Image bg3Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/Round2.png");
public static Image title1Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title1.png");
public static Image title2Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title2.png");
public static Image title3Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title3.png");
public static Image title4Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title4.png");
public static Image title5Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title5.png");
public static Image title6Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title6.png");
public static Image title7Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title7.png");
public static Image title8Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title8.png");
public static Image title9Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/title9.png");
public static Image waitImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/wait.png");
public static Image begin1Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/begin1.png");
public static Image begin2Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/begin2.png");
public static Image helpImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/help.png");
public static Image returnImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/return.png");
public static Image failImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/fail.png");
public static Image introduceEnemyImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/introduceEnemy.png");
public static Image bloodImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/blood.png");
public static Image atkImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/5.场景/show/atk.png");
//道具
public static Image food1Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/6.道具/food1.png");
public static Image food2Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/6.道具/food2.png");
public static Image food3Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/6.道具/food3.png");
public static Image drinkImg = Toolkit.getDefaultToolkit().getImage("imgs/res改正/6.道具/drink.png");
2.人物头像,死亡图片:
//人物头像
public static Image header1Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/关羽头像.png");
public static Image header2Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/张飞头像.png");
public static Image header3Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/赵云头像.png");
public static Image header4Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/魏延头像.png");
//人物死亡
public static Image did1Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/关羽死亡.png");
public static Image did2Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/张飞死亡.png");
public static Image did3Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/赵云死亡.png");
public static Image did4Img = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/魏延死亡.png");
3.主角的动作图片:
//关羽
public static float hp1 = 4000;//关羽的血量
public static float atk1 = 100;//关羽的攻击
public static int walkSpeed1 = 5;//关羽的速度
public static Image stand_LImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/0.png");//向左站立
public static Image stand_RImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/0.png");//向右站立
public static Image defend_LImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/95.png");//防御
public static Image defend_RImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/95.png");//防御
public static List<Image> run_LListImg1 = new ArrayList<>();//向左跑
public static List<Image> run_RListImg1 = new ArrayList<>();//向右跑
public static List<Image> jump_LListImg1 = new ArrayList<>();//向左跳跃
public static List<Image> jump_RListImg1 = new ArrayList<>();//向右跳跃
public static List<Image> cut_LListImg1 = new ArrayList<>();//向左攻击
public static List<Image> cut_RListImg1 = new ArrayList<>();//向右攻击
public static List<Image> flyKick_LListImg1 = new ArrayList<>();//飞踢向左攻击
public static List<Image> flyKick_RListImg1 = new ArrayList<>();//飞踢向右攻击
public static List<Image> longAttack_LListImg1 = new ArrayList<>();//连击,向左
public static List<Image> longAttack_RListImg1 = new ArrayList<>();//连击,向右
public static List<Image> skill_LListImg1 = new ArrayList<>();//技能左
public static List<Image> skill_RListImg1 = new ArrayList<>();//技能右
public static List<Image> quickGo_LListImg1 = new ArrayList<>();//冲锋左
public static List<Image> quickGo_RListImg1 = new ArrayList<>();//冲锋右
//张飞
public static float hp2 = 3400;//张飞的血量
public static float atk2 = 80;//张飞的攻击
public static int walkSpeed2 = 5;//张飞的速度
public static Image stand_LImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/0.png");//向左站立
public static Image stand_RImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/0.png");//向右站立
public static Image defend_LImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/115.png");//防御
public static Image defend_RImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/115.png");//防御
public static List<Image> run_LListImg2 = new ArrayList<>();//向左跑
public static List<Image> run_RListImg2 = new ArrayList<>();//向右跑
public static List<Image> jump_LListImg2 = new ArrayList<>();//向左跳跃
public static List<Image> jump_RListImg2 = new ArrayList<>();//向右跳跃
public static List<Image> cut_LListImg2 = new ArrayList<>();//向左攻击
public static List<Image> cut_RListImg2 = new ArrayList<>();//向右攻击
public static List<Image> flyKick_LListImg2 = new ArrayList<>();//飞踢向左攻击
public static List<Image> flyKick_RListImg2 = new ArrayList<>();//飞踢向右攻击
public static List<Image> longAttack_LListImg2 = new ArrayList<>();//连击,向左
public static List<Image> longAttack_RListImg2 = new ArrayList<>();//连击,向右
public static List<Image> skill_LListImg2 = new ArrayList<>();//技能左
public static List<Image> skill_RListImg2 = new ArrayList<>();//技能右
public static List<Image> quickGo_LListImg2 = new ArrayList<>();//冲锋左
public static List<Image> quickGo_RListImg2 = new ArrayList<>();//冲锋右
//赵云
public static float hp3 = 2800;//赵云的血量
public static float atk3 = 120;//赵云的攻击
public static int walkSpeed3 = 6;//赵云的速度
public static Image stand_LImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/0.png");//向左站立
public static Image stand_RImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/0.png");//向右站立
public static Image defend_LImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/48.png");//防御
public static Image defend_RImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/48.png");//防御
public static List<Image> run_LListImg3 = new ArrayList<>();//向左跑
public static List<Image> run_RListImg3 = new ArrayList<>();//向右跑
public static List<Image> jump_LListImg3 = new ArrayList<>();//向左跳跃
public static List<Image> jump_RListImg3 = new ArrayList<>();//向右跳跃
public static List<Image> cut_LListImg3 = new ArrayList<>();//向左攻击
public static List<Image> cut_RListImg3 = new ArrayList<>();//向右攻击
public static List<Image> flyKick_LListImg3 = new ArrayList<>();//飞踢向左攻击
public static List<Image> flyKick_RListImg3 = new ArrayList<>();//飞踢向右攻击
public static List<Image> longAttack_LListImg3 = new ArrayList<>();//连击,向左
public static List<Image> longAttack_RListImg3 = new ArrayList<>();//连击,向右
public static List<Image> skill_LListImg3 = new ArrayList<>();//技能左
public static List<Image> skill_RListImg3 = new ArrayList<>();//技能右
public static List<Image> quickGo_LListImg3 = new ArrayList<>();//冲锋左
public static List<Image> quickGo_RListImg3 = new ArrayList<>();//冲锋右
//魏延
public static float hp4 = 5000;//魏延的血量
public static float atk4 = 50;//魏延的攻击
public static int walkSpeed4 = 3;//魏延的速度
public static Image stand_LImg4 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/0.png");//向左站立
public static Image stand_RImg4 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/0.png");//向右站立
public static Image defend_LImg4 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/103.png");//防御
public static Image defend_RImg4 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/103.png");//防御
public static List<Image> run_LListImg4 = new ArrayList<>();//向左跑
public static List<Image> run_RListImg4 = new ArrayList<>();//向右跑
public static List<Image> jump_LListImg4 = new ArrayList<>();//向左跳跃
public static List<Image> jump_RListImg4 = new ArrayList<>();//向右跳跃
public static List<Image> cut_LListImg4 = new ArrayList<>();//向左攻击
public static List<Image> cut_RListImg4 = new ArrayList<>();//向右攻击
public static List<Image> flyKick_LListImg4 = new ArrayList<>();//飞踢向左攻击
public static List<Image> flyKick_RListImg4 = new ArrayList<>();//飞踢向右攻击
public static List<Image> longAttack_LListImg4 = new ArrayList<>();//连击,向左
public static List<Image> longAttack_RListImg4 = new ArrayList<>();//连击,向右
public static List<Image> skill_LListImg4 = new ArrayList<>();//技能左
public static List<Image> skill_RListImg4 = new ArrayList<>();//技能右
public static List<Image> quickGo_LListImg4 = new ArrayList<>();//冲锋左
public static List<Image> quickGo_RListImg4 = new ArrayList<>();//冲锋右
4.敌人的动作图片:
//存放小怪
public static List<Enemy> enemyListImg = new ArrayList<>();
//存放Boss元素
public static List<Enemy> bossListImg = new ArrayList<>();
//需要删除敌人元素
public static List<Enemy> removeEnemyListImg = new ArrayList<>();
//存放道具
public static List<GameObj> gameObjListImg = new ArrayList<>();
//需要删除道具元素
public static List<GameObj> removeObjListImg = new ArrayList<>();
//因为图片刷新的很快,所以要将敌人的攻击力设置的小一点,最好是三的倍数,因为主角的防御状态会降低敌方三分之二的攻击
//小怪1
public static float hpEnemy1 = 1000;//第一种敌人的血量
public static float atkEnemy1 = 2;//第一种敌人的攻击
public static int walkSpeedEnemy1 = 3;//第一种敌人的速度
public static Image stand_LEnemyImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/0.png");//向左站立
public static Image stand_REnemyImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/0.png");//向右站立
public static List<Image> run_LEnemyListImg1 = new ArrayList<>();//移动
public static List<Image> run_REnemyListImg1 = new ArrayList<>();
public static List<Image> cut_LEnemyListImg1 = new ArrayList<>();//攻击
public static List<Image> cut_REnemyListImg1 = new ArrayList<>();
public static List<Image> skill_LEnemyListImg1 = new ArrayList<>();//技能
public static List<Image> skill_REnemyListImg1 = new ArrayList<>();
public static List<Image> quickGo_LEnemyListImg1 = new ArrayList<>();//冲锋
public static List<Image> quickGo_REnemyListImg1 = new ArrayList<>();
//小怪2,由于小怪在同一个列表中,当绘制血条时,会出现问题,只能将小怪的血量设为相同的了
public static float hpEnemy2 = 1000;//第2种敌人的血量
public static float atkEnemy2 = 3;//第2种敌人的攻击
public static int walkSpeedEnemy2 = 3;//第2种敌人的速度
public static Image stand_LEnemyImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.L枪兵/0.png");//向左站立
public static Image stand_REnemyImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.R枪兵/0.png");//向右站立
public static List<Image> run_LEnemyListImg2 = new ArrayList<>();//向左跑
public static List<Image> run_REnemyListImg2 = new ArrayList<>();//向右跑
public static List<Image> cut_LEnemyListImg2 = new ArrayList<>();//向左攻击
public static List<Image> cut_REnemyListImg2 = new ArrayList<>();//向右攻击
public static List<Image> skill_LEnemyListImg2 = new ArrayList<>();//向左技能
public static List<Image> skill_REnemyListImg2 = new ArrayList<>();//向右技能
public static List<Image> quickGo_LEnemyListImg2 = new ArrayList<>();//冲锋
public static List<Image> quickGo_REnemyListImg2 = new ArrayList<>();
//小怪3
public static float hpEnemy3 = 1000;//第3种敌人的血量
public static float atkEnemy3 = 5;//第3种敌人的攻击
public static int walkSpeedEnemy3 = 5;//第3种敌人的速度
public static Image stand_LEnemyImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.L重刀兵/0.png");//向左站立
public static Image stand_REnemyImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.R重刀兵/0.png");//向右站立
public static List<Image> run_LEnemyListImg3 = new ArrayList<>();//向左跑
public static List<Image> run_REnemyListImg3 = new ArrayList<>();//向右跑
public static List<Image> cut_LEnemyListImg3 = new ArrayList<>();//向左攻击
public static List<Image> cut_REnemyListImg3 = new ArrayList<>();//向右攻击
public static List<Image> skill_LEnemyListImg3 = new ArrayList<>();//向左技能
public static List<Image> skill_REnemyListImg3 = new ArrayList<>();//向右技能
public static List<Image> quickGo_LEnemyListImg3 = new ArrayList<>();//冲锋
public static List<Image> quickGo_REnemyListImg3 = new ArrayList<>();
//小怪4
public static float hpEnemy4 = 1000;//第4种敌人的血量
public static float atkEnemy4 = 7;//第4种敌人的攻击
public static int walkSpeedEnemy4 = 6;//第4种敌人的速度
public static Image stand_LEnemyImg4 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.L刺客/0.png");//向左站立
public static Image stand_REnemyImg4 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.R刺客/0.png");//向右站立
public static List<Image> run_LEnemyListImg4 = new ArrayList<>();//向左跑
public static List<Image> run_REnemyListImg4 = new ArrayList<>();//向右跑
public static List<Image> cut_LEnemyListImg4 = new ArrayList<>();//向左攻击
public static List<Image> cut_REnemyListImg4 = new ArrayList<>();//向右攻击
public static List<Image> skill_LEnemyListImg4 = new ArrayList<>();//向左技能
public static List<Image> skill_REnemyListImg4 = new ArrayList<>();//向右技能
public static List<Image> quickGo_LEnemyListImg4 = new ArrayList<>();//冲锋
public static List<Image> quickGo_REnemyListImg4 = new ArrayList<>();
//小怪5
public static float hpEnemy5 = 1000;//第5种敌人的血量
public static float atkEnemy5 = 8;//第5种敌人的攻击
public static int walkSpeedEnemy5 = 3;//第3种敌人的速度
public static Image stand_LEnemyImg5 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.L重锤兵/0.png");//向左站立
public static Image stand_REnemyImg5 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.R重锤兵/0.png");//向右站立
public static List<Image> run_LEnemyListImg5 = new ArrayList<>();//向左跑
public static List<Image> run_REnemyListImg5 = new ArrayList<>();//向右跑
public static List<Image> cut_LEnemyListImg5 = new ArrayList<>();//向左攻击
public static List<Image> cut_REnemyListImg5 = new ArrayList<>();//向右攻击
public static List<Image> skill_LEnemyListImg5 = new ArrayList<>();//向左技能
public static List<Image> skill_REnemyListImg5 = new ArrayList<>();//向右技能
public static List<Image> quickGo_LEnemyListImg5 = new ArrayList<>();//冲锋
public static List<Image> quickGo_REnemyListImg5 = new ArrayList<>();
//Boss1
public static float hpBoss1 = 4000;//第一种Boss的血量
public static float atkBoss1 = 6;//第一种Boss的攻击力
public static int walkSpeedBoss1 = 6;//第一种Boss的速度
public static Image stand_LBossImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.LBoss/0.png");//向左站立
public static Image stand_RBossImg1 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.RBoss/0.png");//向右站立
public static List<Image> run_LBossListImg1 = new ArrayList<>();//向左跑
public static List<Image> run_RBossListImg1 = new ArrayList<>();//向右跑
public static List<Image> cut_LBossListImg1 = new ArrayList<>();//向左攻击
public static List<Image> cut_RBossListImg1 = new ArrayList<>();//向右攻击
public static List<Image> skill_LBossListImg1 = new ArrayList<>();//技能左
public static List<Image> skill_RBossListImg1 = new ArrayList<>();//技能右
public static List<Image> quickGo_LBossListImg1 = new ArrayList<>();//冲锋
public static List<Image> quickGo_RBossListImg1 = new ArrayList<>();
//Boss2
public static float hpBoss2 = 4000;//第2种Boss的血量
public static float atkBoss2 = 9;//第2种Boss的攻击力
public static int walkSpeedBoss2 = 6;//第2种Boss的速度
public static Image stand_LBossImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.LBoss/0.png");//向左站立
public static Image stand_RBossImg2 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.RBoss/0.png");//向右站立
public static List<Image> run_LBossListImg2 = new ArrayList<>();//向左跑
public static List<Image> run_RBossListImg2 = new ArrayList<>();//向右跑
public static List<Image> cut_LBossListImg2 = new ArrayList<>();//向左攻击
public static List<Image> cut_RBossListImg2 = new ArrayList<>();//向右攻击
public static List<Image> skill_LBossListImg2 = new ArrayList<>();//技能左
public static List<Image> skill_RBossListImg2 = new ArrayList<>();//技能右
public static List<Image> quickGo_LBossListImg2 = new ArrayList<>();//冲锋
public static List<Image> quickGo_RBossListImg2 = new ArrayList<>();
//Boss3
public static float hpBoss3 = 4000;//第3种Boss的血量
public static float atkBoss3 = 12;//第3种Boss的攻击力
public static int walkSpeedBoss3 = 8;//第3种Boss的速度
public static Image stand_LBossImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.LBoss/0.png");//向左站立
public static Image stand_RBossImg3 = Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.RBoss/0.png");//向右站立
public static List<Image> run_LBossListImg3 = new ArrayList<>();//向左跑
public static List<Image> run_RBossListImg3 = new ArrayList<>();//向右跑
public static List<Image> cut_LBossListImg3 = new ArrayList<>();//向左攻击
public static List<Image> cut_RBossListImg3 = new ArrayList<>();//向右攻击
public static List<Image> skill_LBossListImg3 = new ArrayList<>();//技能左
public static List<Image> skill_RBossListImg3 = new ArrayList<>();//技能右
public static List<Image> quickGo_LBossListImg3 = new ArrayList<>();//冲锋
public static List<Image> quickGo_RBossListImg3 = new ArrayList<>();
5.初始化图片集合:
public static void init() {
//关羽,移动
for (int i = 1;i<=8 ;i++) run_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/"+i+".png"));
for (int i = 1;i<=8 ;i++) run_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/"+i+".png"));
//跳跃 (4张跳跃图片刷新的太快了,点击一下跳跃键,跳跃图片循环了4次,所以想了个歪招)
for (int i = 1;i<=3;i++) jump_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/49.png"));
for (int i = 1;i<=5;i++) jump_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/50.png"));
for (int i = 1;i<=8;i++) jump_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/51.png"));
for (int i = 1;i<=5;i++) jump_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/52.png"));
for (int i = 1;i<=3;i++) jump_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/49.png"));
for (int i = 1;i<=5;i++) jump_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/50.png"));
for (int i = 1;i<=8;i++) jump_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/51.png"));
for (int i = 1;i<=5;i++) jump_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/52.png"));
//攻击
for (int i = 9;i<= 11 ;i++) cut_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/"+i+".png"));
for (int i = 9;i<= 11 ;i++) cut_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/"+i+".png"));
//飞踢
for (int i = 54;i<= 58;i++) flyKick_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/"+i+".png"));
for (int i = 54;i<= 58;i++) flyKick_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/"+i+".png"));
//连击
for (int i = 12;i<= 20;i++) longAttack_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/"+i+".png"));
for (int i = 12;i<= 20;i++) longAttack_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/"+i+".png"));
//技能
for (int i = 132;i<= 138;i++) skill_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/"+i+".png"));
for (int i = 163;i<= 166;i++) skill_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/"+i+".png"));
for (int i = 132;i<= 138;i++) skill_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/"+i+".png"));
for (int i = 163;i<= 166;i++) skill_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/"+i+".png"));
//冲锋
for (int i = 40;i<=42;i++) quickGo_LListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.L关羽/"+i+".png"));
for (int i = 40;i<=42;i++) quickGo_RListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/1.R关羽/"+i+".png"));
//张飞,移动
for (int i = 1;i<=8;i++) run_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/"+i+".png"));
for (int i = 1;i<=8;i++) run_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/"+i+".png"));
//跳跃
for (int i = 1;i<=3;i++) jump_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/63.png"));
for (int i = 1;i<=5;i++) jump_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/65.png"));
for (int i = 1;i<=8;i++) jump_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/66.png"));
for (int i = 1;i<=5;i++) jump_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/67.png"));
for (int i = 1;i<=3;i++) jump_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/63.png"));
for (int i = 1;i<=5;i++) jump_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/65.png"));
for (int i = 1;i<=8;i++) jump_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/66.png"));
for (int i = 1;i<=5;i++) jump_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/67.png"));
//攻击
for (int i = 9;i<=11;i++) cut_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/"+i+".png"));
for (int i = 9;i<=11;i++) cut_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/"+i+".png"));
//飞踢
for (int i = 73;i<=78;i++) flyKick_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/"+i+".png"));
for (int i = 73;i<=78;i++) flyKick_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/"+i+".png"));
//连击
for (int i = 12;i<=18;i++) longAttack_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/"+i+".png"));
for (int i = 12;i<=18;i++) longAttack_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/"+i+".png"));
//技能
for (int i = 151;i<=153;i++) skill_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/"+i+".png"));
for (int i = 210;i<=217;i++) skill_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/"+i+".png"));
for (int i = 151;i<=153;i++) skill_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/"+i+".png"));
for (int i = 210;i<=217;i++) skill_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/"+i+".png"));
//冲锋
for (int i = 60;i<=62;i++) quickGo_LListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.L张飞/"+i+".png"));
for (int i = 60;i<=62;i++) quickGo_RListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/2.R张飞/"+i+".png"));
//赵云,移动
for (int i = 1;i<=8;i++) run_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/"+i+".png"));
for (int i = 1;i<=8;i++) run_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/"+i+".png"));
//跳跃
for (int i = 1;i<=3;i++) jump_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/9.png"));
for (int i = 1;i<=5;i++) jump_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/10.png"));
for (int i = 1;i<=8;i++) jump_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/11.png"));
for (int i = 1;i<=5;i++) jump_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/12.png"));
for (int i = 1;i<=3;i++) jump_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/9.png"));
for (int i = 1;i<=5;i++) jump_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/10.png"));
for (int i = 1;i<=8;i++) jump_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/11.png"));
for (int i = 1;i<=5;i++) jump_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/12.png"));
//攻击
for (int i = 16;i<=21;i++) cut_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/"+i+".png"));
for (int i = 16;i<=21;i++) cut_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/"+i+".png"));
//飞踢
for (int i = 13;i<=15;i++) flyKick_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/"+i+".png"));
for (int i = 13;i<=15;i++) flyKick_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/"+i+".png"));
//连击
for (int i = 22;i<=28;i++) longAttack_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/"+i+".png"));
for (int i = 22;i<=28;i++) longAttack_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/"+i+".png"));
//技能
for (int i = 33;i<=39;i++) skill_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/"+i+".png"));
for (int i = 33;i<=39;i++) skill_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/"+i+".png"));
//冲锋
for (int i = 42;i<=46;i++) quickGo_LListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.L赵云/"+i+".png"));
for (int i = 42;i<=46;i++) quickGo_RListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/3.R赵云/"+i+".png"));
//魏延,移动
for (int i = 1;i<=8;i++) run_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 1;i<=8;i++) run_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
//跳跃
for (int i = 1;i<=3;i++) jump_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/52.png"));
for (int i = 1;i<=5;i++) jump_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/54.png"));
for (int i = 1;i<=8;i++) jump_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/55.png"));
for (int i = 1;i<=5;i++) jump_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/56.png"));
for (int i = 1;i<=3;i++) jump_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/52.png"));
for (int i = 1;i<=5;i++) jump_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/54.png"));
for (int i = 1;i<=8;i++) jump_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/55.png"));
for (int i = 1;i<=5;i++) jump_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/56.png"));
//攻击
for (int i = 12;i<=16;i++) cut_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 12;i<=16;i++) cut_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
//飞踢
for (int i = 57;i<=62;i++) flyKick_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 57;i<=62;i++) flyKick_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
//连击
for (int i = 17;i<=21;i++) longAttack_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 37;i<=40;i++) longAttack_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 17;i<=21;i++) longAttack_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
for (int i = 37;i<=40;i++) longAttack_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
//技能
for (int i = 167;i<=172;i++) skill_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 154;i<=157;i++) skill_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 167;i<=172;i++) skill_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
for (int i = 154;i<=157;i++) skill_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
//冲锋
for (int i = 41;i<=43;i++) quickGo_LListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.L魏延/"+i+".png"));
for (int i = 41;i<=43;i++) quickGo_RListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/1.主角/4.R魏延/"+i+".png"));
//小怪1
for (int i = 1;i<=6;i++) run_LEnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/"+i+".png"));//移动
for (int i = 1;i<=6;i++) run_REnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/"+i+".png"));
for (int i = 8;i<=12;i++) cut_LEnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/"+i+".png"));//攻击
for (int i = 8;i<=12;i++) cut_REnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/"+i+".png"));
for (int i = 17;i<=20;i++) skill_LEnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/"+i+".png"));//技能
for (int i = 17;i<=20;i++) skill_REnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/"+i+".png"));
for (int i = 1;i<=2;i++) quickGo_LEnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/6.png"));
for (int i = 1;i<=3;i++) quickGo_LEnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/7.png"));
for (int i = 1;i<=2;i++) quickGo_LEnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/8.png"));
for (int i = 1;i<=2;i++) quickGo_REnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/6.png"));
for (int i = 1;i<=3;i++) quickGo_REnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/7.png"));
for (int i = 1;i<=2;i++) quickGo_REnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/8.png"));
/*
for (int i = 6;i<=8;i++) quickGo_LEnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.L蛮兵/"+i+".png"));
for (int i = 6;i<=8;i++) quickGo_REnemyListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.R蛮兵/"+i+".png"));
*/
//小怪2
for (int i = 1;i<=5;i++) run_LEnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.L枪兵/"+i+".png"));//移动
for (int i = 1;i<=5;i++) run_REnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.R枪兵/"+i+".png"));
for (int i = 17;i<=20;i++) cut_LEnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.L枪兵/"+i+".png"));//攻击
for (int i = 17;i<=20;i++) cut_REnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.R枪兵/"+i+".png"));
for (int i = 12;i<=15;i++) skill_LEnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.L枪兵/"+i+".png"));//技能
for (int i = 12;i<=15;i++) skill_REnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.R枪兵/"+i+".png"));
for (int i = 19;i<=21;i++) quickGo_LEnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.L枪兵/"+i+".png"));//技能
for (int i = 19;i<=21;i++) quickGo_REnemyListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.R枪兵/"+i+".png"));//技能
//小怪3
for (int i = 1;i<=2;i++) run_LEnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.L重刀兵/"+i+".png"));//移动
for (int i = 1;i<=2;i++) run_REnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.R重刀兵/"+i+".png"));
for (int i = 3;i<=5;i++) cut_LEnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.L重刀兵/"+i+".png"));//攻击
for (int i = 3;i<=5;i++) cut_REnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.R重刀兵/"+i+".png"));
for (int i = 6;i<=8;i++) skill_LEnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.L重刀兵/"+i+".png"));//技能
for (int i = 6;i<=8;i++) skill_REnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.R重刀兵/"+i+".png"));
for (int i = 19;i<=21;i++) quickGo_LEnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.L重刀兵/"+i+".png"));//技能
for (int i = 19;i<=21;i++) quickGo_REnemyListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.R重刀兵/"+i+".png"));//技能
//小怪4
for (int i = 1;i<=5;i++) run_LEnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.L刺客/"+i+".png"));//移动
for (int i = 1;i<=5;i++) run_REnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.R刺客/"+i+".png"));
for (int i = 6;i<=8;i++) cut_LEnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.L刺客/"+i+".png"));//攻击
for (int i = 6;i<=8;i++) cut_REnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.R刺客/"+i+".png"));
for (int i = 9;i<=12;i++) skill_LEnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.L刺客/"+i+".png"));//技能
for (int i = 9;i<=12;i++) skill_REnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.R刺客/"+i+".png"));
for (int i = 18;i<=20;i++) quickGo_LEnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.L刺客/"+i+".png"));//技能
for (int i = 18;i<=20;i++) quickGo_REnemyListImg4.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/4.R刺客/"+i+".png"));//技能
//小怪5
for (int i = 1;i<=4;i++) run_LEnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.L重锤兵/"+i+".png"));//移动
for (int i = 1;i<=4;i++) run_REnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.R重锤兵/"+i+".png"));
for (int i = 5;i<=7;i++) cut_LEnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.L重锤兵/"+i+".png"));//攻击
for (int i = 5;i<=7;i++) cut_REnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.R重锤兵/"+i+".png"));
for (int i = 8;i<=11;i++) skill_LEnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.L重锤兵/"+i+".png"));//技能
for (int i = 8;i<=11;i++) skill_REnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.R重锤兵/"+i+".png"));
for (int i = 20;i<=22;i++) quickGo_LEnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.L重锤兵/"+i+".png"));//技能
for (int i = 20;i<=22;i++) quickGo_REnemyListImg5.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/5.R重锤兵/"+i+".png"));//技能
//Boss1
for (int i = 1;i<=5;i++) run_LBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.LBoss/"+i+".png"));//移动
for (int i = 1;i<=5;i++) run_RBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.RBoss/"+i+".png"));
for (int i = 8;i<=12;i++) cut_LBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.LBoss/"+i+".png"));//攻击
for (int i = 8;i<=12;i++) cut_RBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.RBoss/"+i+".png"));
for (int i = 17;i<=21;i++) skill_LBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.LBoss/"+i+".png"));//技能
for (int i = 17;i<=21;i++) skill_RBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.RBoss/"+i+".png"));
for (int i = 23;i<=25;i++) quickGo_LBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.LBoss/"+i+".png"));//技能
for (int i = 23;i<=25;i++) quickGo_RBossListImg1.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/1.RBoss/"+i+".png"));//技能
//Boss2
for (int i = 1;i<=4;i++) run_LBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.LBoss/"+i+".png"));//移动
for (int i = 1;i<=4;i++) run_RBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.RBoss/"+i+".png"));
for (int i = 5;i<=8;i++) cut_LBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.LBoss/"+i+".png"));//攻击
for (int i = 5;i<=8;i++) cut_RBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.RBoss/"+i+".png"));
for (int i = 9;i<=10;i++) skill_LBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.LBoss/"+i+".png"));//技能
for (int i = 9;i<=10;i++) skill_RBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.RBoss/"+i+".png"));
for (int i = 11;i<=13;i++) quickGo_LBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.LBoss/"+i+".png"));//技能
for (int i = 11;i<=13;i++) quickGo_RBossListImg2.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/2.RBoss/"+i+".png"));//技能
//Boss2
for (int i = 1;i<=4;i++) run_LBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.LBoss/"+i+".png"));//移动
for (int i = 1;i<=4;i++) run_RBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.RBoss/"+i+".png"));
for (int i = 5;i<=9;i++) cut_LBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.LBoss/"+i+".png"));//攻击
for (int i = 5;i<=9;i++) cut_RBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.RBoss/"+i+".png"));
for (int i = 10;i<=14;i++) skill_LBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.LBoss/"+i+".png"));//技能
for (int i = 10;i<=14;i++) skill_RBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.RBoss/"+i+".png"));
for (int i = 14;i<=16;i++) quickGo_LBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.LBoss/"+i+".png"));//技能
for (int i = 14;i<=16;i++) quickGo_RBossListImg3.add(Toolkit.getDefaultToolkit().getImage("imgs/res改正/3.小怪/3.RBoss/"+i+".png"));//技能
}
三、GameObj 物品道具类
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
public class GameObj {
Image img;//图片
int x,y;//坐标
int width,height;//图片的边长
int recover;//恢复的血量值
//构造方法
public GameObj() {}
public GameObj(Image img, int x,int y,int width,int height,int recover) {
this.img = img;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.recover = recover;
}
//绘制自身的图片
public void paintSelf(Graphics gImage) {
gImage.drawImage(img, x,y,null);
}
//返回自身矩形,可以进行碰撞检测
public Rectangle getRec() {
return new Rectangle(x,y,width,height);
}
//一些set get函数
public void setImg(Image img) {
this.img = img;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setWidth(int width) {
this.width = width;
}
public void setHeight(int height) {
this.height = height;
}
public void setRecover(int recover) {
this.recover = recover;
}
public Image getImg() {
return img;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getRecover() {
return recover;
}
}
四、People 人物类
1.变量和构造方法:
private int x, y;//人物的坐标
int width,height;//角色的宽,高
float hp;//血量
float atk;//攻击力
//当前的状态
public String status;
//显示当前的状态所对应的图像
public Image show = null;
//创建一个线程对象,来实现人物的动作
private Thread thread = null;
private int walkSpeed;//需要传入的参数速度
private int xSpeed;//移动速度
private int ySpeed;//跳跃速度
private int upTime = 0;//表示主角的上升的时间
//定义索引,用于我们获得人物的移动图片;因为移动,跳,攻击等图片的数量不同,所以要定义不同的索引
int indexRun;//索引,移动的图片
int indexJump;//索引,跳的图片
int indexAttack;//索引,拳击的图片
int indexFlyKick; //索引,飞踢的图片
int indexLongAttack;//索引,连击的图片
int indexSkill;//索引,技能的图片
int indexQuickGo;//索引,冲锋的图片
//(应该传入具体的图片数量,如5,3等格式,不要用 ......size()的格式,不然人物会卡空白)
int runImgNum;//移动的图片数
int jumpImgNum;//跳跃的图片数
int cutImgNum;//拳击的图片数
int flyKickImgNum;//飞踢的图片数
int longAttackImgNum;//连击的图片数
int skillImgNum;//技能的图片数
int quickGoImgNum;//冲撞的图片数
boolean cutCoolDown = true;//攻击冷却
boolean quickGoCoolDown = true;//冲锋冷却
boolean jumpCoolDown = true;//跳跃冷却状态
boolean flyKickCoolDown = true;//飞踢冷却状态
boolean longAttackCoolDown = true;//连击冷却状态
boolean skillCoolDown = true;//技能冷却状态
//各种行为图片的列表
Image stand_LImg;//向左站立
Image stand_RImg;//向右站立
Image defend_LImg;//防御
Image defend_RImg;//防御
List<Image> run_LListImg = new ArrayList<>();//向左跑
List<Image> run_RListImg = new ArrayList<>();//向右跑
List<Image> jump_LListImg = new ArrayList<>();//向左跳跃
List<Image> jump_RListImg = new ArrayList<>();//向右跳跃
List<Image> cut_LListImg = new ArrayList<>();//向左攻击
List<Image> cut_RListImg = new ArrayList<>();//向右攻击
List<Image> flyKick_LListImg = new ArrayList<>();//飞踢向左
List<Image> flyKick_RListImg = new ArrayList<>();//飞踢向右
List<Image> longAttack_LListImg = new ArrayList<>();//连击向左
List<Image> longAttack_RListImg = new ArrayList<>();//连击向右
List<Image> skill_LListImg = new ArrayList<>();//技能左
List<Image> skill_RListImg = new ArrayList<>();//技能右
List<Image> quickGo_LListImg = new ArrayList<>();//冲锋左
List<Image> quickGo_RListImg = new ArrayList<>();//冲锋右
//构造方法
public People() {}
//敌人用的构造方法(包含小怪,Boss)
public People(int x,int y,int width,int height,float hp,float atk,int walkSpeed,Image stand_LImg,
Image stand_RImg,List<Image> run_LListImg,List<Image> run_RListImg,int runImgNum,
List<Image> cut_LListImg,List<Image> cut_RListImg,int cutImgNum,
List<Image> skill_LListImg,List<Image> skill_RListImg,int skillImgNum) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.hp = hp;
this.atk = atk;
this.walkSpeed = walkSpeed;
this.stand_LImg = stand_LImg;
this.stand_RImg = stand_RImg;
this.run_LListImg = run_LListImg;
this.run_RListImg = run_RListImg;
this.runImgNum = runImgNum;
this.cut_LListImg = cut_LListImg;
this.cut_RListImg = cut_RListImg;
this.cutImgNum = cutImgNum;
this.skill_LListImg = skill_LListImg;
this.skill_RListImg = skill_RListImg;
this.skillImgNum = skillImgNum;
//默认的初始值
this.status = "stand--right";
this.show = stand_RImg;
this.thread = new Thread(this);
thread.start();
}
//敌人2
public People(int x,int y,int width,int height,float hp,float atk,int walkSpeed,Image stand_LImg,
Image stand_RImg,List<Image> run_LListImg,List<Image> run_RListImg,int runImgNum,
List<Image> quickGo_LListImg,List<Image> quickGo_RListImg,int quickGoImgNum,
List<Image> cut_LListImg,List<Image> cut_RListImg,int cutImgNum,
List<Image> skill_LListImg,List<Image> skill_RListImg,int skillImgNum) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.hp = hp;
this.atk = atk;
this.walkSpeed = walkSpeed;
this.stand_LImg = stand_LImg;
this.stand_RImg = stand_RImg;
this.run_LListImg = run_LListImg;
this.run_RListImg = run_RListImg;
this.runImgNum = runImgNum;
this.quickGo_LListImg = quickGo_LListImg;
this.quickGo_RListImg = quickGo_RListImg;
this.quickGoImgNum = quickGoImgNum;
this.cut_LListImg = cut_LListImg;
this.cut_RListImg = cut_RListImg;
this.cutImgNum = cutImgNum;
this.skill_LListImg = skill_LListImg;
this.skill_RListImg = skill_RListImg;
this.skillImgNum = skillImgNum;
//默认的初始值
this.status = "stand--right";
this.show = stand_RImg;
this.thread = new Thread(this);
thread.start();
}
//主角用的构造方法
public People(int x,int y,int width,int height,float hp,float atk,int walkSpeed,Image stand_LImg,Image stand_RImg,
Image defend_LImg,Image defend_RImg,List<Image> run_LListImg,List<Image> run_RListImg,int runImgNum,
List<Image> quickGo_LListImg,List<Image> quickGo_RListImg,int quickGoImgNum,
List<Image> jump_LListImg,List<Image> jump_RListImg,int jumpImgNum,
List<Image> cut_LListImg,List<Image> cut_RListImg,int cutImgNum,
List<Image> flyKick_LListImg,List<Image> flyKick_RListImg,int flyKickImgNum,
List<Image> longAttack_LListImg,List<Image> longAttack_RListImg,int longAttackImgNum,
List<Image> skill_LListImg,List<Image> skill_RListImg,int skillImgNum) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.hp = hp;
this.atk = atk;
this.walkSpeed = walkSpeed;
this.stand_LImg = stand_LImg;
this.stand_RImg = stand_RImg;
this.defend_LImg = defend_LImg;
this.defend_RImg = defend_RImg;
this.quickGo_LListImg = quickGo_LListImg;
this.quickGo_RListImg = quickGo_RListImg;
this.quickGoImgNum= quickGoImgNum;
this.run_LListImg = run_LListImg;
this.run_RListImg = run_RListImg;
this.runImgNum = runImgNum;
this.jump_LListImg = jump_LListImg;
this.jump_RListImg = jump_RListImg;
this.jumpImgNum = jumpImgNum;
this.cut_LListImg = cut_LListImg;
this.cut_RListImg = cut_RListImg;
this.cutImgNum = cutImgNum;
this.flyKick_LListImg = flyKick_LListImg;
this.flyKick_RListImg = flyKick_RListImg;
this.flyKickImgNum = flyKickImgNum;
this.longAttack_LListImg = longAttack_LListImg;
this.longAttack_RListImg = longAttack_RListImg;
this.longAttackImgNum = longAttackImgNum;
this.skill_LListImg = skill_LListImg;
this.skill_RListImg = skill_RListImg;
this.skillImgNum = skillImgNum;
//默认的初始值
this.status = "stand--right";//默认的人物状态是向右站立
this.show = stand_RImg;//默认向右站立(不写也可以)
this.thread = new Thread(this);
thread.start();//开启线程
}
2.人物的移动,攻击,技能方法:
//向左移动时 调用此函数
public void leftMove() {
xSpeed = -walkSpeed;//改变速度
status = "run--left";
}
//向右移动时 调用此函数
public void rightMove() {
xSpeed = walkSpeed;
status = "run--right";
}
//面向左停止
public void leftStop() {
xSpeed = 0;
status = "stop--left";
}
//面向右停止
public void rightStop() {
xSpeed = 0;
status = "stop--right";
}
//防御
public void defend() {
xSpeed = 0;//防御时不能移动
if (status.indexOf("jump") == -1) {//跳跃的时候不能防御
if (status.indexOf("left") != -1) {//如果面向左
status = "defend--left";
}else {
status = "defend--right";
}
}
}
//冲锋
public void quickGo() {
if (status.indexOf("jump") == -1) {//不在跳跃状态
if (status.indexOf("left") != -1) {//如果面向左
status = "quickGo--left";
this.xSpeed = -walkSpeed*2;
}else {
status = "quickGo--right";
this.xSpeed = walkSpeed*2;
}
}
}
//跳跃
public void jump() {
if (status.indexOf("left") != -1) {//如果面向左
status = "jump--left";
}else {
status = "jump--right";
}
ySpeed = -10;//向上跳y 减少
upTime = 5;//相当于向上跳了50像素
}
//主角,小怪,Boss的普通攻击
public void attack() {
if (status.indexOf("left") != -1) {//如果面朝着左边
status = "cut--left";
}else {
status = "cut--right";
}
}
//主角飞踢
public void flyKick() {
if (status.indexOf("left") != -1) {//如果面朝着左边
status = "flyKick--left";
}else {
status = "flyKick--right";
}
}
//主角连击
public void longAttack() {
if (status.indexOf("jump") == -1) {//只有站立在地面上才能使用连击
xSpeed = 0;//使用连击时不能移动
if (status.indexOf("left") != -1) {//如果面朝着左边
status = "longAttack--left";
}else {
status = "longAttack--right";
}
}
}
//主角,小怪,Boss的技能
public void skill() {
if (status.indexOf("left") != -1) {
status = "skill--left";
}else {
status = "skill--right";
}
}
//人物结束了攻击,跳跃,技能等行为
public void actionStop() {
if (status.indexOf("slip") != -1) this.y = 270;
if (status.indexOf("quickGo") != -1) this.setXSpeed(0);
if (status.indexOf("left") != -1) {//如果面朝着左边
status = "stop--left";
}else {//如果面朝着右边
status = "stop--right";
}
}
3.在死循环里判断人物的动作:
//在死循环里判断
@Override
public void run() {
while(true) {
if(y == 270 && upTime == 0) {//此时在地面上
//此时人物没有拳击,连击,技能,冲锋,防御
if (status.indexOf("cut") == -1 && status.indexOf("longAttack") == -1 &&
status.indexOf("skill") == -1 && status.indexOf("quickGo") == -1
&& status.indexOf("defend") == -1) {
if (status.indexOf("left") != -1 ) {//判断方向
if(xSpeed != 0) {//判断是否在移动中
status = "run--left";
}else {
status = "stop--left";
}
}else if (status.indexOf("right") != -1) {
if(xSpeed != 0) {//判断是否在移动中
status = "run--right";
}else {
status = "stop--right";
}
}
}
}else {//处于上升或下降的状态
if(upTime != 0) {
upTime --;//让upTime 一直自减
}else {//这时upTime=0,达到了最高点
ySpeed = 10;//改变ySpeed 的正负,让人物下降
}
y += ySpeed;//实现y 轴坐标的上下改变
}
//判断是否在运动,如果在运动,改变位置坐标
if (xSpeed != 0) {
x += xSpeed;
//判断是否运动到了屏幕的边界,并防止超出屏幕界限
if (x < 0) x = 0;
if (x >= 960) x = 960;
}
//判断当前是否是移动状态,改变跑步图片的索引,如果在移动,改变索引(不断改变索引,从而改变图片)
if (status.contains("run")) indexRun = indexRun < runImgNum-1 ? indexRun+1 : 0;
//改变跳的图片的索引
if (status.contains("jump")) indexJump = indexJump < jumpImgNum-1 ? indexJump+1 : 0;
//改变普通攻击的图片的索引
if (status.contains("cut")) indexAttack = indexAttack < cutImgNum-1 ? indexAttack+1 : 0;
//改变飞踢的图片的索引
if (status.contains("flyKick")) indexFlyKick = indexFlyKick < flyKickImgNum-1 ? indexFlyKick+1 : 0;
//改变连击的图片的索引
if (status.contains("longAttack")) indexLongAttack = indexLongAttack < longAttackImgNum-1 ? indexLongAttack+1 : 0;
//改变放技能的图片的索引
if (status.contains("skill")) indexSkill = indexSkill < skillImgNum-1 ? indexSkill+1 : 0;
//改变冲锋的图片的索引
if (status.contains("quickGo")) indexQuickGo = indexQuickGo < quickGoImgNum-1 ? indexQuickGo+1 : 0;
//改变停止的图片
if (status.equals("stop--left")) show = stand_LImg;
if (status.equals("stop--right")) show = stand_RImg;
//改变防御的图片
if (status.equals("defend--left")) show = defend_LImg;
if (status.equals("defend--right")) show = defend_RImg;
//改变移动的图片
if (status.equals("run--left")) show = run_LListImg.get(indexRun);
if (status.equals("run--right")) show = run_RListImg.get(indexRun);
//改变跳跃的图片
if (status.equals("jump--left")) show = jump_LListImg.get(indexJump);
if (status.equals("jump--right")) show = jump_RListImg.get(indexJump);
//改变攻击的图片
if (status.equals("cut--left"))show = cut_LListImg.get(indexAttack);
if (status.equals("cut--right")) show = cut_RListImg.get(indexAttack);
//改变飞踢的图片
if (status.equals("flyKick--left")) show = flyKick_LListImg.get(indexFlyKick);
if (status.equals("flyKick--right")) show = flyKick_RListImg.get(indexFlyKick);
//改变连击的图片
if (status.equals("longAttack--left")) show = longAttack_LListImg.get(indexLongAttack);
if (status.equals("longAttack--right")) show = longAttack_RListImg.get(indexLongAttack);
//改变技能的图片
if (status.equals("skill--left")) show = skill_LListImg.get(indexSkill);
if (status.equals("skill--right")) show = skill_RListImg.get(indexSkill);
//改变冲锋的图片
if (status.equals("quickGo--left")) show = quickGo_LListImg.get(indexQuickGo);
if (status.equals("quickGo--right")) show = quickGo_RListImg.get(indexQuickGo);
//休眠100毫秒,最好与主包里的休眠时间一致
try {
Thread.sleep(100);
} catch (Exception e) {}
}
}
4.人物的各种动作的冷却:
//攻击冷却
class cutCD extends Thread{
public void run() {
cutCoolDown = false;
try {
Thread.sleep(500);//拳击冷却时间,每隔0.5秒
cutCoolDown = true;
} catch (Exception e) {}
this.interrupt();//中断线程(如果不中断好像暂时也没有问题)
}
}
//跳跃冷却
class jumpCD extends Thread{
public void run() {
jumpCoolDown = false;
try {
Thread.sleep(1000);
jumpCoolDown = true;
} catch (Exception e) {}
this.interrupt();
}
}
//飞踢冷却
class flyKickCD extends Thread{
public void run() {
flyKickCoolDown = false;
try {
Thread.sleep(500);
flyKickCoolDown = true;
} catch (Exception e) {}
this.interrupt();
}
}
//连击冷却
class longAttackCD extends Thread{
public void run() {
longAttackCoolDown = false;
try {
Thread.sleep(500);
longAttackCoolDown = true;
} catch (Exception e) {}
this.interrupt();
}
}
//技能冷却
class skillCD extends Thread{
public void run() {
skillCoolDown = false;
try {
Thread.sleep(3000);
skillCoolDown = true;
} catch (Exception e) {}
this.interrupt();
}
}
//冲锋冷却
class quickGoCD extends Thread{
public void run() {
quickGoCoolDown = false;
try {
Thread.sleep(500);
quickGoCoolDown = true;
} catch (Exception e) {}
this.interrupt();
}
}
5.碰撞
//碰撞
public Rectangle getRec() {
return new Rectangle(x,y,width,height);
}
6.一些set,get方法:
//一些set函数
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public void setShow(Image show) {
this.show = show;
}
public void setStatus(String status) {
this.status = status;
}
public void setXSpeed(int xSpeed) {
this.xSpeed = xSpeed;
}
public void setYSpeed(int ySpeed) {
this.ySpeed = ySpeed;
}
public void setUpTime(int upTime) {
this.upTime = upTime;
}
//get函数
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public float getHp() {
return hp;
}
public float getAtk() {
return atk;
}
public String getStatus() {
return status;
}
public Image getShow() {
return show;
}
public int getXSpeed() {
return xSpeed;
}
public int getYSpeed() {
return ySpeed;
}
public int getUpTime() {
return upTime;
}
//获得相关行为的图片索引
public int getIndexRun() {
return indexRun;
}
public int getIndexJump() {
return indexJump;
}
public int getIndexAttack() {
return indexAttack;
}
public int getIndexFlyKick() {
return indexFlyKick;
}
public int getIndexLongAttack() {
return indexLongAttack;
}
public int getIndexSkill() {
return indexSkill;
}
//获得相关行为的图片数量
public int getRunImgNum() {
return runImgNum;
}
public int getJumpImgNum() {
return jumpImgNum;
}
public int getCutImgNum() {
return cutImgNum;
}
public int getFlyKickImgNum() {
return flyKickImgNum;
}
public int getLongAttackImgNum() {
return longAttackImgNum;
}
public int getSkillImgNum() {
return skillImgNum;
}
//获得相关攻击图片列表
public List<Image> getCut_LListImg(){
return cut_LListImg;
}
public List<Image> getCut_RListImg(){
return cut_RListImg;
}
public List<Image> getFlyKick_LListImg(){
return flyKick_LListImg;
}
public List<Image> getFlyKick_RListImg(){
return flyKick_RListImg;
}
public List<Image> getLongAttack_LListImg(){
return longAttack_LListImg;
}
public List<Image> getLongAttack_RListImg(){
return longAttack_RListImg;
}
public List<Image> getSkill_ListImg(){
return skill_LListImg;
}
public List<Image> getSkill_RistImg(){
return skill_RListImg;
}
五、Role 主角类
1.构造方法:
//构造方法
public Role() {}
public Role(int x,int y,int width,int height,float hp,float atk,int walkSpeed,Image stand_LImg,Image stand_RImg,
Image defend_LImg,Image defend_RImg,List<Image> run_LListImg,List<Image> run_RListImg,int runImgNum,
List<Image> slip_LListImg,List<Image> slip_RLIstImg,int slipImgNum,
List<Image> jump_LListImg,List<Image> jump_RListImg,int jumpImgNum,
List<Image> cut_LListImg,List<Image> cut_RListImg,int cutImgNum,
List<Image> flyKick_LListImg,List<Image> flyKick_RListImg,int flyKickImgNUm,
List<Image> longAttack_LListImg,List<Image> longAttack_RListImg,int longAttackImgNum,
List<Image> skill_LListImg,List<Image> skill_RListImg,int skillImgNum) {
super(x,y,width,height,hp,atk,walkSpeed,stand_LImg,stand_RImg,defend_LImg,defend_RImg,run_LListImg,run_RListImg,
runImgNum,slip_LListImg,slip_RLIstImg,slipImgNum,jump_LListImg,jump_RListImg,jumpImgNum,cut_LListImg,
cut_RListImg,cutImgNum,flyKick_LListImg,flyKick_RListImg,flyKickImgNUm,longAttack_LListImg,
longAttack_RListImg,longAttackImgNum,skill_LListImg,skill_RListImg,skillImgNum);
}
2.主角被攻击:
//主角被攻击
public void isWound() {
GameFame.isCutAgoHp = this.getHp();//被攻击前的血量,用于张飞的被动
//被小怪攻击
for (int i = 0;i<GameUtils.enemyListImg.size();i++) {
//如果遇到了小怪
if (this.getRec().intersects(GameUtils.enemyListImg.get(i).getRec())) {
//主角死亡
if (hp <= 0) GameFame.gameState = 4;
//被拳击攻击到
if (GameUtils.enemyListImg.get(i).getStatus().indexOf("cut") != -1 ) {
if (this.status.indexOf("defend") != -1) {//如果此时在防御,只受到敌人三分之一的攻击力
this.hp -= GameUtils.enemyListImg.get(i).getAtk()/3;
}else {
this.hp -= GameUtils.enemyListImg.get(i).getAtk();
}
}
//被技能攻击到
if (GameUtils.enemyListImg.get(i).getStatus().indexOf("skill") != -1) {
if (this.status.indexOf("defend") != -1) {
this.hp -= (GameUtils.enemyListImg.get(i).getAtk()*2)/3;
}else {
this.hp -= GameUtils.enemyListImg.get(i).getAtk()*2;
}
}
//被冲锋攻击到
if (GameUtils.enemyListImg.get(i).getStatus().indexOf("quickGo") != -1) {
if (this.status.indexOf("defend") != -1) {
this.hp -= (GameUtils.enemyListImg.get(i).getAtk()*2)/3;
}else {
this.hp -= GameUtils.enemyListImg.get(i).getAtk()*1.5;
}
}
}
}
//被Boss攻击
for (int i = 0;i<GameUtils.bossListImg.size();i++) {
//如果遇到了Boss
if (this.getRec().intersects(GameUtils.bossListImg.get(i).getRec())) {
//主角死亡
if (hp <= 0) GameFame.gameState = 4;
//被拳击攻击到
if (GameUtils.bossListImg.get(i).getStatus().indexOf("cut") != -1 ) {
if (this.status.indexOf("defend") != -1) {//如果此时在防御,只受到敌人三分之一的攻击力
this.hp -= GameUtils.bossListImg.get(i).getAtk()/3;
}else {
this.hp -= GameUtils.bossListImg.get(i).getAtk();
}
}
//被技能攻击到
if (GameUtils.bossListImg.get(i).getStatus().indexOf("skill") != -1) {
if (this.status.indexOf("defend") != -1) {
this.hp -= (GameUtils.bossListImg.get(i).getAtk()*2)/3;
}else {
this.hp -= GameUtils.bossListImg.get(i).getAtk()*2;
}
}
if (GameUtils.bossListImg.get(i).getStatus().indexOf("quickGo") != -1) {
if (this.status.indexOf("defend") != -1) {
this.hp -= (GameUtils.bossListImg.get(i).getAtk()*2)/3;
}else {
this.hp -= GameUtils.bossListImg.get(i).getAtk()*1.5;
}
}
}
}
//用于张飞的被动,随着生命的降低,攻击力不断增加,相当于每损失100 血量,增加1点攻击
if (GameFame.role == GameFame.role2) {
float n = (GameFame.isCutAgoHp - this.getHp())/100;
this.atk += n;
}
}
3.主角吃食物:
public void eatFood() {
//遍历食物列表
for (int i = 0;i<GameUtils.gameObjListImg.size();i++) {
if (GameUtils.gameObjListImg.get(i).getRec().intersects(this.getRec())) {
//当食物是酒时能增加攻击力
if (GameUtils.gameObjListImg.get(i).getImg() == GameUtils.drinkImg) {
this.atk +=GameUtils.gameObjListImg.get(i).getRecover();
}else {//恢复血量
if (this.getHp() < GameUtils.hp1) {
//防止血量超出上限
if (GameFame.role == GameFame.role1) {//主角1
if (this.getHp()+GameUtils.gameObjListImg.get(i).getRecover() > GameUtils.hp1) {
this.hp = GameUtils.hp1;
}else {
this.hp += GameUtils.gameObjListImg.get(i).getRecover();
}
}
if (GameFame.role == GameFame.role2) {//主角2
if (this.getHp()+GameUtils.gameObjListImg.get(i).getRecover() > GameUtils.hp2) {
this.hp = GameUtils.hp2;
}else {
this.hp += GameUtils.gameObjListImg.get(i).getRecover();
}
}
if (GameFame.role == GameFame.role3) {//主角3
if (this.getHp()+GameUtils.gameObjListImg.get(i).getRecover() > GameUtils.hp3) {
this.hp = GameUtils.hp3;
}else {
this.hp += GameUtils.gameObjListImg.get(i).getRecover();
}
}
if (GameFame.role == GameFame.role4) {//主角4
if (this.getHp()+GameUtils.gameObjListImg.get(i).getRecover() > GameUtils.hp4) {
this.hp = GameUtils.hp4;
}else {
this.hp += GameUtils.gameObjListImg.get(i).getRecover();
}
}
}
}
//将已经吃过的食物添加到removeObjListImg中
GameUtils.removeObjListImg.add(GameUtils.gameObjListImg.get(i));
}
//人物向右走时,为了实现食物与人物的距离在减小
if (this.getStatus().contains("run--right") && GameFame.bgWalk != -4120) {
int foodX = GameUtils.gameObjListImg.get(i).getX();
GameUtils.gameObjListImg.get(i).setX(foodX-this.getXSpeed());
}
}
}
4.键盘控制:
//键盘的按下,来控制移动
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()){
case KeyEvent.VK_A://向左走
leftMove();
break;
case KeyEvent.VK_D://向右走
rightMove();
break;
case KeyEvent.VK_S://防御
defend();
break;
case KeyEvent.VK_O://冲锋,0.5秒冷却
if (quickGoCoolDown) {
quickGo();
new quickGoCD().start();
}
break;
case KeyEvent.VK_W://跳跃1秒冷却
if (jumpCoolDown) {
jump();
new jumpCD().start();//判断跳跃冷却状态
}
break;
case KeyEvent.VK_J://拳击,无冷却
attack();
break;
case KeyEvent.VK_K://飞踢,0.5秒冷却
if (flyKickCoolDown) {
flyKick();
new flyKickCD().start();
}
break;
case KeyEvent.VK_L://连击,0.5无冷却
if (longAttackCoolDown){
longAttack();
new longAttackCD().start();
}
break;
case KeyEvent.VK_I://技能,3秒冷却
if (skillCoolDown) {
skill();
new skillCD().start();
}
break;
}
}
//键盘的松开,来控制暂停
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()){
case KeyEvent.VK_A:
leftStop();
break;
case KeyEvent.VK_D:
rightStop();
break;
case KeyEvent.VK_S:
case KeyEvent.VK_I:
case KeyEvent.VK_O:
case KeyEvent.VK_J:
case KeyEvent.VK_K:
case KeyEvent.VK_L:
actionStop();//停止各种攻击,跳跃,技能等行为
break;
}
}
六、Enemy 敌人类
Boss和小怪使用的是同一个类
1.构造方法:
int foodMove;//用于人物移动时,人物与食物之间的距离也会变化
//构造方法
public Enemy() {}
//用于敌人
public Enemy(int x,int y,int width,int height,float hp,float atk,int walkSpeed,Image stand_LImg,
Image stand_RImg,List<Image> run_LListImg,List<Image> run_RListImg,int runImgNum,
List<Image> quickGo_LListImg,List<Image> quickGo_RListImg,int quickGoImgNum,
List<Image> cut_LListImg,List<Image> cut_RListImg,int cutImgNum,
List<Image> skill_LListImg,List<Image> skill_RListImg,int skillImgNum) {
super(x,y,width,height,hp,atk,walkSpeed,stand_LImg,stand_RImg,run_LListImg,run_RListImg,runImgNum,
quickGo_LListImg,quickGo_RListImg,quickGoImgNum,
cut_LListImg,cut_RListImg,cutImgNum,skill_LListImg,skill_RListImg,skillImgNum);
}
2.移动和攻击
public void goAndCut() {
//被攻击减血
isWound();
//相遇了
if (isRec() ) {
//拳击
if (cutCoolDown) {
attack();
new cutCD().start();
}
//技能
if (skillCoolDown) {
int n = (int)(Math.random()*100);
if (n < 10 && this.getHp() > 800) skill();//血量大于800时,大约有十分之一的概率,发动技能
if (n < 30 && this.getHp() <= 500) skill();//血量小于500时,发动技能的概率为十分之三
new skillCD().start();
}
}else {
//移动
//通过敌人与主角x坐标差值的正负,来让敌人一直靠近主角,并在相遇的同时攻击主角
if (this.getX()-GameFame.role.getX() < 0) {
rightMove();
}else {
leftMove();
}
//敌人有百分之五的概率发动冲锋
int n = (int)(Math.random()*100);
if (quickGoCoolDown && n<5) {
quickGo();
new quickGoCD().start();
}
}
}
3.敌人的行为:
public void action() {
//判断敌人是否死亡
if (this.getHp() <= 0) {
GameFame.killEnemyCount ++;
//有概率生成食物,并将出现的食物添加到gameObjListImg中
int n = (int)(Math.random()*10);
switch (n) {
case 0,1,2,3://有十分之四的概率不会掉落食物
break;
case 4,5:
GameUtils.gameObjListImg.add(new GameObj(GameUtils.food1Img,this.getX()+25,this.getY()+40,48,32,100));
break;
case 6,7:
GameUtils.gameObjListImg.add(new GameObj(GameUtils.food2Img,this.getX()+25,this.getY()+40,48,32,200));
break;
case 8:
GameUtils.gameObjListImg.add(new GameObj(GameUtils.food3Img,this.getX()+25,this.getY()+40,64,32,300));
break;
case 9://这里酒增加的是攻击力
GameUtils.gameObjListImg.add(new GameObj(GameUtils.drinkImg,this.getX()+25,this.getY()+40,48,48,10));
break;
}
//用于魏延的被动
if (GameFame.role == GameFame.role4) {
if (100 + GameFame.role.getHp() > GameUtils.hp4) {
this.hp = GameUtils.hp4;
}else {
GameFame.role.hp += 100;
}
}
//将死亡的敌人添加到removeEnemyListImg中
GameUtils.removeEnemyListImg.add(this);
GameFame.nowEnemyCount-=5;//用于赵云的被动
}
goAndCut();//移动和攻击
}
4.敌人被攻击到了
public void isWound() {
if (isRec()) {//如果相遇
//判断主角是否攻击了,而且是哪一种攻击方式
//拳击击中了敌人
if (GameFame.role.getStatus().indexOf("cut") != -1) this.hp -= GameFame.role.getAtk()/2;
//飞踢击中了敌人
if (GameFame.role.getStatus().indexOf("flyKick") != -1) this.hp -= GameFame.role.getAtk()/1.5;
//连击击中了敌人
if (GameFame.role.getStatus().indexOf("longAttack") != -1) this.hp -= GameFame.role.getAtk()/1.5;
//技能击中了敌人
if (GameFame.role.getStatus().indexOf("skill") != -1) this.hp -= GameFame.role.getAtk();
//冲撞击中了敌人
if (GameFame.role.getStatus().indexOf("quickGo") != -1) this.hp -= GameFame.role.getAtk()/1.5;
}
}
5.判断敌人与主角是否相遇
public boolean isRec() {
if(this.getRec().intersects(GameFame.role.getRec())) {
return true;//相遇了
}else {
return false;//未相遇
}
}