📄 battle.java
字号:
package Game;
import javax.microedition.lcdui.Graphics;
import java.io.IOException;
import javax.microedition.lcdui.Image;
public class Battle
{
MyCanvas mc;
Image img_Emeny;
private int playerX = 0; //人物坐标
private int playerY = 80;
private int enimyX = 100; //怪物坐标
private int enimyY = 50;
private int pointer = 1; //1--攻击 2--特技 3--道具 4--逃跑
private int selectItem = 0; //记录菜单中选项,1-4 与 pointer 一样,0--什么都没选
private int playerFightFrame[] = {0, 1, 1, 1, 2, 2, 3, 3, 3}; //站立与普通攻击时的帧控制
private int playerMagicFrame[] = {0, 0, 0, 1, 1, 1, 2, 2, 3, 3}; //魔法攻击时的帧控制
private int playerPosFrame[][] = {{0, 80}, {10, 80}, {15, 80}, {20, 80}, {40, 70}, {50, 60}, {70, 70}, {75, 80}, {75, 80}, {75, 80}};
private int enimy0Frame[] = {0, 0, 0, 0, 0, 1, 1, 2, 2}; //骷髅怪
private int enimy0PosFrame[][] = {{100, 70}, {90, 70}, {80, 65}, {75, 60}, {55, 55}, {45, 55}, {35, 60}, {30, 65}, {20, 70}};
private int enimy1Frame[] = {0, 0, 0, 1, 1, 1, 2, 2, 2}; //铁人怪
private int enimy1PosFrame[][] = {{100, 70}, {90, 70}, {80, 65}, {70, 60}, {60, 55}, {55, 55}, {45, 60}, {40, 65}, {30, 70}};
private int enimy2Frame[] = {0, 0, 0, 1, 1, 1}; //火龙怪
private int enimy2PosFrame[][] = {{100, 50}, {80, 50}, {70, 45}, {60, 40}, {50, 45}, {40, 50}};
private int playerNowFrame = 0; //主角当前帧
private int enimyNowFrame = 0; //怪物当前帧
private boolean enimyAttack = false; //是否应该轮到怪物攻击
private boolean canSelect = true; //当该回合战斗画面结束后才能选择
private int playerLv; //主角级别
private int playerHP; //主角生命值
private int playerMaxHP; //主角生命最大值
private int playerMP; //主角体力值
private int playerMaxMP; //主角体力最大值
private int playerAtt; //主角攻击力
private int playerExp; //主角当前经验值
private int enimyHP; //怪物生命值
private int enimyMaxHP; //怪物生命最大值
private int enimyAtt; //怪物攻击力
private byte succeed = 0; //是否战斗胜利 0--空状态 1--胜利 2--失败
private boolean exitBattle = false; //是否该退出战斗
private int timeBeforeExit = 30; //离退出战斗还有多长时间
private int enimyID; //怪物 ID 号
private int numForHit; //击中时扣除生命值的点数
private int timeForShowText; //但未击中时,将要显示“MISS”的帧数
private int textColor; //显示提示信息的字体颜色
private String text; //要显示的提示信息
private int gotExp; //战斗胜利得到的经验值
private boolean isLevelUp = false; //是否升级
private boolean canEscape = false; //能否逃跑
private int posForEscape; //逃跑时的位移
private boolean isEscaped = false; //是否已经逃跑成功
private boolean selectEscape = false; //是否选择了逃跑
private boolean selectMagic = false; //是否选择了特技
private boolean noMoreMP = false; //是否不够MP
//-----------------------------
// 构造函数
//-----------------------------
public Battle(MyCanvas mc)
{
this.mc = mc;
}
//-----------------------------
// 根据主角的级别初始化各变量
// 每次触发战斗都会调用此函数
//-----------------------------
public void reset(int level, int playerHP, int playerMP, int playerExp)
{
playerX = 0;
playerY = 80;
enimyX = 100;
enimyY = 50;
pointer = 1;
selectItem = 0;
playerNowFrame = 0;
enimyNowFrame = 0;
enimyAttack = false;
canSelect = true;
playerLv = level;
playerHP = playerHP;
playerMaxHP = 100 * playerLv;
playerMP = playerMP;
playerMaxMP = 50 * playerLv;
playerExp = playerExp;
playerAtt = 50 * playerLv;
enimyHP = 200 * playerLv;
enimyMaxHP = enimyHP;
enimyAtt = 10 * playerLv;
succeed = 0;
exitBattle = false;
timeBeforeExit = 30;
isLevelUp = false;
canEscape = false;
isEscaped = false;
selectEscape = false;
selectMagic = false;
mc.tools.getRandomNumber(0,2);
enimyID = mc.tools.getRandomNumber(0,2);
switch(enimyID)
{
case 0:
this.img_Emeny = mc.image.img_Enemy0;
break;
case 1:
this.img_Emeny = mc.image.img_Enemy1;
break;
case 2:
this.img_Emeny = mc.image.img_Enemy2;
break;
}
}
//-----------------------------
//画主角
//-----------------------------
public void DrawPlayer(Graphics g)
{
switch (selectItem)
{
case 0: //没选任何东西
playerNowFrame = 0;
break;
case 1: //攻击
playerNowFrame++; //下一帧
if (playerNowFrame >= playerFightFrame.length) //当动画全走完时
{
playerNowFrame = 0; //施发完后回到第一帧,站立
selectItem = 0;
enimyAttack = true; //主角施发完后轮到怪物进攻
if (mc.tools.getRandomNumber(0,10) <= 8) //大概率击中敌人
{
numForHit = playerAtt + mc.tools.getRandomNumber(0,10);
enimyHP -= numForHit; //怪物生命值减少
text = "" + numForHit;
}
else
{
text = "MISS";
}
timeForShowText = 5; //显示“MISS”或扣除的点数 5 帧
textColor = 0x00FF0000; //显示字体为红色
if (enimyHP <= 0)
{
//战斗胜利!!!
succeed = 1;
enimyHP = 0;
gotExp = 40 + mc.tools.getRandomNumber(0,5);
playerExp += gotExp; //获得经验值
}
}
break;
case 2: //特技
selectMagic = true;
if (playerMP < playerMaxMP / 5) //不够 MP 时
{
text = "Not enough MP";
textColor = 0x000000FF; //提示信息显示蓝色
timeForShowText = 10; //显示 10 帧
selectItem = 0;
canSelect = true;
noMoreMP = true;
break; //不使用特技
}
playerNowFrame++; //下一帧
if (playerNowFrame >= playerMagicFrame.length) //当动画全走完时
{
playerMP -= playerMaxMP / 5; //使用特技时消耗体力
playerNowFrame = 0; //施发完后回到第一帧,站立
selectItem = 0;
enimyAttack = true; //主角施发完后轮到怪物进攻
if (mc.tools.getRandomNumber(0,10) <= 7) //这么多概率击中敌人
{
numForHit = 2 * playerAtt + mc.tools.getRandomNumber(0,10);
enimyHP -= numForHit; //怪物生命值减少
text = "" + numForHit;
}
else
{
text = "MISS";
}
timeForShowText = 5; //显示“MISS”或扣除的点数 5 帧
textColor = 0x00FF0000; //显示字体为红色
if (enimyHP <= 0)
{
//战斗胜利!!!
succeed = 1;
enimyHP = 0;
gotExp = 40 +mc.tools.getRandomNumber(0,5);
playerExp += gotExp; //获得经验值
}
}
break;
case 3: //道具
selectItem = 0; //未完成!!!
canSelect = true;
break;
case 4: //逃跑
selectEscape = true;
if (mc.tools.getRandomNumber(0,10)<= 7) //大概率可以逃跑
{
canEscape = true;
posForEscape = 0;
}
else
{
canEscape = false;
text = "Failed to Escape";
textColor = 0x00FF00FF;
timeForShowText = 10; //显示 10 帧
}
selectItem = 0;
break;
}
playerX = playerPosFrame[playerNowFrame][0]; //进攻时人物移动,改变坐标
playerY = playerPosFrame[playerNowFrame][1];
if (playerHP <= 0) //死亡时
{
g.setClip(playerX + 6, playerY, 64, 64);
g.drawImage(mc.image.img_HeroDead, playerX + 6, playerY, 0);
}
else if (selectItem == 2) //使用特技时
{
g.setClip(playerX, playerY, 96, 64);
g.drawImage(mc.image.img_heroFightMagic, playerX - playerMagicFrame[playerNowFrame] * 96, playerY, 0);
}
else if (canEscape) //逃跑成功时
{
posForEscape += 8;
g.setClip(playerX - posForEscape, playerY, 64, 64);
g.drawImage(mc.image.img_heroFightNormal, playerX - posForEscape, playerY, 0);
if (playerX + 64 - posForEscape < 0) //主角移出去时标记为逃跑成功
{
isEscaped = true;
canEscape = false;
selectEscape = false;
}
}
else //其它情况
{
g.setClip(playerX, playerY, 64, 64);
g.drawImage(mc.image.img_heroFightNormal, playerX - playerFightFrame[playerNowFrame] * 64, playerY, 0);
}
g.setClip(0, 0, 176, 208);
}
//-----------------------------
// 画血格
//-----------------------------
public void DrawBlood(Graphics g)
{
//怪物的血
g.setColor(255, 0, 0);
int tmpWidth = (int) 85.0 * enimyHP / enimyMaxHP;
g.fillRect(50, 6, tmpWidth, 10);
//主角的血
tmpWidth = (int) 60.0 * playerHP / playerMaxHP;
g.fillRect(5, 175, tmpWidth, 7);
//主角的蓝
g.setColor(0, 0, 255);
tmpWidth = (int) 60.0 * playerMP / playerMaxMP;
g.fillRect(2, 187, tmpWidth, 7);
g.setClip(0, 0, 176, 208);
}
//-----------------------------
//画怪物
//-----------------------------
public void DrawEnimy(Graphics g)
{
if (enimyHP <= 0)
{
return;
}
if (enimyAttack)
{
enimyNowFrame++; //下一帧
if (enimyID == 0 && enimyNowFrame >= enimy0Frame.length ||
enimyID == 1 && enimyNowFrame >= enimy1Frame.length ||
enimyID == 2 && enimyNowFrame >= enimy2Frame.length) //当动画全走完时
{
enimyNowFrame = 0; //回到第一帧,站立
enimyAttack = false; //怪物进攻完等待下一回合
canSelect = true; //怪物进攻完就可以选择菜单了
if ( mc.tools.getRandomNumber(0,10)< 7) //大概率击中主角
{
numForHit = enimyAtt + mc.tools.getRandomNumber(0,10);
playerHP -= numForHit; //主角生命值减少
text = "" + numForHit;
}
else
{
text = "MISS";
}
timeForShowText = 5; //显示“MISS”或扣除的点数 5 帧
textColor = 0x00FF0000; //显示字体为红色
if (playerHP <= 0)
{
//战斗失败!!!
succeed = 2;
playerHP = 0;
}
}
}
else
{
enimyNowFrame = 0;
}
switch (enimyID) //画怪物
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -