⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbattle.java

📁 经典java手机游戏J2me(Rpj游戏)
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -