📄 cbattle.java
字号:
import com.nokia.mid.ui.DirectGraphics;
import com.nokia.mid.ui.DirectUtils;
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.*;
public class CBattle
{
private Graphics m_offG;
private Image m_imPlayer; //主角站立与普通攻击图片
private Image m_imPlayerMagic; //主角特技攻击图片
private Image m_imPlayerDead; //主角死亡图片
private Image m_imEnimy; //怪物图片
private Image m_imBackground; //战斗背景图片
private Image m_imBattleMenu; //战斗菜单图片
private int m_playerX = 0; //人物坐标
private int m_playerY = 80;
private int m_enimyX = 100; //怪物坐标
private int m_enimyY = 50;
private int m_pointer = 1; //1--攻击 2--特技 3--道具 4--逃跑
private int m_selectItem = 0; //记录菜单中选项,1-4 与 pointer 一样,0--什么都没选
private int m_playerFightFrame[] = {0, 1, 1, 1, 2, 2, 3, 3, 3}; //站立与普通攻击时的帧控制
private int m_playerMagicFrame[] = {0, 0, 0, 1, 1, 1, 2, 2, 3, 3}; //魔法攻击时的帧控制
private int m_playerPosFrame[][] = {{0, 80}, {10, 80}, {15, 80}, {20, 80}, {40, 70}, {50, 60}, {70, 70}, {75, 80}, {75, 80}, {75, 80}};
private int m_enimy0Frame[] = {0, 0, 0, 0, 0, 1, 1, 2, 2}; //骷髅怪
private int m_enimy0PosFrame[][] = {{100, 70}, {90, 70}, {80, 65}, {75, 60}, {55, 55}, {45, 55}, {35, 60}, {30, 65}, {20, 70}};
private int m_enimy1Frame[] = {0, 0, 0, 1, 1, 1, 2, 2, 2}; //铁人怪
private int m_enimy1PosFrame[][] = {{100, 70}, {90, 70}, {80, 65}, {70, 60}, {60, 55}, {55, 55}, {45, 60}, {40, 65}, {30, 70}};
private int m_enimy2Frame[] = {0, 0, 0, 1, 1, 1}; //火龙怪
private int m_enimy2PosFrame[][] = {{100, 50}, {80, 50}, {70, 45}, {60, 40}, {50, 45}, {40, 50}};
private int m_playerNowFrame = 0; //主角当前帧
private int m_enimyNowFrame = 0; //怪物当前帧
private boolean m_enimyAttack = false; //是否应该轮到怪物攻击
private boolean m_canSelect = true; //当该回合战斗画面结束后才能选择
private int m_playerLv; //主角级别
private int m_playerHP; //主角生命值
private int m_playerMaxHP; //主角生命最大值
private int m_playerMP; //主角体力值
private int m_playerMaxMP; //主角体力最大值
private int m_playerAtt; //主角攻击力
private int m_playerExp; //主角当前经验值
private int m_enimyHP; //怪物生命值
private int m_enimyMaxHP; //怪物生命最大值
private int m_enimyAtt; //怪物攻击力
private byte m_succeed = 0; //是否战斗胜利 0--空状态 1--胜利 2--失败
private boolean m_exitBattle = false; //是否该退出战斗
private int m_timeBeforeExit = 30; //离退出战斗还有多长时间
private int m_enimyID; //怪物 ID 号
private Image m_imEnimyHead; //怪物头像图片
private int m_numForHit; //击中时扣除生命值的点数
private int m_timeForShowText; //但未击中时,将要显示“MISS”的帧数
private int m_textColor; //显示提示信息的字体颜色
private String m_text; //要显示的提示信息
private int m_gotExp; //战斗胜利得到的经验值
private boolean m_isLevelUp = false; //是否升级
private boolean m_canEscape = false; //能否逃跑
private int m_posForEscape; //逃跑时的位移
private boolean m_isEscaped = false; //是否已经逃跑成功
private boolean m_selectEscape = false; //是否选择了逃跑
private boolean m_selectMagic = false; //是否选择了特技
private boolean m_noMoreMP = false; //是否不够MP
//-----------------------------
// 构造函数
//-----------------------------
public CBattle(Graphics g)
{
m_offG = g;
try
{
m_imPlayer = Image.createImage("/data/playerfight.png");
m_imPlayerMagic = Image.createImage("/data/playermagic.png");
m_imPlayerDead = Image.createImage("/data/playerdead.png");
m_imEnimyHead = Image.createImage("/data/enimyhead.png");
m_imBackground = Image.createImage("/data/BattleBg.png");
m_imBattleMenu = Image.createImage("/data/BattleMenu.png");
} catch (IOException ex)
{
System.out.println("CBattle PIC ERROR!");
}
}
//-----------------------------
// 根据主角的级别初始化各变量
// 每次触发战斗都会调用此函数
//-----------------------------
public void reset(int level, int playerHP, int playerMP, int playerExp)
{
m_playerX = 0;
m_playerY = 80;
m_enimyX = 100;
m_enimyY = 50;
m_pointer = 1;
m_selectItem = 0;
m_playerNowFrame = 0;
m_enimyNowFrame = 0;
m_enimyAttack = false;
m_canSelect = true;
m_playerLv = level;
m_playerHP = playerHP;
m_playerMaxHP = 100 * m_playerLv;
m_playerMP = playerMP;
m_playerMaxMP = 50 * m_playerLv;
m_playerExp = playerExp;
m_playerAtt = 50 * m_playerLv;
m_enimyHP = 200 * m_playerLv;
m_enimyMaxHP = m_enimyHP;
m_enimyAtt = 10 * m_playerLv;
m_succeed = 0;
m_exitBattle = false;
m_timeBeforeExit = 30;
m_isLevelUp = false;
m_canEscape = false;
m_isEscaped = false;
m_selectEscape = false;
m_selectMagic = false;
Random random = new Random();
m_enimyID = Math.abs(random.nextInt()) % 3;
try
{
m_imEnimy = Image.createImage("/data/enimy" + m_enimyID + ".png"); //载入怪物图片
} catch (IOException ex)
{
System.out.println("CBattle PIC ERROR!");
}
System.gc();
}
//-----------------------------
//画主角
//-----------------------------
public void DrawPlayer()
{
Random random = new Random();
switch (m_selectItem)
{
case 0: //没选任何东西
m_playerNowFrame = 0;
break;
case 1: //攻击
m_playerNowFrame++; //下一帧
if (m_playerNowFrame >= m_playerFightFrame.length) //当动画全走完时
{
m_playerNowFrame = 0; //施发完后回到第一帧,站立
m_selectItem = 0;
m_enimyAttack = true; //主角施发完后轮到怪物进攻
if (Math.abs(random.nextInt() % 10) <= 8) //大概率击中敌人
{
m_numForHit = m_playerAtt + (random.nextInt() % 10);
m_enimyHP -= m_numForHit; //怪物生命值减少
m_text = "" + m_numForHit;
}
else
{
m_text = "MISS";
}
m_timeForShowText = 5; //显示“MISS”或扣除的点数 5 帧
m_textColor = 0x00FF0000; //显示字体为红色
if (m_enimyHP <= 0)
{
//战斗胜利!!!
m_succeed = 1;
m_enimyHP = 0;
m_gotExp = 40 + random.nextInt() % 5;
m_playerExp += m_gotExp; //获得经验值
}
}
break;
case 2: //特技
m_selectMagic = true;
if (m_playerMP < m_playerMaxMP / 5) //不够 MP 时
{
m_text = "Not enough MP";
m_textColor = 0x000000FF; //提示信息显示蓝色
m_timeForShowText = 10; //显示 10 帧
m_selectItem = 0;
m_canSelect = true;
m_noMoreMP = true;
break; //不使用特技
}
m_playerNowFrame++; //下一帧
if (m_playerNowFrame >= m_playerMagicFrame.length) //当动画全走完时
{
m_playerMP -= m_playerMaxMP / 5; //使用特技时消耗体力
m_playerNowFrame = 0; //施发完后回到第一帧,站立
m_selectItem = 0;
m_enimyAttack = true; //主角施发完后轮到怪物进攻
if (Math.abs(random.nextInt() % 10) <= 7) //这么多概率击中敌人
{
m_numForHit = 2 * m_playerAtt + (random.nextInt() % 10);
m_enimyHP -= m_numForHit; //怪物生命值减少
m_text = "" + m_numForHit;
}
else
{
m_text = "MISS";
}
m_timeForShowText = 5; //显示“MISS”或扣除的点数 5 帧
m_textColor = 0x00FF0000; //显示字体为红色
if (m_enimyHP <= 0)
{
//战斗胜利!!!
m_succeed = 1;
m_enimyHP = 0;
m_gotExp = 40 + random.nextInt() % 5;
m_playerExp += m_gotExp; //获得经验值
}
}
break;
case 3: //道具
m_selectItem = 0; //未完成!!!
m_canSelect = true;
break;
case 4: //逃跑
m_selectEscape = true;
if (Math.abs(random.nextInt()) % 10 <= 7) //大概率可以逃跑
{
m_canEscape = true;
m_posForEscape = 0;
}
else
{
m_canEscape = false;
m_text = "Failed to Escape";
m_textColor = 0x00FF00FF;
m_timeForShowText = 10; //显示 10 帧
}
m_selectItem = 0;
break;
}
m_playerX = m_playerPosFrame[m_playerNowFrame][0]; //进攻时人物移动,改变坐标
m_playerY = m_playerPosFrame[m_playerNowFrame][1];
if (m_playerHP <= 0) //死亡时
{
m_offG.setClip(m_playerX + 6, m_playerY, 64, 64);
m_offG.drawImage(m_imPlayerDead, m_playerX + 6, m_playerY, 0);
}
else if (m_selectItem == 2) //使用特技时
{
m_offG.setClip(m_playerX, m_playerY, 96, 64);
m_offG.drawImage(m_imPlayerMagic, m_playerX - m_playerMagicFrame[m_playerNowFrame] * 96, m_playerY, 0);
}
else if (m_canEscape) //逃跑成功时
{
m_posForEscape += 8;
m_offG.setClip(m_playerX - m_posForEscape, m_playerY, 64, 64);
m_offG.drawImage(m_imPlayer, m_playerX - m_posForEscape, m_playerY, 0);
if (m_playerX + 64 - m_posForEscape < 0) //主角移出去时标记为逃跑成功
{
m_isEscaped = true;
m_canEscape = false;
m_selectEscape = false;
}
}
else //其它情况
{
m_offG.setClip(m_playerX, m_playerY, 64, 64);
m_offG.drawImage(m_imPlayer, m_playerX - m_playerFightFrame[m_playerNowFrame] * 64, m_playerY, 0);
}
m_offG.setClip(0, 0, 176, 208);
}
//-----------------------------
// 画血格
//-----------------------------
public void DrawBlood()
{
//怪物的血
m_offG.setColor(255, 0, 0);
int tmpWidth = (int) 85.0 * m_enimyHP / m_enimyMaxHP;
m_offG.fillRect(50, 6, tmpWidth, 10);
//主角的血
tmpWidth = (int) 60.0 * m_playerHP / m_playerMaxHP;
m_offG.fillRect(5, 175, tmpWidth, 7);
//主角的蓝
m_offG.setColor(0, 0, 255);
tmpWidth = (int) 60.0 * m_playerMP / m_playerMaxMP;
m_offG.fillRect(2, 187, tmpWidth, 7);
m_offG.setClip(0, 0, 176, 208);
}
//-----------------------------
//画怪物
//-----------------------------
public void DrawEnimy()
{
Random random = new Random();
if (m_enimyHP <= 0)
{
return;
}
if (m_enimyAttack)
{
m_enimyNowFrame++; //下一帧
if (m_enimyID == 0 && m_enimyNowFrame >= m_enimy0Frame.length ||
m_enimyID == 1 && m_enimyNowFrame >= m_enimy1Frame.length ||
m_enimyID == 2 && m_enimyNowFrame >= m_enimy2Frame.length) //当动画全走完时
{
m_enimyNowFrame = 0; //回到第一帧,站立
m_enimyAttack = false; //怪物进攻完等待下一回合
m_canSelect = true; //怪物进攻完就可以选择菜单了
if (Math.abs(random.nextInt() % 10) < 7) //大概率击中主角
{
m_numForHit = m_enimyAtt + (random.nextInt() % 10);
m_playerHP -= m_numForHit; //主角生命值减少
m_text = "" + m_numForHit;
}
else
{
m_text = "MISS";
}
m_timeForShowText = 5; //显示“MISS”或扣除的点数 5 帧
m_textColor = 0x00FF0000; //显示字体为红色
if (m_playerHP <= 0)
{
//战斗失败!!!
m_succeed = 2;
m_playerHP = 0;
}
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -