搜索附件  
同能RPG制作大师 附件中心 同能RM技术讨论区 RPG Maker MV 讨论区 【插件】地图显示小地图: MrLiu_MiniMap.rar

【插件】地图显示小地图: MrLiu_MiniMap.rar

 

【插件】地图显示小地图:
这个插件的写法借鉴了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在线咨询功能删除,谢谢。

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

GMT+8, 2024-5-20 14:24 , Processed in 0.027805 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部