扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 190|回复: 0

[转载发布] 【插件】地图显示小地图

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    2025-3-29 03:52
  • 签到天数: 127 天

    连续签到: 11 天

    [LV.7]常住居民III

    2350

    主题

    420

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    11311
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    14109

    灌水之王

    发表于 2024-3-6 10:29:06 | 显示全部楼层 |阅读模式
    这个插件的写法借鉴了rpg maker web 上的Hajime Hoshi的MiniMap的算法。
    我的初衷是模仿空之轨迹系列的小地图,国外已经有好几个版本的小地图了,但是都不智能。
    如果玩家用默认的插件画出来的地图歪瓜裂枣,我的这个插件意在帮助玩家在自动绘制
    的基础之上可以根据自己需求进行调整,绘制出诸如场景出入口,旅馆,一般建筑,教堂,武器店等,
    让玩家一目了然。同时该小地图会在人物对话或者事件执行或者打开开关的时候自动隐藏,不会永远
    傻儿吧唧的在那里不解风情的。

    接下来的版本会考虑配合我的世界地图插件和迷雾探索插件的,敬请期待。

    最后,诚挚的感谢我的好友高须小龙提供的图片素材,他亲自做的哦~~~

    效果1:只要你有耐心,城镇中的不同建筑物颜色都可以标记出来


    效果2:更智能的提醒玩家出入口位置


    修正方法:利用区块region id功能


    请将这个文件放在pictures目录下


    JAVASCRIPT 代码下载

    1. //=============================================================================
    2. // MrLiu_MiniMap.js
    3. //=============================================================================
    4. /*:
    5. * @plugindesc 在RMMV游戏的地图界面上显示小地图
    6. * @author MrLiu-过眼云烟
    7. * @param NotShowMiniMap
    8. * @desc 开启此开关则不显示小地图,多用于剧情等特殊场景。
    9. * @default 49
    10. *
    11. * @help 这个插件的写法借鉴了rpg maker web 上的Hajime Hoshi的MiniMap的算法
    12. * 使用方法是在地图的备注中加入 就会自动显示小地图,您可以通过打开开关
    13. * 或者NPC对话或者事件页运行的时候会自动隐藏。您可自行修改本插件78行--110行对应的区块
    14. * 颜色。实现您在小地图上的修改。能够更智能的画出您满意的小地图。请将minimap.png文件
    15. * 放在picture目录下,UI图片制作者是我的好友高须小龙,在此对他致以诚挚的感谢。
    16. * 目前我已经创建的图块颜色对应如下:1.边界[255,255,255,255] 2.通行补充[95, 147, 207, 212] 3不可通行补充[128, 128, 128, 192]4.场景出入口[255,256,75,50]
    17. * 5.一般建筑[11,43,68,206] 6.商店[74,135,65,112]7.冒险者工会[144,9,24,255]8.教会[140,90,53,26]9.旅馆[40,32,47,25]
    18. * 您可进行随意修改。
    19. */




    20. var parameters = PluginManager.parameters('MrLiu_MiniMap');
    21. var notShowSwitch = Number(parameters['NotShowMiniMap']);


    22. (function(){
    23.     var miniMapBitmaps = {};

    24.     var MINI_MAP_MARGIN = 50;
    25.     var MINI_MAP_SIZE = 150;//184;
    26.     var POSITION_RADIUS = 4;
    27.     var COLORS = {
    28.         'walk':     [95, 147, 207, 212],
    29.         'mountain': [255, 255, 255, 0],//224
    30.         'other':    [128, 128, 128, 0],//192
    31.     };
    32.     Bitmap.prototype.replacePixels = function(pixels){
    33.         var imageData = this._context.createImageData(this.width, this.height);
    34.         imageData.data.set(pixels);
    35.         this._context.putImageData(imageData, 0, 0);
    36.         this._setDirty();
    37.     };

    38.     function isWater(gameMap, x, y){
    39.         if(gameMap.isOverworld()){
    40.             var tileId = gameMap.autotileType(x, y, 0);//regionId
    41.             if([0, 1, 2, 3, 7].some(function(id){
    42.                 return id === tileId;
    43.             })){
    44.                 returntrue;
    45.             }
    46.         }
    47.         return gameMap.isShipPassable(x, y);
    48.     }

    49.     var Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
    50.     Scene_Map.prototype.onMapLoaded = function(){
    51.         Scene_Map_onMapLoaded.call(this);
    52.         if(!$dataMap.meta.mini_map){
    53.             return;
    54.         }
    55.         if($gameMap.mapId()in miniMapBitmaps){
    56.             return;
    57.         }
    58.         var pixels = new Uint8Array(4 * $dataMap.width * $dataMap.height);
    59.         var p = 0;
    60.         for(var j = 0; j < $dataMap.height; j++){
    61.             for(var i = 0; i < $dataMap.width; i++){
    62.                 var color = null;
    63.                 if($gameMap.checkPassage(i, j, 0x0f)){
    64.                     color = COLORS['walk'];
    65.                 }elseif(!isWater($gameMap, i, j)){
    66.                     color = COLORS['mountain'];
    67.                                 }else{
    68.                     color = COLORS['other'];
    69.                 }
    70. /*1.边界[255,255,255,255] 2.通行补充[95, 147, 207, 212] 3不可通行补充[128, 128, 128, 192]4.场景出入口[255,256,75,50]
    71. 5.一般建筑[11,43,68,206] 6.商店[74,135,65,112]7.冒险者工会[144,9,24,255]8.教会[140,90,53,26]9.旅馆[40,32,47,255]

    72. */
    73.                                 switch($gameMap.regionId(i, j)){
    74.                                         case0:
    75.                                                 break;
    76.                                         case1:
    77.                                                 color = [255,255,255,212];
    78.                                                 break;
    79.                                         case2:
    80.                                                 color = [95, 147, 207, 212];
    81.                                                 break;
    82.                                         case3:
    83.                                                 color = [128, 128, 128, 212];
    84.                                                 break;
    85.                                         case4:
    86.                                                 color = [125,256,75,212];
    87.                                                 break;
    88.                                         case5:
    89.                                                 color = [11,43,68,212];
    90.                                                 break;
    91.                                         case6:
    92.                                                 color = [74,135,65,212];
    93.                                                 break;
    94.                                         case7:
    95.                                                 color = [144,9,24,212];
    96.                                                 break;
    97.                                         case8:
    98.                                                 color = [140,90,53,212];
    99.                                                 break;
    100.                                         case9:
    101.                                                 color = [40,32,47,212];
    102.                                                 break;
    103.                                         case10:
    104.                                                 color = [74,135,65,212];
    105.                                                 break;                                                                                                                                                                                                                                                                                                                                               
    106.                                 };

    107.                                 //console.log($gameMap.regionId(i, j));
    108.                 pixels[p]   = color[0];
    109.                 pixels[p+1] = color[1];
    110.                 pixels[p+2] = color[2];
    111.                 pixels[p+3] = color[3];
    112.                 p += 4;
    113.             }
    114.         }
    115.         var bitmap = new Bitmap($dataMap.width, $dataMap.height);
    116.         bitmap.replacePixels(pixels);
    117.         miniMapBitmaps[$gameMap.mapId()] = bitmap;
    118.     };

    119.     var Spriteset_Map_createUpperLayer = Spriteset_Map.prototype.createUpperLayer;
    120.     Spriteset_Map.prototype.createUpperLayer = function(){
    121.         Spriteset_Map_createUpperLayer.call(this);
    122.         this.createMiniMap();
    123.     };

    124.     Spriteset_Map.prototype.createMiniMap = function(){
    125.                 this._miniMapUI = new Sprite();
    126.                 this._miniMapUI.bitmap = ImageManager.loadPicture('minimap');
    127.         this.addChild(this._miniMapUI);
    128.                 this._miniMapSprite = new Sprite();
    129.                 this.addChild(this._miniMapUI);
    130.                 this._miniMapSprite = new Sprite();
    131.         this._miniMapCurrentPositionSprite = new Sprite();
    132.         var positionBitmap = new Bitmap(POSITION_RADIUS * 2, POSITION_RADIUS * 2);
    133.         positionBitmap.drawCircle(POSITION_RADIUS, POSITION_RADIUS, POSITION_RADIUS, '#ff0000');
    134.         this._miniMapCurrentPositionSprite.bitmap = positionBitmap;
    135.         this.addChild(this._miniMapSprite);
    136.         this.addChild(this._miniMapCurrentPositionSprite);
    137.     };

    138.     var Spriteset_Map_update = Spriteset_Map.prototype.update;
    139.     Spriteset_Map.prototype.update = function(){
    140.         Spriteset_Map_update.call(this);
    141.         this.updateMiniMap();
    142.     };

    143.     Spriteset_Map.prototype.updateMiniMap = function(){
    144.         var miniMapBitmap = miniMapBitmaps[$gameMap.mapId()];
    145.         if(!miniMapBitmap ||($gameMap._interpreter.isRunning()) || ($gameSwitches.value(notShowSwitch) == true)){
    146.             this._miniMapSprite.visible = false;
    147.             this._miniMapCurrentPositionSprite.visible = false;
    148.                         this._miniMapUI.visible = false;
    149.             return;
    150.         }
    151.         var size = Math.max(miniMapBitmap.width, miniMapBitmap.height);
    152.         var miniMapScale = MINI_MAP_SIZE / size;
    153.         var miniMapX = Graphics.width - miniMapBitmap.width * miniMapScale - MINI_MAP_MARGIN;
    154.         var miniMapY = MINI_MAP_MARGIN;;//Graphics.height - miniMapBitmap.height * miniMapScale - MINI_MAP_MARGIN;
    155.         this._miniMapSprite.bitmap = miniMapBitmap;
    156.         this._miniMapSprite.x = miniMapX;
    157.         this._miniMapSprite.y = miniMapY;
    158.         this._miniMapSprite.scale.x = miniMapScale;
    159.         this._miniMapSprite.scale.y = miniMapScale;
    160.         this._miniMapCurrentPositionSprite.x = miniMapX + ($gamePlayer.x * miniMapScale) - POSITION_RADIUS;
    161.         this._miniMapCurrentPositionSprite.y = miniMapY + ($gamePlayer.y * miniMapScale) - POSITION_RADIUS;
    162.                 this._miniMapUI.visible = true;
    163.         this._miniMapSprite.visible = true;
    164.         this._miniMapCurrentPositionSprite.visible = true;
    165.     };

    166. })();
    复制代码




                 本帖来自P1论坛作者过眼云烟,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg. blue/forum.php?mod=viewthread&tid=386155  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-4-20 22:08 , Processed in 0.139003 second(s), 56 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表