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

📄 hero.java~25~

📁 这是个功能比较多的RPG 但是也存在比较多的BUG 有待完善中
💻 JAVA~25~
📖 第 1 页 / 共 2 页
字号:
                                               npc[i].getPosX() + 6,
                                               npc[i].getPosY() + 3 + 16, 8, 14)) {
                                    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)) {
                                    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 >= 0 && 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[2][nowFrame] * 24, y + 6,
                           0);
            break;
        case 4: //向左走
            if (collision.InBigMap()) {
                if (col - 1 + placeX >= 0) {
                    nextGrid = map.GetMapData(row + placeY, col - 1 + placeX);
                    if (collision.InCanGoGrid(nextGrid)) {
                        if (col <= 5 && placeX - 1 >= 0) {
                            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 >= 0 && 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[3][nowFrame] * 24, y + 6,
                           0);
            break;
        }
        nowFrame++; //下一帧
        if (nowFrame > 2)
            nowFrame = 0;
        if (dir != 0 && collision.InBigMap()) { //在大地图中每走动一步
            stepToFight--;
            if (stepToFight < 0) { //触发战斗
                fighted = true;
                battle.reset(this.level, this.hp, this.mp, this.experience); //将主角信息传入 CBattle 中,使场景主角信息与战斗主角信息同步
            }
        }
        g.setClip(0, 0, 176, 208);
        g.setColor(255, 0, 0);
//        g.drawString("nextGrid="+nextGrid, 0, 0, 0);
//        g.drawString("x=" + x + " y=" + y, 0, 20, 0);
//        g.drawString("placeX=" + placeX + " placeY=" + placeY, 0, 40, 0);
//        g.drawString("faceDir=" + faceDir, 0, 60, 0);
//        g.drawLine(x, y, x, y);
//        g.fillRect(col * 16, row * 16, 16, 16);
//        g.drawRect(x - 6, y + 16, 18, 32);   //碰撞盒!!!!!
//        g.drawRect(npc[0].getPosX() + 6, npc[0].getPosY() + 3, 8, 14);
//        g.drawRect(npc[1].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
//        g.drawRect(npc[2].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
//        g.drawRect(npc[3].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
//        g.drawRect(npc[4].getPosX() + 6, npc[1].getPosY() + 3, 8, 14);
//        g.drawString("nextCollide=" + nextCollideNPC, 0, 0, 0);
//        g.drawRect(npcX + 6, npcY + 3, 8, 14);
    }

    //---------------------------------------------------
    // 根据场景号画 NPC
    //---------------------------------------------------
    public void drawNPC(Graphics g) {
        switch (scene) {
        case 1: //在大地图中
            for (int i = 0; i < npc.length; i++) {
                if (npc[i].getSceneID() == 1) {
                    npc[i].setPos(npc[i].getOriPosX() -
                                  16 * (placeX - npc[i].getPlaceX()) - 6,
                                  npc[i].getOriPosY() -
                                  16 * (placeY - npc[i].getPlaceY()));
                    if (npc[i].getPosX() < -26 || npc[i].getPosX() > 176 ||
                        npc[i].getPosY() < -37 || npc[i].getPosY() > 208) { //NPC 在视图外面,不用画了。
                        //break;
                    }
                    g.setClip(npc[i].getPosX(), npc[i].getPosY(), 26, 37);
                    g.drawImage(mc.image.img_NPC, npc[i].getPosX() - npc[i].getID() * 26,
                                   npc[i].getPosY(), 0);
                }
            }
            break;
        case 2: //在小地图中
            for (int i = 0; i < npc.length; i++) {
                if (npc[i].getSceneID() == 2) {
                    g.setClip(npc[i].getPosX(), npc[i].getPosY(), 26, 37);
                    g.drawImage(mc.image.img_NPC, npc[i].getPosX() - npc[i].getID() * 26,
                                   npc[i].getPosY(), 0);
                }
            }
            break;
        }
    }

    //---------------------------------------------------
    // 战斗类的渲染
    //---------------------------------------------------
    public void drawBattle(Graphics g) {
        battle.paint(g);
        updatePlayer(); //每回合更新主角信息
        if (battle.isFinished()) { //战斗结束
            fighted = false;
            stepToFight = mc.tools.getRandomNumber(30,50);
        }
    }

    //---------------------------------------------------
    // 判断两个 RECT 是否碰撞
    //---------------------------------------------------
    public boolean RectInRect(int Rect1X, int Rect1Y, int Rect1W, int Rect1H,
                              int Rect2X, int Rect2Y, int Rect2W, int Rect2H) {
        if (Rect1X + Rect1W < Rect2X ||
            Rect1X > Rect2X + Rect2W ||
            Rect1Y + Rect1H < Rect2Y ||
            Rect1Y > Rect2Y + Rect2H)
            return false;
        return true;
    }

    //---------------------------------------------------
    // 更新主角信息
    //---------------------------------------------------
    public void updatePlayer() {
        this.hp = battle.getPlayerHP();
        this.mp = battle.getPlayerMP();
        this.level = battle.getPlayerLevel();
        this.level = battle.getPlayerExp();
    }

    //---------------------------------------------------
    // 返回下一步要碰撞的 NPC 的 ID 号
    //---------------------------------------------------
    public int getNextCollideNPC() {
        return nextCollideNPC;
    }

    //---------------------------------------------------
    // 返回是否正在战斗
    //---------------------------------------------------
    public boolean isFighted() {
        return fighted;
    }

    //---------------------------------------------------
    // 返回主角是否死亡
    //---------------------------------------------------
    public boolean isDead() {
        return battle.isDead();
    }

    //---------------------------------------------------
    // 得到下一步的地图块号
    //---------------------------------------------------
    public int getNextGrid() {
        return nextGrid;
    }

    //---------------------------------------------------
    // 得到 X 坐标
    //---------------------------------------------------
    public int getPosX() {
        return x;
    }

    //---------------------------------------------------
    // 得到 Y 坐标
    //---------------------------------------------------
    public int getPosY() {
        return y;
    }

    //---------------------------------------------------
    // 得到面向序号
    //---------------------------------------------------
    public int getFaceDir() {
        return facedir;
    }

    //---------------------------------------------------
    // 按键消息处理
    //---------------------------------------------------
    public void keyPressed(int key) {
        System.out.println("key===="+key);
        if (fighted) { //处于战斗页面
            battle.keyPressed(key);
        } else { //处于场景页面

            System.out.println("mc.UP===="+mc.UP);
            if (-key == mc.UP) {
                dir = 3; System.out.println("3");
            }
            if (-key == mc.DOWN) {
                dir = 1;System.out.println("1");
            }
            if (-key == mc.LEFT) {
                dir = 4;System.out.println("4");
            }
            if (-key == mc.RIGHT) {
                dir = 2; System.out.println("2");
            }
        }
    }

    //---------------------------------------------------
    // 按键消息处理
    //---------------------------------------------------
    public void keyReleased(int key) {
        if (dir != 0)
            facedir = dir;
        dir = 0; //松开键后站立
    }

}

⌨️ 快捷键说明

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