Project1

标题: MrLiu地图插件的修改 [打印本页]

作者: sonicdonggua    时间: 2017-8-5 20:55
标题: MrLiu地图插件的修改
遵守插件利用规则,未禁止二次修改与发布,如有侵犯之处请见谅,我会第一时间删除。

MrLiu的地图插件可以实现地图位置查看,一个不足之处就是不随着人物移动而相应改变地图位置,这样倒是适合做成随时查询大地图的功能。我稍微编辑了一下,在地图上按下command键可以查看大地图。
JAVASCRIPT 代码复制
  1. //=============================================================================
  2. // MrLiu_MiniMap.js
  3. //=============================================================================
  4. /*:
  5. * @plugindesc 在RMMV游戏的地图界面上显示小地图
  6. * @author MrLiu-过眼云烟
  7.  * @param NotShowMiniMap
  8.  * @desc 开启此开关则不显示小地图,多用于剧情等特殊场景。
  9.  * @default 49
  10.  *
  11.  * @param Name X
  12.  * @desc 设置地图名称位置X值。
  13.  * @default 155
  14.  *
  15.  * @param Name Y
  16.  * @desc 设置地图名称位置Y值。
  17.  * @default 537
  18.  *
  19.  * @param Layout X
  20.  * @desc 设置地图名称装饰位置X值。
  21.  * @default 0
  22.  *
  23.  * @param Layout Y
  24.  * @desc 设置地图名称装饰位置Y值。
  25.  * @default 420
  26. * @help 这个插件的写法借鉴了rpg maker web 上的Hajime Hoshi的MiniMap的算法
  27. * 使用方法是在地图的备注中加入<mini_map> 就会自动显示小地图,您可以通过打开开关
  28. * 或者NPC对话或者事件页运行的时候会自动隐藏。您可自行修改本插件78行--110行对应的区块
  29. * 颜色。实现您在小地图上的修改。能够更智能的画出您满意的小地图。请将minimap.png文件
  30. * 放在picture目录下,UI图片制作者是我的好友高须小龙,在此对他致以诚挚的感谢。
  31. * 目前我已经创建的图块颜色对应如下:1.边界[255,255,255,255] 2.通行补充[95, 147, 207, 212] 3不可通行补充[128, 128, 128, 192]4.场景出入口[255,256,75,50]
  32. * 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]
  33. * 您可进行随意修改。
  34. */
  35.  
  36. var Imported = Imported || {};
  37. Imported.MrLiu_MiniMap = true;
  38. var MrLiu = MrLiu || {};
  39.  
  40. MrLiu.parameters = PluginManager.parameters('MrLiu_MiniMap');
  41. MrLiu.notShowSwitch = Number(MrLiu.parameters['NotShowMiniMap']);
  42. MrLiu.nameX = Number(MrLiu.parameters['Name X']);
  43. MrLiu.nameY = Number(MrLiu.parameters['Name Y']);
  44. MrLiu.layoutX = Number(MrLiu.parameters['Layout X']);
  45. MrLiu.layoutY = Number(MrLiu.parameters['Layout Y']);
  46. MrLiu.miniMapBitmaps = {};
  47.  
  48. MrLiu.POSITION_RADIUS = 4;
  49. MrLiu.COLORS = {
  50.     'walk':     [95, 147, 207, 212],
  51.     'mountain': [255, 255, 255, 0],//224
  52.     'other':    [128, 128, 128, 0],//192
  53. };
  54.  
  55. Bitmap.prototype.replacePixels = function(pixels) {
  56.     var imageData = this._context.createImageData(this.width, this.height);
  57.     imageData.data.set(pixels);
  58.     this._context.putImageData(imageData, 0, 0);
  59.     this._setDirty();
  60. };
  61.  
  62. function Scene_MapInfo() {
  63.     this.initialize.apply(this, arguments);
  64. }
  65.  
  66. Scene_MapInfo.prototype = Object.create(Scene_MenuBase.prototype);
  67. Scene_MapInfo.prototype.constructor = Scene_MapInfo;
  68.  
  69. Scene_MapInfo.prototype.create = function() {
  70.     Scene_MenuBase.prototype.create.call(this);
  71.     this.onMapLoaded();
  72.     this.createMiniMap();
  73.     this.updateMiniMap();
  74.     this.createLayout();
  75.     this.createName();
  76. };
  77.  
  78. Scene_MapInfo.prototype.createBackground = function() {
  79.     Scene_MenuBase.prototype.createBackground.call(this);
  80.     this._field = new Sprite();
  81.     this.addChild(this._field);
  82. };
  83.  
  84. Scene_MapInfo.prototype.isWater = function(gameMap, x, y){
  85.     if (gameMap.isOverworld()) {
  86.         var tileId = gameMap.autotileType(x, y, 0);//regionId
  87.         if ([0, 1, 2, 3, 7].some(function(id) {
  88.             return id === tileId;
  89.         })) {
  90.             return true;
  91.         }
  92.     }
  93.     return gameMap.isShipPassable(x, y);
  94. }
  95.  
  96. Scene_MapInfo.prototype.onMapLoaded = function() {
  97.     if (!$dataMap.meta.mini_map) {
  98.         return;
  99.     }
  100.     if ($gameMap.mapId() in MrLiu.miniMapBitmaps) {
  101.         return;
  102.     }
  103.     var pixels = new Uint8Array(4 * $dataMap.width * $dataMap.height);
  104.     var p = 0;
  105.     for (var j = 0; j < $dataMap.height; j++) {
  106.         for (var i = 0; i < $dataMap.width; i++) {
  107.             var color = null;
  108.             if ($gameMap.checkPassage(i, j, 0x0f)) {
  109.                 color = MrLiu.COLORS['walk'];
  110.             } else if (!this.isWater($gameMap, i, j)) {
  111.                 color = MrLiu.COLORS['mountain'];
  112.             } else {
  113.                 color = MrLiu.COLORS['other'];
  114.             }
  115.             switch($gameMap.regionId(i, j)) {
  116.                 case 0:
  117.                 break;
  118.                 case 1:
  119.                 color = [255,255,255,212];
  120.                 break;
  121.                 case 2:
  122.                 color = [95, 147, 207, 212];
  123.                 break;
  124.                 case 3:
  125.                 color = [128, 128, 128, 212];
  126.                 break;
  127.                 case 4:
  128.                 color = [125,256,75,212];
  129.                 break;
  130.                 case 5:
  131.                 color = [11,43,68,212];
  132.                 break;
  133.                 case 6:
  134.                 color = [74,135,65,212];
  135.                 break;
  136.                 case 7:
  137.                 color = [144,9,24,212];
  138.                 break;
  139.                 case 8:
  140.                 color = [140,90,53,212];
  141.                 break;
  142.                 case 9:
  143.                 color = [40,32,47,212];
  144.                 break;
  145.                 case 10:
  146.                 color = [74,135,65,212];
  147.                 break;
  148.             };
  149.             pixels[p]   = color[0];
  150.             pixels[p+1] = color[1];
  151.             pixels[p+2] = color[2];
  152.             pixels[p+3] = color[3];
  153.             p += 4;
  154.         }
  155.     }
  156.     var bitmap = new Bitmap($dataMap.width, $dataMap.height);
  157.     bitmap.replacePixels(pixels);
  158.     MrLiu.miniMapBitmaps[$gameMap.mapId()] = bitmap;
  159. };
  160.  
  161. Scene_MapInfo.prototype.createMiniMap = function() {
  162.     this._miniMapSprite = new Sprite();
  163.     this._miniMapCurrentPositionSprite = new Sprite();
  164.     var positionBitmap = new Bitmap(MrLiu.POSITION_RADIUS * 2, MrLiu.POSITION_RADIUS * 2);
  165.     positionBitmap.drawCircle(MrLiu.POSITION_RADIUS, MrLiu.POSITION_RADIUS, MrLiu.POSITION_RADIUS, '#ff0000');
  166.     this._miniMapCurrentPositionSprite.bitmap = positionBitmap;
  167.     this._field.addChild(this._miniMapSprite);
  168.     this._field.addChild(this._miniMapCurrentPositionSprite);
  169. };
  170.  
  171. Scene_MapInfo.prototype.createLayout = function() {
  172.     this._miniMapLayout = new Sprite(ImageManager.loadSystem('MapLayout'));
  173.     this._miniMapLayout.x = MrLiu.layoutX;
  174.     this._miniMapLayout.y = MrLiu.layoutY;
  175.     this._field.addChild(this._miniMapLayout);
  176. };
  177.  
  178. Scene_MapInfo.prototype.updateMiniMap = function() {
  179.     var miniMapBitmap = MrLiu.miniMapBitmaps[$gameMap.mapId()];
  180.     var scaleX = Graphics.boxWidth / miniMapBitmap.width;
  181.     var scaleY = Graphics.boxHeight / miniMapBitmap.height;
  182.     var miniMapScale = scaleX < scaleY ? scaleX : scaleY
  183.     miniMapScale *= 0.9
  184.     var miniMapX = (Graphics.boxWidth - miniMapBitmap.width * miniMapScale) / 2;
  185.     var miniMapY = (Graphics.boxHeight - miniMapBitmap.height * miniMapScale) / 2;
  186.     this._miniMapSprite.bitmap = miniMapBitmap;
  187.     this._miniMapSprite.x = miniMapX;
  188.     this._miniMapSprite.y = miniMapY;
  189.     this._miniMapSprite.scale.x = miniMapScale;
  190.     this._miniMapSprite.scale.y = miniMapScale;
  191.     this._miniMapCurrentPositionSprite.x = miniMapX + ($gamePlayer.x * miniMapScale) - MrLiu.POSITION_RADIUS;
  192.     this._miniMapCurrentPositionSprite.y = miniMapY + ($gamePlayer.y * miniMapScale) - MrLiu.POSITION_RADIUS;
  193.     this._miniMapSprite.visible = true;
  194.     this._miniMapCurrentPositionSprite.visible = true;
  195. };
  196.  
  197. Scene_MapInfo.prototype.update = function() {
  198.     Scene_MenuBase.prototype.update.call(this);
  199.     if (Input.isTriggered("cancel") || Input.isTriggered("control")) this.popScene();
  200. }
  201.  
  202. Scene_MapInfo.prototype.createName = function() {
  203.     this._name = new Sprite(new Bitmap(200,40));
  204.     this._name.x = MrLiu.nameX
  205.     this._name.y = MrLiu.nameY
  206.     this._field.addChild(this._name)
  207.     this._name.bitmap.drawText($gameMap.displayName(), 0, 0, this._name.bitmap.width, this._name.bitmap.height,0);       
  208. };
  209.  
  210. var _ryo_Scene_Map_updateScene = Scene_Map.prototype.updateScene;
  211. Scene_Map.prototype.updateScene = function() {
  212.     _ryo_Scene_Map_updateScene.call(this);
  213.     if (!SceneManager.isSceneChanging() && !$gameSwitches.value(MrLiu.notShowSwitch)) {
  214.         this.updateCallMap();
  215.     }
  216. };
  217.  
  218. Scene_Map.prototype.updateCallMap = function() {
  219.     if (Input.isTriggered("control") && !$gameMap.isEventRunning() && $dataMap.meta.mini_map) SceneManager.push(Scene_MapInfo);
  220. }


需要自己准备MapLayout在system文件夹中。

屏幕快照 2017-08-05 下午8.48.39.png (1.25 MB, 下载次数: 62)

屏幕快照 2017-08-05 下午8.48.39.png

作者: 过眼云烟    时间: 2017-8-6 22:09
赞,相当不错!
作者: walf_man    时间: 2017-8-8 23:26
大神亲临现场点赞啊,真厉害,下载啦
作者: 574656549    时间: 2020-7-28 21:46
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1