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

📄 battle.java~8~

📁 这是个功能比较多的RPG 但是也存在比较多的BUG 有待完善中
💻 JAVA~8~
📖 第 1 页 / 共 2 页
字号:
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 + -