查看: 44106|回复: 66

[原创发布] 【插件】地图显示小地图

[复制链接]
梦石
0
星屑
3677
在线时间
4468 小时
注册时间
2008-6-12
回帖
776
发表于 2015-11-23 22:19:49 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

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

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

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

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

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

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

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

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

[pre lang="javascript" file="MrLiu_MiniMap.js"]//=============================================================================
// MrLiu_MiniMap.js
//=============================================================================
/*:
* @plugindesc 在RMMV游戏的地图界面上显示小地图
* @author MrLiu-过眼云烟
* @param NotShowMiniMap
* @desc 开启此开关则不显示小地图,多用于剧情等特殊场景。
* @default 49
*
* @help 这个插件的写法借鉴了rpg maker web 上的Hajime Hoshi的MiniMap的算法
* 使用方法是在地图的备注中加入<mini_map> 就会自动显示小地图,您可以通过打开开关
* 或者NPC对话或者事件页运行的时候会自动隐藏。您可自行修改本插件78行--110行对应的区块
* 颜色。实现您在小地图上的修改。能够更智能的画出您满意的小地图。请将minimap.png文件
* 放在picture目录下,UI图片制作者是我的好友高须小龙,在此对他致以诚挚的感谢。
* 目前我已经创建的图块颜色对应如下:1.边界[255,255,255,255] 2.通行补充[95, 147, 207, 212] 3不可通行补充[128, 128, 128, 192]4.场景出入口[255,256,75,50]
* 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]
* 您可进行随意修改。
*/




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


(function() {
    var miniMapBitmaps = {};

    var MINI_MAP_MARGIN = 50;
    var MINI_MAP_SIZE = 150;//184;
    var POSITION_RADIUS = 4;
    var COLORS = {
        'walk':     [95, 147, 207, 212],
        'mountain': [255, 255, 255, 0],//224
        'other':    [128, 128, 128, 0],//192
    };
    Bitmap.prototype.replacePixels = function(pixels) {
        var imageData = this._context.createImageData(this.width, this.height);
        imageData.data.set(pixels);
        this._context.putImageData(imageData, 0, 0);
        this._setDirty();
    };

    function isWater(gameMap, x, y) {
        if (gameMap.isOverworld()) {
            var tileId = gameMap.autotileType(x, y, 0);//regionId
            if ([0, 1, 2, 3, 7].some(function(id) {
                return id === tileId;
            })) {
                return true;
            }
        }
        return gameMap.isShipPassable(x, y);
    }

    var Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
    Scene_Map.prototype.onMapLoaded = function() {
        Scene_Map_onMapLoaded.call(this);
        if (!$dataMap.meta.mini_map) {
            return;
        }
        if ($gameMap.mapId() in miniMapBitmaps) {
            return;
        }
        var pixels = new Uint8Array(4 * $dataMap.width * $dataMap.height);
        var p = 0;
        for (var j = 0; j < $dataMap.height; j++) {
            for (var i = 0; i < $dataMap.width; i++) {
                var color = null;
                if ($gameMap.checkPassage(i, j, 0x0f)) {
                    color = COLORS['walk'];
                } else if (!isWater($gameMap, i, j)) {
                    color = COLORS['mountain'];
                                }else {
                    color = COLORS['other'];
                }
/*1.边界[255,255,255,255] 2.通行补充[95, 147, 207, 212] 3不可通行补充[128, 128, 128, 192]4.场景出入口[255,256,75,50]
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]
                                       
*/
                                switch($gameMap.regionId(i, j)) {
                                        case 0:
                                                break;
                                        case 1:
                                                color = [255,255,255,212];
                                                break;
                                        case 2:
                                                color = [95, 147, 207, 212];
                                                break;
                                        case 3:
                                                color = [128, 128, 128, 212];
                                                break;
                                        case 4:
                                                color = [125,256,75,212];
                                                break;
                                        case 5:
                                                color = [11,43,68,212];
                                                break;
                                        case 6:
                                                color = [74,135,65,212];
                                                break;
                                        case 7:
                                                color = [144,9,24,212];
                                                break;
                                        case 8:
                                                color = [140,90,53,212];
                                                break;
                                        case 9:
                                                color = [40,32,47,212];
                                                break;
                                        case 10:
                                                color = [74,135,65,212];
                                                break;                                                                                                                                                                                                                                                                                                                                               
                                };
                               
                                //console.log($gameMap.regionId(i, j));
                pixels[p]   = color[0];
                pixels[p+1] = color[1];
                pixels[p+2] = color[2];
                pixels[p+3] = color[3];
                p += 4;
            }
        }
        var bitmap = new Bitmap($dataMap.width, $dataMap.height);
        bitmap.replacePixels(pixels);
        miniMapBitmaps[$gameMap.mapId()] = bitmap;
    };

    var Spriteset_Map_createUpperLayer = Spriteset_Map.prototype.createUpperLayer;
    Spriteset_Map.prototype.createUpperLayer = function() {
        Spriteset_Map_createUpperLayer.call(this);
        this.createMiniMap();
    };

    Spriteset_Map.prototype.createMiniMap = function() {
                this._miniMapUI = new Sprite();
                this._miniMapUI.bitmap = ImageManager.loadPicture('minimap');
        this.addChild(this._miniMapUI);
                this._miniMapSprite = new Sprite();
                this.addChild(this._miniMapUI);
                this._miniMapSprite = new Sprite();
        this._miniMapCurrentPositionSprite = new Sprite();
        var positionBitmap = new Bitmap(POSITION_RADIUS * 2, POSITION_RADIUS * 2);
        positionBitmap.drawCircle(POSITION_RADIUS, POSITION_RADIUS, POSITION_RADIUS, '#ff0000');
        this._miniMapCurrentPositionSprite.bitmap = positionBitmap;
        this.addChild(this._miniMapSprite);
        this.addChild(this._miniMapCurrentPositionSprite);
    };

    var Spriteset_Map_update = Spriteset_Map.prototype.update;
    Spriteset_Map.prototype.update = function() {
        Spriteset_Map_update.call(this);
        this.updateMiniMap();
    };

    Spriteset_Map.prototype.updateMiniMap = function() {
        var miniMapBitmap = miniMapBitmaps[$gameMap.mapId()];
        if (!miniMapBitmap ||($gameMap._interpreter.isRunning()) || ($gameSwitches.value(notShowSwitch) == true)) {
            this._miniMapSprite.visible = false;
            this._miniMapCurrentPositionSprite.visible = false;
                        this._miniMapUI.visible = false;
            return;
        }
        var size = Math.max(miniMapBitmap.width, miniMapBitmap.height);
        var miniMapScale = MINI_MAP_SIZE / size;
        var miniMapX = Graphics.width - miniMapBitmap.width * miniMapScale - MINI_MAP_MARGIN;
        var miniMapY = MINI_MAP_MARGIN;;//Graphics.height - miniMapBitmap.height * miniMapScale - MINI_MAP_MARGIN;
        this._miniMapSprite.bitmap = miniMapBitmap;
        this._miniMapSprite.x = miniMapX;
        this._miniMapSprite.y = miniMapY;
        this._miniMapSprite.scale.x = miniMapScale;
        this._miniMapSprite.scale.y = miniMapScale;
        this._miniMapCurrentPositionSprite.x = miniMapX + ($gamePlayer.x * miniMapScale) - POSITION_RADIUS;
        this._miniMapCurrentPositionSprite.y = miniMapY + ($gamePlayer.y * miniMapScale) - POSITION_RADIUS;
                this._miniMapUI.visible = true;
        this._miniMapSprite.visible = true;
        this._miniMapCurrentPositionSprite.visible = true;
    };

})();[/pre]

MrLiu_MiniMap.rar

36.97 KB, 下载次数: 1814

点评

很赞,有一种Minecraft的既视感(跑  发表于 2016-4-18 15:02
改了宽屏分辨率minimap.png没对齐,谢谢修复  发表于 2015-11-24 14:16

评分

参与人数 14星屑 +306 梦石 +2 赞 +9 收起 理由
lqx5201314 + 1 我很赞同
wr282828 + 1 精品文章
夏克不是夏洛克 + 1 我很赞同
朔鴉 + 1 塞糖
特斯拉线圈 + 1 塞糖
Q98486 + 1 精品文章
FriendsMind + 1 好用,感謝!
yueshiguili112 + 1 精品文章
jack2396 + 1 塞糖
orzfly + 20 塞糖

查看全部评分

本人三无老人,请大神轻拍
梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
回帖
1057
发表于 2015-11-24 00:01:31 | 显示全部楼层
实时绘制?

点评

是吗,这边测试在我的姥爷机还有部分网游反映的手机上会很卡。我在写这几个插件的时候尽量做到优化 效率。精打细算惯了  发表于 2015-11-24 11:31
对MV来说空间换时间还是值得的  发表于 2015-11-24 11:28
考虑过这种方式,怕增加大家的游戏体积。谢谢您的建议,后续版本我会考虑的  发表于 2015-11-24 11:22
其实可以预先绘制,然后保存图片。这样发布之前跑一次代码就可以了  发表于 2015-11-24 10:37
地图载入的时候绘制一次。不会掉fps  发表于 2015-11-24 07:58
回复

使用道具 举报

梦石
0
星屑
90
在线时间
178 小时
注册时间
2015-5-15
回帖
28
发表于 2015-11-24 06:53:56 来自手机 | 显示全部楼层
太好了,希望大神能写个MV版的XAS插件

点评

歪果仁应该会写吧  发表于 2015-11-24 08:00
回复

使用道具 举报

梦石
0
星屑
50
在线时间
171 小时
注册时间
2013-8-6
回帖
91
发表于 2015-11-24 16:24:07 | 显示全部楼层
改了宽屏分辨率minimap.png没有和地图对齐,在屏幕中间,谢谢修复

点评

这个样子,谢谢  发表于 2015-11-24 20:32
在PS中修改文件即可,我不知道您的游戏分辨率是多少  发表于 2015-11-24 16:45
回复

使用道具 举报

梦石
0
星屑
57
在线时间
103 小时
注册时间
2015-11-30
回帖
28
发表于 2015-12-4 19:49:50 | 显示全部楼层
大哥还是厉害。。
回复

使用道具 举报

梦石
0
星屑
62
在线时间
44 小时
注册时间
2015-5-11
回帖
23
发表于 2015-12-29 22:57:40 | 显示全部楼层
这个JavaScript脚本咋个用的?
回复 0 1

使用道具 举报

梦石
0
星屑
50
在线时间
47 小时
注册时间
2015-12-3
回帖
46
发表于 2015-12-30 14:02:42 | 显示全部楼层
能不能改成按M或某个键开启关闭地图啊。

点评

不会弄啊,MV的条件分歧里没有M按键啊,,,,就那几个.调用脚本是啥啊  发表于 2015-12-30 15:36
插件默认打开49号开关小地图关闭,您可以设置一个公共事件,如果按下M键则49号开关关闭(即打开地图),再按一下M键则49号开关开启(即关闭地图  发表于 2015-12-30 14:37
回复

使用道具 举报

梦石
0
星屑
140
在线时间
345 小时
注册时间
2009-5-15
回帖
77
发表于 2016-1-4 21:49:44 | 显示全部楼层
楼主您好,您的插件真的很不错,很适合做一些迷宫类的游戏。

对于脚 本新手来说,想做一些简单的改进,如在菜单scene里新增一个窗口,在窗口当中显示小地图。

不知楼主是否可以提供菜单版本,或者能够提供一些简单的修改思路,万分感谢。
敌人自动排列系统    1/1
技能类型着色   1/1
物品着色     0/1
仿网游强化系统    0/1
回复

使用道具 举报

梦石
0
星屑
1043
在线时间
4 小时
注册时间
2015-2-14
回帖
2
发表于 2016-1-22 14:37:37 | 显示全部楼层
插件怎么用呀?放在js文件夹没用

点评

脚本中有说明,这么不认真.在所在地图的备注中加入<mini_map>  发表于 2016-3-5 19:24
回复 0 1

使用道具 举报

梦石
0
星屑
100
在线时间
268 小时
注册时间
2010-12-22
回帖
17
发表于 2016-2-16 13:18:09 | 显示全部楼层
minimap 有辦法只顯示玩家附近的區域嗎? 移動之後minmap繪製的區域會跟著改變
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部