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

📄 hero.java

📁 这是个功能比较多的RPG 但是也存在比较多的BUG 有待完善中
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package Game;

import java.io.IOException;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Canvas;

public class Hero {
    MyCanvas mc;

    Image image; //加载地图用的图片
    Image player; //加载主角用的图片
    int hp, mp, maxHP, maxMP;
    int facedir = 1; //脸的朝向
    int dir = 0; //人物走动方向:   1--下  2--右  3--上  4--左
    int x, y; //英雄橫縱坐標
    int level; //等级
    int experience; //升级所需经验值
    int currentExperience; //当前经验值
    Map map; //地图信息
    Collision collision; //碰撞信息
    Battle battle; //战斗类
    int nowFrame = 0; //当前帧
//    控制动作变化的帧序号, 下, 右, 上, 左
    int moveFrame[][] = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, {9, 10, 11}
    };

    int placeX; //滚屏用
    int placeY;

    int nextGrid; //下一步的格序号
    int stepToFight; //离地雷式战斗还剩余的步数
    boolean fighted = false; //是否正在战斗

    Npc npc[];
    int scene; //当前的场景号
    int nextCollideNPC; //即将与这个 NPC 发生碰撞,如果不与任何一个 NPC 碰撞,其值为 -1


    public Hero( MyCanvas mc) {
        this.mc = mc;
        player = mc.image.img_Hero;
        this.level = 1; //游戏开始主角级别为 1
        this.hp = this.level * 100;
        this.mp = this.level * 50;
        battle = new Battle(mc);
        npc = new Npc[5];
        for (int i = 0; i < npc.length; i++) {
            npc[i] = new Npc();
        }
        npc[0].init(2, 1, 80, 12, 6, 0); //霍恩
        npc[1].init(4, 2, 100, 74, 0, 0); //阿美
        npc[2].init(1, 1, 128, 76, 11, 13); //胡尔
        npc[3].init(0, 1, 80, 76, 2, 10); //萨耶
        npc[4].init(3, 1, 96, 12, 11, 0); //尤诺

        this.level = 1;
        this.mc = mc;

    }

    public void reset() {
        this.level = 1;
        this.hp = this.level * 100;
        this.mp = this.level * 50;
        this.experience = 0;
        x = 48;
        y = 64;
        nowFrame = 0;
        dir = 0;
        facedir = 2;
        placeX = 0;
        placeY = 0;
        fighted = false; //是否正在战斗
        scene = 2;
    }

    public void restoreHPMP() { // 主角生命值、体力值全恢复
        this.hp = this.level * 100;
        this.mp = this.level * 50;
    }

    public void loadScene(int fromMap, int toMap) {
        scene = toMap;
        try {
            image = Image.createImage("/res/map0" + toMap + ".png");
            map = new Map("/res/map0" + toMap + ".dat");
            collision = new Collision("/res/map0" + toMap + ".cls");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        System.gc();
        dir = 0; //站立
        placeX = 0;
        placeY = 0;
        switch (toMap) { //根据地图初始化主角初始位置
        case 1: //切换到大地图( 1 号地图)
            if (fromMap == 2) { //从 2 号地图切换过来
                x = 80;
                y = 16;
                placeX = 3;
                placeY = 0;
                facedir = 1;
            }
            stepToFight = 50;
            break;
        case 2: //切换到 2 号地图
            if (fromMap == 0) { //第一次出现在地图中,即游戏开始时
//                    x    = 48;
//                    y    = 64;
//                    faceDir = 2;  //面向右
            } else if (fromMap == 1) { //从大地图( 1 号地图)切换过来
                x = 120;
                y = 100;
                facedir = 4; //面向左
            }
            break;
        }
    }

    //----------------------------------------------------------
    // 画地图,n 代表在地图编辑器中一行的块数
    //----------------------------------------------------------
    public void drawMap(Graphics g) {
        int n = image.getWidth() / 16;
        for (int row = 0; row < 13; row++) {
            for (int col = 0; col < 11; col++) {
                int k = map.GetMapData(row + placeY, col + placeX) - 1;
                int mx = col * 16; //当前绘制的横坐标
                int my = row * 16; //当前绘制的纵坐标
                g.setClip(mx, my, 16, 16); //设定剪裁区
                int movex = (k % n) * 16; //图片向左移动像素
                int movey = (k / n) * 16; //图片向上移动的像素
                g.drawImage(image, mx - movex, my - movey,
                            Graphics.LEFT | Graphics.TOP);
            }
        }
    }

    //---------------------------------------------------
    // 画人物
    // 在大地图中横竖着走,小地图中45度角斜走
    //---------------------------------------------------
    public void drawPlayer(Graphics g) {
        int row = (x + 48) / 16 - 1;
        int col = y / 16;
        int step = 8;
        switch (dir) { //根据方向判断人物要画第几帧
        case 0: //站立
            g.setClip(x - 6, y + 6, 24, 48); //加 6 减 6 是为了让主角对准格子
            switch (facedir) {
            case 1:
                g.drawImage(player, x - 6, y + 6, 0);
                break;
            case 2:
                g.drawImage(player, x - 6 - 72, y + 6, 0);
                break;
            case 3:
                g.drawImage(player, x - 6 - 144, y + 6, 0);
                break;
            case 4:
                g.drawImage(player, x - 6 - 216, y + 6, 0);
                break;
            }
            break;
        case 1: //向下走
            if (collision.InBigMap()) { //在大地图中
                if (row + 1 + placeY <= map.getRowNum()) { //防止越界
                    nextGrid = map.GetMapData(row + 1 + placeY, col + placeX); //下一步的地图块序号
                    if (collision.InCanGoGrid(nextGrid)) { //是否碰撞
                        if (row >= 6 && placeY + 1 < map.getRowNum() - 12) {
                            boolean collide = false; //是否碰撞
                            for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
                                if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
                                    RectInRect(x - 6, y + 16, 18, 32,
                                               npc[i].getPosX() + 6,
                                               npc[i].getPosY() + 3 - 16, 8, 14)) { //不与 NPC 碰撞才移动,-6、+16、+6、+3 是为了对齐人物,drawPlayer()最后的drawRect执行上就会明白
                                    collide = true; //与第 i 个 NPC 碰撞
                                    nextCollideNPC = npc[i].getID();
                                    break;
                                }
                            }
                            if (!collide) {
                                placeY++; //滚屏
                                nextCollideNPC = -1;
                            }
                        } else {
                            boolean collide = false; //是否碰撞
                            for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
                                if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
                                    RectInRect(x - 6, y + 16 + 16, 18, 32,
                                               npc[i].getPosX() + 6,
                                               npc[i].getPosY() + 3, 8, 14)) { //不与 NPC 碰撞才移动,-6、+16、+6、+3 是为了对齐人物,drawPlayer()最后的drawRect执行上就会明白
                                    collide = true; //与第 i 个 NPC 碰撞
                                    nextCollideNPC = npc[i].getID();
                                    break;
                                }
                            }
                            if (!collide) {
                                y += 16; //滚屏
                                nextCollideNPC = -1;
                            }
                        }
                    }
                }
            } else { //在小地图中
                row = (y + 40) / 16;
                col = (x + 12) / 16;
                if (row + 1 <= 10 && col - 1 >= 0) {
                    nextGrid = map.GetMapData(row + 1, col - 1);
                    if (collision.InCanGoGrid(nextGrid)) { //是否碰撞
                        boolean collide = false; //是否碰撞
                        for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
                            if (npc[i].getSceneID() == 2 && //是否是小场景中的一个NPC
                                RectInRect(x - 6 - step, y + 16 + step / 2, 18,
                                           32, npc[i].getPosX() + 6,
                                           npc[i].getPosY() + 3, 8, 14)) {
                                collide = true; //与第 i 个 NPC 碰撞
                                nextCollideNPC = npc[i].getID();
                                break;
                            }
                        }
                        if (!collide) {
                            x -= step;
                            y += step / 2;
                            nextCollideNPC = -1;
                        }
                    }
                }
            }
            g.setClip(x - 6, y + 6, 24, 48);
            g.drawImage(player, x - 6 - moveFrame[0][nowFrame] * 24, y + 6, 0);
            break;
        case 2: //向右走
            if (collision.InBigMap()) {
                if (col + 1 + placeX <= map.getColNum()) {
                    nextGrid = map.GetMapData(row + placeY, col + 1 + placeX);
                    if (collision.InCanGoGrid(nextGrid)) {
                        if (col >= 5 && placeX + 1 < map.getColNum() - 10) {
                            boolean collide = false; //是否碰撞
                            for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
                                if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
                                    RectInRect(x - 6, y + 16, 18, 32,
                                               npc[i].getPosX() + 6 - 16,
                                               npc[i].getPosY() + 3, 8, 14)) {
                                    collide = true; //与第 i 个 NPC 碰撞
                                    nextCollideNPC = npc[i].getID();
                                    break;
                                }
                            }
                            if (!collide) {
                                placeX++; //滚屏
                                nextCollideNPC = -1;
                            }
                        } else {
                            boolean collide = false; //是否碰撞
                            for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
                                if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC
                                    RectInRect(x - 6 + 16, y + 16, 18, 32,
                                               npc[i].getPosX() + 6,
                                               npc[i].getPosY() + 3, 8, 14)) {
                                    collide = true; //与第 i 个 NPC 碰撞
                                    nextCollideNPC = npc[i].getID();
                                    break;
                                }
                            }
                            if (!collide) {
                                x += 16; //滚屏
                                nextCollideNPC = -1;
                            }
                        }
                    }
                }
            } else {
                row = (y + 40) / 16;
                col = (x + 12) / 16;
                if (row + 1 <= 10 && col + 1 <= 12) {
                    nextGrid = map.GetMapData(row + 1, col + 1);
                    if (collision.InCanGoGrid(nextGrid)) {
                        boolean collide = false; //是否碰撞
                        for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
                            if (npc[i].getSceneID() == 2 && //是否是小场景中的一个NPC
                                RectInRect(x - 6 + step, y + 16 + step / 2, 18,
                                           32, npc[i].getPosX() + 6,
                                           npc[i].getPosY() + 3, 8, 14)) {
                                collide = true; //与第 i 个 NPC 碰撞
                                nextCollideNPC = npc[i].getID();
                                break;
                            }
                        }
                        if (!collide) {
                            x += step;
                            y += step / 2;
                            nextCollideNPC = -1;
                        }
                    }
                }
            }
            g.setClip(x - 6, y + 6, 24, 48);
            g.drawImage(player, x - 6 - moveFrame[1][nowFrame] * 24, y + 6,
                           0);
            break;
        case 3: //向上走
            if (collision.InBigMap()) {
                if (row - 1 + placeY >= 0) {
                    nextGrid = map.GetMapData(row - 1 + placeY, col + placeX);
                    if (collision.InCanGoGrid(nextGrid)) {
                        if (row <= 6 && placeY - 1 >= 0) {
                            boolean collide = false; //是否碰撞
                            for (int i = 0; i < npc.length; i++) { //与当前场景中所有 NPC 都进行碰撞检测
                                if (npc[i].getSceneID() == 1 && //是否是大场景中的一个NPC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -