查看: 16079|回复: 28

[原创发布] 自由图层系统 - FreeLayers 【2015.11.3 18.29.37】

[复制链接]
梦石
0
星屑
50
在线时间
119 小时
注册时间
2015-1-5
回帖
118
发表于 2015-10-28 07:16:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 MonsterJohnCN 于 2015-11-3 18:40 编辑

FreeLayers 2015.11.3 18.29.37
FreeLayers 2015.11.3 18.29.37.rar (9.71 KB, 下载次数: 409)

修正了一个BUG,这个BUG曾导致基于loopx/loopy的平移动画会出现卡顿的问题。

FreeLayers - 2015.11.1 07.37.04
FreeLayers 2015.11.1 07.37.04.rar (9.74 KB, 下载次数: 181)

本次更新了比较多内容,个人测试基本能正常使用,但不保证不存在没发现的BUG。
如果你在使用本系统的过程中发现了BUG,请及时反馈给我。
谢谢XD

↓ ↓ ↓ 效果展示 ↓ ↓ ↓


更新内容:
【BUG】修复了切换地图时会导致地图崩溃的BUG。
【BUG】修复了在同一地图内使用画面跳转功能时会导致地图崩溃的BUG。
【BUG】修复了在同一地图内使用画面跳转功能时会导致图层数据被初始化的BUG。
【调整】调整Z轴的默认值到40001。
【注释】对脚本本体进行了不完善的中文注释。
【新功能】新增了hue参数,这个参数可以用于预设图像的色相。
【新功能】新增了一系列自定义脚本,这些脚本可以用于动态修改所有图层属性。

新增的脚本:

立即重设任意属性
  • flSetData

参数
  • Z坐标 - 整数
  • 属性名字 - 字符串或变量
  • 新的参数值 - {属性}所允许的数据类型或变量

用法示例
  • flSetData(-1, "fill", true) - 设置Z坐标为-1的图层的fill属性为true
  • flSetData(-1, "fill", "%1") - 设置Z坐标为-1的图层的fill属性为【开关1】的值
  • flSetData(-1, "loopx", 35+44) - 设置Z坐标为-1的图层的loopx属性为35+44,即79
  • flSetData(-1, "loopy", "%2") - 设置Z坐标为-1的图层的loopx属性为【变量2】的值


立即重设内容截取区域
  • flSetContentRect

参数
  • Z坐标 - 整数
  • 原图内容截取区X坐标 - 整数或变量
  • 原图内容截取区Y坐标 - 整数或变量(选填)
  • 原图内容截取区宽度 - 整数或变量(选填)
  • 原图内容截取区高度 - 整数或变量(选填)

用法示例
  • flSetContentRect(-1, 128, 128, 512, 512) - 截取原图坐标(128, 128)到(128+512, 128+512)的内容作为Z轴为-1的图层的显示内容
  • flSetContentRect(-1, "%1", "%2", "%3", "%4") - 截取原图坐标(变量[1], 变量[2])到(变量[1]+变量[3], 变量[2]+变量[4])的内容作为Z轴为-1的图层的显示内容


立即重设图像在游戏中的显示区域/位置
  • flSetShowRect

参数
  • Z坐标 - 整数
  • 图像在游戏地图中的X坐标 - 整数或变量
  • 图像在游戏地图中的Y坐标 - 整数或变量(选填)
  • 图像在游戏地图中的宽度 - 整数或变量(选填)
  • 图像在游戏地图中的高度 - 整数或变量(选填)

用法示例
  • flSetShowRect(-1, 128, 128, 512, 512) - 在游戏地图的(128, 128)到(128+512, 128+512)处显示Z轴为-1的图层的图像
  • flSetShowRect(-1, "%1", "%2", "%3", "%4") - 在游戏地图的(变量[1], 变量[2])到(变量[1]+变量[3], 变量[2]+变量[4])处显示Z轴为-1的图层的图像


将指定Z轴的图层将X、Y轴滚动速度在指定帧数内渐变到指定的值
  • flResetLoopX、flResetLoopY

参数
  • Z坐标 - 整数
  • 渐变所需帧数 - 整数或变量
  • 渐变目标值 - 整数或变量

用法示例
  • flResetLoopX(-1, 600, 96) - 将Z轴为-1的图层的X轴滚动速度在600帧内渐变为96
  • flResetLoopY(-1, "%1", "%2") - 将Z轴为-1的图层的Y轴滚动速度在变量[1]帧内渐变为变量[2]


将指定Z轴的图层的不透明度(可见度)在指定帧数内渐变到指定的值
  • flResetOpacity

参数
  • Z坐标 - 整数
  • 渐变所需帧数 - 整数或变量
  • 渐变目标值 - 整数或变量(0~255)

用法示例
  • flResetOpacity(-1, 600, 128) - 将Z轴为-1的图层的不透明度(可见度)在600帧内渐变为128
  • flResetOpacity(-1, "%1", "%2") - 将Z轴为-1的图层的不透明度(可见度)在变量[1]帧内渐变为变量[2]


将指定Z轴的图层的尺寸、X轴尺寸、Y轴尺寸在指定帧数内渐变到指定的值
  • flResetScale、flResetScaleX、flResetScaleY

参数
  • Z坐标 - 整数
  • 渐变所需帧数 - 整数或变量
  • 渐变目标值 - 数字或变量(1为标准大小)

用法示例
  • flResetScale(-1, 600, 2) - 将Z轴为-1的图层的尺寸在600帧内渐变缩放为2倍大小
  • flResetScaleX(-1, "%1", "%2") - 将Z轴为-1的图层的X轴尺寸在变量[1]帧内渐变缩放为变量[2]
  • flResetScaleY(-1, "%3", "%4") - 将Z轴为-1的图层的Y轴尺寸在变量[3]帧内渐变缩放为变量[4]


将指定Z轴的图层的X、Y轴坐标在指定帧数内渐变到指定的值
  • flResetX、flResetY

参数
  • Z坐标 - 整数
  • 渐变所需帧数 - 整数或变量
  • 渐变目标值 - 整数或变量

用法示例
  • flResetX(-1, 600, 500) - 将Z轴为-1的图层的X坐标在600帧内渐变为500
  • flResetY(-1, "%1", "%2") - 将Z轴为-1的图层的Y坐标在变量[1]帧内渐变为变量[2]


将指定Z轴的图层的图像原点X、Y轴坐标在指定帧数内渐变到指定的值
  • flResetOriginX、flResetOriginY

参数
  • Z坐标 - 整数
  • 渐变所需帧数 - 整数或变量
  • 渐变目标值 - 整数或变量

用法示例
  • flResetOriginX(-1, 600, 200) - 将Z轴为-1的图层的图像原点X坐标在600帧内渐变为200
  • flResetOriginY(-1, "%1", "%2") - 将Z轴为-1的图层的图像原点Y坐标在变量[1]帧内渐变为变量[2]


预加载指定名字的图像,或者指定名字的图像的另一个色相的图像
  • flPreloadBitmap

参数
  • 位图名字 - 字符串或变量(不带文件后缀)
  • 色相环值 - 整数或变量(0~360)(选填)
  • 位图目录路径 - 字符串或变量(位于img内)(选填)(默认为"parallaxes")

用法示例
  • flPreloadBitmap("BlueSky", 180, "parallaxes") - 预加载色相环值为180的"img/parallaxes/BlueSky.png"
  • flPreloadBitmap("BlueSky") - 预加载"img/parallaxes/BlueSky.png"
  • flPreloadBitmap("%1", "%2", "%3") - 预加载色相环值为变量[2]的"img/"+变量[3]+"/"+变量[1]+".png"


预加载指定Z轴的图像,或者指定Z轴的图像的另一个色相的图像
  • flPreloadBitmapIndex

参数
  • Z坐标 - 整数
  • 色相环值 - 整数或变量(0~360)(选填)

用法示例
  • flPreloadBitmapIndex(-1, 180) - 预加载Z坐标为-1的图层的色相环值为180的位图
  • flPreloadBitmapIndex(-1, "%1") - 预加载Z坐标为-1的图层的色相环值为变量[1]的位图




[fold=FreeLayers 2015.10.30 01.34.16]
FreeLayers 2015.10.30 01.34.16.rar (4.54 KB, 下载次数: 15)

本次版本修复的BUG:
  使用画面抖动功能时,地图边缘图层会出现黑边的BUG
  Z轴的排序混乱的BUG(JavaScript的for-in循环是按照数据添加的先后而不是根据下标的大小来循环的!)

本次版本增加的新功能:
  fill: true
  在<fl=filename></fl>标签内添加【fill: true】(不含黑括号)标签,可以让图像自动填充满整个地图。
  当然自动填充后的图像仍然支持loopx/loopy动画,因此你可以非常轻易的做出云雾遮罩效果。

由于不确定JavaScript是否还存在其他语法特性,后续也许还会有不少BUG。
如果在使用中发现了BUG,请反馈给我,谢谢QAQ

由于篇幅问题,后续源代码就不直接贴到网页上了,下载附件吧!

本次更新的效果预(sang)览(bing)图:
aaaaaaaaaa.png
[/fold]
[fold=FreeLayers 2015.10.29 20.38.31]
FreeLayers 2015.10.29 20.38.31.rar (4.14 KB, 下载次数: 9)

本次版本中,默认显示的图片的宽高(cw, ch)不再是游戏窗口的宽高了,而改为了自动匹配导入的图片本身的宽高。
这个修改会让图层编辑和数据填写相对更容易一些。

sdftertert.png

吐槽:
开发过程中出现了一些不明BUG,导致数据始终无法正常读取,真是蛋疼_(:з」∠)_……好在最后终于解决了QAQ

源代码在下方。

[pre lang="javascript"]
//=============================================================================
// FreeLayers.js
// Last Updated: 2015-10-29 20:38:31 (GMT+8)
//=============================================================================

/*:
* @plugindesc 解放图层!
* @help 当前版本:2015-10-29 20:38:31 (GMT+8)
*
* 首Taroxd在RMVA所编写的Unlimited Layers Display System脚本影响而开发本脚本。
* 暂未做代码&效率优化。
*
* 在地图备注区按以下格式备注内容:
* <fl=filename>
*   z: 整数,默认1,图像的叠加层级,决定了图像在游戏内显示的前后顺序,不可重复
*   x: 整数,默认0,可为负,图像在地图上的X坐标偏移,以地图左上角为原点
*   y: 整数,默认0,可为负,图像在地图上的Y坐标偏移,以地图左上角为原点
*   cx: 整数,默认0,会从图像的(cx,cy)坐标截取宽高为(cw,ch)的内容显示到游戏内
*   cy: 整数,默认0
*   cw: 整数,默认为导入的图片的宽度
*   ch: 整数,默认为导入的图片的高度
*   width: 整数,默认cw,图像在地图内的宽度
*   height: 整数,默认ch,图像在地图内的高度
*   scale: 实数,默认1,可为负,图像缩放倍率
*   scalex: 实数,默认scale,可为负,图像横向缩放倍率
*   scaley: 实数,默认scale,可为负,图像纵向缩放倍率
*   opacity: 整数,默认255,可为0~255,不透明度,数值越高越不透明
*   path: 字符串,默认parallaxes,图像所在的文件夹路径,位于img目录下
*   visible: 布尔值,默认true,图像是否可见,只有值为false时才不可见
*   loopx: 整数,默认0,可为负,图像自动横向滚动的速度
*   loopy: 整数,默认0,可为负,图像自动纵向滚动的速度
*   scrollx: 整数,默认为游戏地图格子的宽度,图像跟随地图横向卷动的速度
*   scrolly: 整数,默认为游戏地图格子的高度,图像跟随地图纵向卷动的速度
* </fl>
* ---------------------------
* 其中filename是图片文件名(无需扩展名),放入img/parallaxes文件夹内
* 这个文件夹名parallaxes可以通过修改path参数来修改
* 另外,文件名不能包含空格,否则将会无法读取
*
* 在<fl=filename>和</fl>中间的数据均为选填,不填则自动设为默认值。
* 每一个设置项只能写一行。(地图备注没有单行长度限制)
* 每一行只能写一个设置项。
* 所有的空格将会被无视。(这个问题后续会进行修复)
* 无特殊需求时,大部分参数不需要设置。
* ---------------------------
* 例:
* <fl=!Crystal>
*   x: 384
*   y: 216
*   path: characters
*   z: 1
*   cw: 48
*   ch: 96
*   loopx: 48
* </fl>
* ---------------------------
* 图层 Z 坐标详解:
* -10000 远景
*      0 游戏地表图层,在角色下方
*  10000 与角色相同
*  20000 云层等的阴影,在角色的上方
*  30000 触碰设备上的目标提示
*  40000 天气、云层等
* 注意:如果你的自定义图层与上述图层用了相同的 Z 坐标,那么这些图层将会被本插件无视从而无法显示。
* 即,你不能设置与系统默认图层相同的 Z 坐标。(至少目前版本不行)
*/

(function() {
   
    function anti(index,origin) {
        // resort array's index while do loop
        if (origin-(index+1) >= 0) {
            return origin-(index+1);
        } else {
            console.log("[function : anti] I got a bug! index is : " + index + " origin is : " + origin);
        }
    }

    var Z_DEFAULT = 10;
    var X_DEFAULT = 0;
    var Y_DEFAULT = 0;
    var SCALE_DEFAULT = 1;
    var SCROLL_DEFAULT = 48;
    var OPACITY_DEFAULT = 255;
    var VISIBLE_DEFAULT = true;
    var PATH_DEFAULT = "parallaxes";
    var LOOPX_DEFAULT = 0;
    var LOOPY_DEFAULT = 0;
    var CX_DEFAULT = 0;
    var CY_DEFAULT = 0;
    //var CW_DEFAULT = lobj.bitmap.width;
    //var CH_DEFAULT = lobj.bitmap.height;
    //var WIDTH_DEFAULT = Layer.cw;
    //var HEIGHT_DEFAULT = Layer.ch;
   
    var Z_PARALLAX = -10000;
    var Z_TILEMAP = 0;
    var Z_CHARACTERS = 10000;
    var Z_SHADOW = 20000;
    var Z_DESTINATION = 30000;
    var Z_WEATHER = 40000;

    var FreeLayers = new Array;
    FreeLayers[Z_PARALLAX]    = "Parallax";
    FreeLayers[Z_TILEMAP]     = "Tilemap";
    FreeLayers[Z_CHARACTERS]  = "Characters";
    FreeLayers[Z_SHADOW]      = "Shadow";
    FreeLayers[Z_DESTINATION] = "Destination";
    FreeLayers[Z_WEATHER]     = "Weather";

    var _Spriteset_Map_Initialize = Spriteset_Map.prototype.initialize;
    Spriteset_Map.prototype.initialize = function() {
        this._freeLayers = new Array;
        this._freeLayersCount = 0;
        this.readFreeLayer();
        this._freeLayersInited = new Array;
        _Spriteset_Map_Initialize.call(this);
    }

    Spriteset_Map.prototype.readFreeLayer = function() {
        this._freeLayersNote = new Array;

        // analy free layers

        // - mark block's begin & end line index
        var note = $dataMap.note;
        while (note.match(" ")) {
            note = note.replace(" ","");
        }
        var note = note.split("\n");
        var note_layerBegin = new Array;
        var note_layerEnd = new Array;

        var i = note.length;
        while (i--) {
            var anti_i = anti(i, note.length);
            if (note[anti_i].match("fl=")) {
                note_layerBegin.push(anti_i);
            } else if (note[anti_i].match("\/fl")) {
                note_layerEnd.push(anti_i);
            }
        }

        // - pack block
        var layerBox = new Array;
        var i = note_layerBegin.length;
        while (i--) {
            var anti_i = anti(i, note_layerBegin.length);
            layerBox[anti_i] = "";
            var i2 = note_layerBegin[anti_i];
            for (i2; i2 <= note_layerEnd[anti_i]; i2++) {
                layerBox[anti_i] = layerBox[anti_i] + note[i2] + "\n";
            }
        }

        // - analy block & pack to array
        var outputLayer = new Array();
        var i = layerBox.length;
        while (i--) {
            var anti_i = anti(i, layerBox.length);
            var outputBoxContent = layerBox[anti_i].split("\n");
            var i2 = outputBoxContent.length;
            while (i2--) {
                anti_i2 = anti(i2, outputBoxContent.length);
                if (outputBoxContent[anti_i2] == "") {
                    outputBoxContent.splice(anti_i2, 1);
                }
            }
            outputLayer[anti_i] = outputBoxContent;
        }

        // - convert origin text array to system data array
        var layerBox = new Array();
        var i = outputLayer.length;
        while (i--) {
            var anti_i = anti(i, outputLayer.length);
            layerBox[anti_i] = new Array();
            var i2 = outputLayer[anti_i].length;
            while (i2--) {
                var anti_i2 = anti(i2, outputLayer[anti_i].length);
                var currentText = outputLayer[anti_i][anti_i2];
                if (currentText.match("=")) {
                    var startPos = currentText.indexOf("=")+1;
                    var endPos = currentText.indexOf(">");
                    layerBox[anti_i]["name"] = currentText.substring(startPos,endPos);
                } else if (currentText.match(":")) {
                    var startPos_name = 0;
                    var endPos_name = currentText.indexOf(":");
                    var startPos_value = currentText.indexOf(":")+1;
                    var endPos_value = currentText.length;
                    layerBox[anti_i][currentText.substring(startPos_name,endPos_name)] = currentText.substring(startPos_value,endPos_value);
                }
            }
            // - - add default
            if (layerBox[anti_i].z          == null || layerBox[anti_i].z           == "") { layerBox[anti_i].z             = Z_DEFAULT;            }
            if (layerBox[anti_i].x          == null || layerBox[anti_i].x           == "") { layerBox[anti_i].x             = X_DEFAULT;            }
            if (layerBox[anti_i].y          == null || layerBox[anti_i].y           == "") { layerBox[anti_i].y             = Y_DEFAULT;            }
            if (layerBox[anti_i].scalex     == null || layerBox[anti_i].scalex      == "") { if (layerBox[anti_i].scale == null || layerBox[anti_i].scale == "") { layerBox[anti_i].scalex = SCALE_DEFAULT; } else { layerBox[anti_i].scalex = layerBox[anti_i].scale; } }
            if (layerBox[anti_i].scaley     == null || layerBox[anti_i].scaley      == "") { if (layerBox[anti_i].scale == null || layerBox[anti_i].scale == "") { layerBox[anti_i].scaley = SCALE_DEFAULT; } else { layerBox[anti_i].scaley = layerBox[anti_i].scale; } }
            if (layerBox[anti_i].scrollx    == null || layerBox[anti_i].scrollx     == "") { if (layerBox[anti_i].scroll == null || layerBox[anti_i].scroll == "") { layerBox[anti_i].scrollx = SCROLL_DEFAULT; } else { layerBox[anti_i].scrollx = layerBox[anti_i].scroll; } }
            if (layerBox[anti_i].scrolly    == null || layerBox[anti_i].scrolly     == "") { if (layerBox[anti_i].scroll == null || layerBox[anti_i].scroll == "") { layerBox[anti_i].scrolly = SCROLL_DEFAULT; } else { layerBox[anti_i].scrolly = layerBox[anti_i].scroll; } }
            if (layerBox[anti_i].opacity    == null || layerBox[anti_i].opacity     == "") { layerBox[anti_i].opacity       = OPACITY_DEFAULT;      }
            if (layerBox[anti_i].visible    == null || layerBox[anti_i].visible     == "") { layerBox[anti_i].visible       = VISIBLE_DEFAULT;      } else { if (layerBox[anti_i].visible != "false") { layerBox[anti_i].visible = true; } else { layerBox[anti_i].visible = false; } }
            if (layerBox[anti_i].path       == null || layerBox[anti_i].pah         == "") { layerBox[anti_i].path          = PATH_DEFAULT;         }
            if (layerBox[anti_i].loopx      == null || layerBox[anti_i].loopx       == "") { layerBox[anti_i].loopx         = LOOPX_DEFAULT;        }
            if (layerBox[anti_i].loopy      == null || layerBox[anti_i].loopy       == "") { layerBox[anti_i].loopy         = LOOPY_DEFAULT;        }
            if (layerBox[anti_i].cx         == null || layerBox[anti_i].cx          == "") { layerBox[anti_i].cx            = CX_DEFAULT;           }
            if (layerBox[anti_i].cy         == null || layerBox[anti_i].cy          == "") { layerBox[anti_i].cy            = CY_DEFAULT;           }
            if (layerBox[anti_i].cw         == null || layerBox[anti_i].cw          == "") { layerBox[anti_i].cw            = "BITMAP_WIDTH";       }
            if (layerBox[anti_i].ch         == null || layerBox[anti_i].ch          == "") { layerBox[anti_i].ch            = "BITMAP_HEIGHT";      }
            if (layerBox[anti_i].width      == null || layerBox[anti_i].width       == "") { layerBox[anti_i].width         = layerBox[anti_i].cw;  }
            if (layerBox[anti_i].height     == null || layerBox[anti_i].height      == "") { layerBox[anti_i].height        = layerBox[anti_i].ch;  }
            // - - convert to integer
            layerBox[anti_i].z          = parseInt(layerBox[anti_i].z,         10);
            layerBox[anti_i].x          = parseInt(layerBox[anti_i].x,         10);
            layerBox[anti_i].y          = parseInt(layerBox[anti_i].y,         10);
            layerBox[anti_i].scalex     = parseFloat(layerBox[anti_i].scalex     );
            layerBox[anti_i].scaley     = parseFloat(layerBox[anti_i].scaley     );
            layerBox[anti_i].scrollx    = parseInt(layerBox[anti_i].scrollx,   10);
            layerBox[anti_i].scrolly    = parseInt(layerBox[anti_i].scrolly,   10);
            layerBox[anti_i].opacity    = parseInt(layerBox[anti_i].opacity,   10);
            layerBox[anti_i].loopx      = parseInt(layerBox[anti_i].loopx,     10);
            layerBox[anti_i].loopy      = parseInt(layerBox[anti_i].loopy,     10);
            layerBox[anti_i].cx         = parseInt(layerBox[anti_i].cx,        10);
            layerBox[anti_i].cy         = parseInt(layerBox[anti_i].cy,        10);
            if (layerBox[anti_i].cw     != "BITMAP_WIDTH" ) {layerBox[anti_i].cw     = parseInt(layerBox[anti_i].cw    , 10); }
            if (layerBox[anti_i].ch     != "BITMAP_HEIGHT") {layerBox[anti_i].ch     = parseInt(layerBox[anti_i].ch    , 10); }
            if (layerBox[anti_i].width  != "BITMAP_WIDTH" ) {layerBox[anti_i].width  = parseInt(layerBox[anti_i].width , 10); }
            if (layerBox[anti_i].height != "BITMAP_HEIGHT") {layerBox[anti_i].height = parseInt(layerBox[anti_i].height, 10); }
        }

        // pack data into var "FreeLayers"
        var i = layerBox.length;
        while (i--) {
            var Z_INDEX = layerBox.z;
            FreeLayers[Z_INDEX] = layerBox;
        }
    }

    Spriteset_Map.prototype.createFreeLayer = function(Z_INDEX) {
        
        // Default Layers ...

             if (Z_INDEX == Z_PARALLAX)     { this.createParallax();    return; } // base
        else if (Z_INDEX == Z_TILEMAP)      { this.createTilemap();     return; } // base
        else if (Z_INDEX == Z_CHARACTERS)   { this.createCharacters();  return; } // tilemap
        else if (Z_INDEX == Z_SHADOW)       { this.createShadow();      return; } // tilemap
        else if (Z_INDEX == Z_DESTINATION)  { this.createDestination(); return; } // tilemap
        else if (Z_INDEX == Z_WEATHER)      { this.createWeather();     return; } // Spriteset_Map

        // Custom Layers ...

        var ldata = FreeLayers[Z_INDEX];
        var lobj = new TilingSprite();

        if      (Z_INDEX       < Z_PARALLAX                            ) { }
        else if (Z_PARALLAX    < Z_INDEX    && Z_INDEX < Z_TILEMAP     ) { }
        else if (Z_TILEMAP     < Z_INDEX    && Z_INDEX < Z_CHARACTERS  ) { lobj.z =  3; }
        else if (Z_CHARACTERS  < Z_INDEX    && Z_INDEX < Z_SHADOW      ) { lobj.z =  5; }
        else if (Z_SHADOW      < Z_INDEX    && Z_INDEX < Z_DESTINATION ) { lobj.z =  7; }
        else if (Z_DESTINATION < Z_INDEX    && Z_INDEX < Z_WEATHER     ) { lobj.z = 10; }
        else if (Z_WEATHER     < Z_INDEX                               ) { }

        lobj.bitmap     = ImageManager.loadBitmap("img/"+ldata.path+"/",ldata.name);

        if      (Z_INDEX       < Z_PARALLAX)                         { this._baseSprite.addChild(lobj); }
        else if (Z_PARALLAX    < Z_INDEX && Z_INDEX < Z_TILEMAP)     { this._baseSprite.addChild(lobj); }
        else if (Z_TILEMAP     < Z_INDEX && Z_INDEX < Z_CHARACTERS)  { this._tilemap.addChild(lobj);    }
        else if (Z_CHARACTERS  < Z_INDEX && Z_INDEX < Z_SHADOW)      { this._tilemap.addChild(lobj);    }
        else if (Z_SHADOW      < Z_INDEX && Z_INDEX < Z_DESTINATION) { this._tilemap.addChild(lobj);    }
        else if (Z_DESTINATION < Z_INDEX && Z_INDEX < Z_WEATHER)     { this._tilemap.addChild(lobj);    }
        else if (Z_WEATHER     < Z_INDEX)                            { this.addChild(lobj);             }
        
        this._freeLayers[Z_INDEX] = lobj;

        this._freeLayersInited[Z_INDEX] = 0;
        
    }

    Spriteset_Map.prototype.updateFreeLayer = function(Z_INDEX) {

        // Default Layers ...

             if (Z_INDEX == Z_PARALLAX)     { this.updateParallax(); return; } // base
        else if (Z_INDEX == Z_TILEMAP)      { this.updateTilemap();  return; } // base
        else if (Z_INDEX == Z_CHARACTERS)   {                        return; } // tilemap
        else if (Z_INDEX == Z_SHADOW)       { this.updateShadow();   return; } // tilemap
        else if (Z_INDEX == Z_DESTINATION)  {                        return; } // tilemap
        else if (Z_INDEX == Z_WEATHER)      { this.updateWeather();  return; } // Spriteset_Map

        // Custom Layers ...
        
        var ldata = FreeLayers[Z_INDEX];
        var lobj = this._freeLayers[Z_INDEX];

        if ( this._freeLayersInited[Z_INDEX] <= 1 ) { // Delay set bitmap for fix some bugs made by PIXI or MV? Those bugs will lose some data.
            if (this._freeLayersInited[Z_INDEX] == 1) {
                if (ldata.cw     == "BITMAP_WIDTH" ) { ldata.cw     = lobj.bitmap.width;  }
                if (ldata.ch     == "BITMAP_HEIGHT") { ldata.ch     = lobj.bitmap.height; }
                if (ldata.width  == "BITMAP_WIDTH" ) { ldata.width  = lobj.bitmap.width;  }
                if (ldata.height == "BITMAP_HEIGHT") { ldata.height = lobj.bitmap.height; }
                lobj.setFrame(ldata.cx, ldata.cy, ldata.cw, ldata.ch);
                lobj.move(ldata.x, ldata.y, ldata.width, ldata.height);
                lobj.scale.x = ldata.scalex;
                lobj.scale.y = ldata.scaley;
                lobj.opacity = ldata.opacity;
                lobj.visible = ldata.visible;
            }
            this._freeLayersInited[Z_INDEX]++;
        }
        
        if (lobj.bitmap) {
            lobj.x = $gameMap.displayX() * ldata.scrollx * -1 + ldata.x;
            lobj.y = $gameMap.displayY() * ldata.scrolly * -1 + ldata.y;
            lobj.scale.x = ldata.scalex;
            lobj.scale.y = ldata.scaley;
            lobj.opacity = ldata.opacity;
            if (ldata.loopx) { lobj.origin.x += ldata.loopx / 48 / 2 * -1; }
            if (ldata.loopy) { lobj.origin.y += ldata.loopy / 48 / 2 * -1; }
        }
    }

    Spriteset_Map.prototype.createLowerLayer = function() {
        Spriteset_Base.prototype.createLowerLayer.call(this);
        for (var i in FreeLayers) { if (i <  0) { this.createFreeLayer(i); } }
        for (var i in FreeLayers) { if (i >= 0) { this.createFreeLayer(i); } }
    };

    Spriteset_Map.prototype.update = function() {
        Spriteset_Base.prototype.update.call(this);
        this.updateTileset();
        for (var i in FreeLayers) { if (i <  0) { this.updateFreeLayer(i); } }
        for (var i in FreeLayers) { if (i >= 0) { this.updateFreeLayer(i); } }
    };

})();
[/pre]
[/fold]
[fold=FreeLayers 2015.10.29 04.42.28]
由于Taroxd已经在我发布这插件之前写了Unlimited Layers Display System的RMMV版本了,因此本插件改名为FreeLayers以避免冲突和作为区分。
在对MV底层进行了更多研究后(谢谢汉化版帮助文档 & @墨凌羽 的提醒),更新了本次版本。
本次增加了图层的滚动&自动填充功能,并且在一定程度上允许定制你的图形显示区域。

更新的内容用图片来表达比较合适,我就不多废话了。

xxx3.png

FreeLayers 2015.10.29 04.42.28.rar (3.97 KB, 下载次数: 14)

源代码在下方。

如果你有兴趣的话,可以在添加了插件后,将接下来的字符串复制到地图备注区域后进入游戏查看效果。

<fl=Balloon>
  x: 408
  y: 311
  cx: 48
  cy: 48
  cw: 48
  ch: 48
  scale: 5
  opacity: 255
  path: system
  loopx: 48
  loopy: 48
</fl>
<fl=BlueSky>
  opacity: 128
  loopx: -4
  loopy: -4
  z: 10001
  scale: 3
</fl>
<fl=BlueSky>
  x: 96
  y: 96
  width: 96
  height: 96
  opacity: 255
  loopx: 32
  loopy: 32
  z: 10002
</fl>
<fl=StarlitSky>
  x: 192
  y: 96
  width: 96
  height: 96
  opacity: 255
  loopx: 32
  loopy: 32
  z: 10003
</fl>
<fl=Ocean1>
  x: 192
  y: 192
  width: 96
  height: 96
  opacity: 255
  loopx: 32
  loopy: 32
  z: 10004
</fl>
<fl=Ocean2>
  x: 96
  y: 192
  width: 96
  height: 96
  opacity: 255
  loopx: 32
  loopy: 32
  z: 10005
</fl>
<fl=!Crystal>
  x: 384
  y: 312
  path: characters
  z: 10006
  cw: 48
  ch: 96
</fl>
<fl=!Crystal>
  x: 384
  y: 216
  path: characters
  z: 1
  cw: 48
  ch: 96
  loopx: 48
</fl>


[pre lang="javascript" file="FreeLayers"]//=============================================================================
// FreeLayers.js
// Last Updated: 2015-10-29 04:42:28 (GMT+8)
//=============================================================================

/*:
* @plugindesc 解放图层!
* @help 当前版本:2015-10-29 04:42:28 (GMT+8)
*
* 首Taroxd在RMVA所编写的Unlimited Layers Display System脚本影响而开发本脚本。
* 暂未做代码&效率优化。
*
* 在地图备注区按以下格式备注内容:
* <fl=filename>
*   z: 整数,默认1,图像的叠加层级,决定了图像在游戏内显示的前后顺序,不可重复
*   x: 整数,默认0,可为负,图像在地图上的X坐标偏移,以地图左上角为原点
*   y: 整数,默认0,可为负,图像在地图上的Y坐标偏移,以地图左上角为原点
*   cx: 整数,默认0,会从图像的(cx,cy)坐标截取宽高为(cw,ch)的内容显示到游戏内
*   cy: 整数,默认0
*   cw: 整数,默认为游戏窗口宽度
*   ch: 整数,默认为游戏窗口高度
*   width: 整数,默认cw,图像在地图内的宽度
*   height: 整数,默认ch,图像在地图内的高度
*   scale: 实数,默认1,可为负,图像缩放倍率
*   scalex: 实数,默认scale,可为负,图像横向缩放倍率
*   scaley: 实数,默认scale,可为负,图像纵向缩放倍率
*   opacity: 整数,默认255,可为0~255,不透明度,数值越高越不透明
*   path: 字符串,默认parallaxes,图像所在的文件夹路径,位于img目录下
*   visible: 布尔值,默认true,图像是否可见,只有值为false时才不可见
*   loopx: 整数,默认0,可为负,图像自动横向滚动的速度
*   loopy: 整数,默认0,可为负,图像自动纵向滚动的速度
*   scrollx: 整数,默认为游戏地图格子的宽度,图像跟随地图横向卷动的速度
*   scrolly: 整数,默认为游戏地图格子的高度,图像跟随地图纵向卷动的速度
* </fl>
* ---------------------------
* 其中filename是图片文件名(无需扩展名),放入img/parallaxes文件夹内
* 这个文件夹名parallaxes可以通过修改path参数来修改
* 另外,文件名不能包含空格,否则将会无法读取
*
* 在<fl=filename>和</fl>中间的数据均为选填,不填则自动设为默认值。
* 每一个设置项只能写一行。(地图备注没有单行长度限制)
* 每一行只能写一个设置项。
* 所有的空格将会被无视。(这个问题后续会进行修复)
* 无特殊需求时,大部分参数不需要设置。
* ---------------------------
* 例:
* <fl=!Crystal>
*   x: 384
*   y: 216
*   path: characters
*   z: 1
*   cw: 48
*   ch: 96
*   loopx: 48
* </fl>
* ---------------------------
* 图层 Z 坐标详解:
* -10000 远景
*      0 游戏地表图层,在角色下方
*  10000 与角色相同
*  20000 云层等的阴影,在角色的上方
*  30000 触碰设备上的目标提示
*  40000 天气、云层等
* 注意:如果你的自定义图层与上述图层用了相同的 Z 坐标,那么这些图层将会被本插件无视从而无法显示。
* 即,你不能设置与系统默认图层相同的 Z 坐标。(至少目前版本不行)
*/

(function() {
   
    function anti(index,origin) {
        // resort array's index while do loop
        if (origin-(index+1) >= 0) {
            return origin-(index+1);
        } else {
            console.log("[function : anti] I got a bug! index is : " + index + " origin is : " + origin);
        }
    }

    var Z_DEFAULT = 10;
    var X_DEFAULT = 0;
    var Y_DEFAULT = 0;
    var SCALE_DEFAULT = 1;
    var SCROLL_DEFAULT = 48;
    var OPACITY_DEFAULT = 255;
    var VISIBLE_DEFAULT = true;
    var PATH_DEFAULT = "parallaxes";
    var LOOPX_DEFAULT = 0;
    var LOOPY_DEFAULT = 0;
    var CX_DEFAULT = 0;
    var CY_DEFAULT = 0;
    //var CW_DEFAULT = Graphics.width;
    //var CH_DEFAULT = Graphics.height;
    //var WIDTH_DEFAULT = Layer.cw;
    //var HEIGHT_DEFAULT = Layer.ch;
   
    var Z_PARALLAX = -10000;
    var Z_TILEMAP = 0;
    var Z_CHARACTERS = 10000;
    var Z_SHADOW = 20000;
    var Z_DESTINATION = 30000;
    var Z_WEATHER = 40000;

    var InfiniteLayers = new Array;
    InfiniteLayers[Z_PARALLAX]    = "Parallax";
    InfiniteLayers[Z_TILEMAP]     = "Tilemap";
    InfiniteLayers[Z_CHARACTERS]  = "Characters";
    InfiniteLayers[Z_SHADOW]      = "Shadow";
    InfiniteLayers[Z_DESTINATION] = "Destination";
    InfiniteLayers[Z_WEATHER]     = "Weather";

    var _Spriteset_Map_Initialize = Spriteset_Map.prototype.initialize;
    Spriteset_Map.prototype.initialize = function() {
        this._infiniteLayers = new Array;
        this._infiniteLayersCount = 0;
        this.readInfiniteLayer();
        _Spriteset_Map_Initialize.call(this);
    }

    Spriteset_Map.prototype.readInfiniteLayer = function() {
        this._infiniteLayersNote = new Array;

        // analy infinite layers

        // - mark block's begin & end line index
        var note = $dataMap.note;
        while (note.match(" ")) {
            note = note.replace(" ","");
        }
        var note = note.split("\n");
        var note_layerBegin = new Array;
        var note_layerEnd = new Array;

        var i = note.length;
        while (i--) {
            var anti_i = anti(i, note.length);
            if (note[anti_i].match("fl=")) {
                note_layerBegin.push(anti_i);
            } else if (note[anti_i].match("\/fl")) {
                note_layerEnd.push(anti_i);
            }
        }

        // - pack block
        var layerBox = new Array;
        var i = note_layerBegin.length;
        while (i--) {
            var anti_i = anti(i, note_layerBegin.length);
            layerBox[anti_i] = "";
            var i2 = note_layerBegin[anti_i];
            for (i2; i2 <= note_layerEnd[anti_i]; i2++) {
                layerBox[anti_i] = layerBox[anti_i] + note[i2] + "\n";
            }
        }

        // - analy block & pack to array
        var outputLayer = new Array();
        var i = layerBox.length;
        while (i--) {
            var anti_i = anti(i, layerBox.length);
            var outputBoxContent = layerBox[anti_i].split("\n");
            var i2 = outputBoxContent.length;
            while (i2--) {
                anti_i2 = anti(i2, outputBoxContent.length);
                if (outputBoxContent[anti_i2] == "") {
                    outputBoxContent.splice(anti_i2, 1);
                }
            }
            outputLayer[anti_i] = outputBoxContent;
        }

        // - convert origin text array to system data array
        var layerBox = new Array();
        var i = outputLayer.length;
        while (i--) {
            var anti_i = anti(i, outputLayer.length);
            layerBox[anti_i] = new Array();
            var i2 = outputLayer[anti_i].length;
            while (i2--) {
                var anti_i2 = anti(i2, outputLayer[anti_i].length);
                var currentText = outputLayer[anti_i][anti_i2];
                if (currentText.match("=")) {
                    var startPos = currentText.indexOf("=")+1;
                    var endPos = currentText.indexOf(">");
                    layerBox[anti_i]["name"] = currentText.substring(startPos,endPos);
                } else if (currentText.match(":")) {
                    var startPos_name = 0;
                    var endPos_name = currentText.indexOf(":");
                    var startPos_value = currentText.indexOf(":")+1;
                    var endPos_value = currentText.length;
                    layerBox[anti_i][currentText.substring(startPos_name,endPos_name)] = currentText.substring(startPos_value,endPos_value);
                }
            }
            // - - add default
            if (layerBox[anti_i].z          == null || layerBox[anti_i].z           == "") { layerBox[anti_i].z             = Z_DEFAULT;            }
            if (layerBox[anti_i].x          == null || layerBox[anti_i].x           == "") { layerBox[anti_i].x             = X_DEFAULT;            }
            if (layerBox[anti_i].y          == null || layerBox[anti_i].y           == "") { layerBox[anti_i].y             = Y_DEFAULT;            }
            if (layerBox[anti_i].scalex     == null || layerBox[anti_i].scalex      == "") { if (layerBox[anti_i].scale == null || layerBox[anti_i].scale == "") { layerBox[anti_i].scalex = SCALE_DEFAULT; } else { layerBox[anti_i].scalex = layerBox[anti_i].scale; } }
            if (layerBox[anti_i].scaley     == null || layerBox[anti_i].scaley      == "") { if (layerBox[anti_i].scale == null || layerBox[anti_i].scale == "") { layerBox[anti_i].scaley = SCALE_DEFAULT; } else { layerBox[anti_i].scaley = layerBox[anti_i].scale; } }
            if (layerBox[anti_i].scrollx    == null || layerBox[anti_i].scrollx     == "") { if (layerBox[anti_i].scroll == null || layerBox[anti_i].scroll == "") { layerBox[anti_i].scrollx = SCROLL_DEFAULT; } else { layerBox[anti_i].scrollx = layerBox[anti_i].scroll; } }
            if (layerBox[anti_i].scrolly    == null || layerBox[anti_i].scrolly     == "") { if (layerBox[anti_i].scroll == null || layerBox[anti_i].scroll == "") { layerBox[anti_i].scrolly = SCROLL_DEFAULT; } else { layerBox[anti_i].scrolly = layerBox[anti_i].scroll; } }
            if (layerBox[anti_i].opacity    == null || layerBox[anti_i].opacity     == "") { layerBox[anti_i].opacity       = OPACITY_DEFAULT;      }
            if (layerBox[anti_i].visible    == null || layerBox[anti_i].visible     == "") { layerBox[anti_i].visible       = VISIBLE_DEFAULT;      } else { if (layerBox[anti_i].visible != "false") { layerBox[anti_i].visible = true; } else { layerBox[anti_i].visible = false; } }
            if (layerBox[anti_i].path       == null || layerBox[anti_i].pah         == "") { layerBox[anti_i].path          = PATH_DEFAULT;         }
            if (layerBox[anti_i].loopx      == null || layerBox[anti_i].loopx       == "") { layerBox[anti_i].loopx         = LOOPX_DEFAULT;        }
            if (layerBox[anti_i].loopy      == null || layerBox[anti_i].loopy       == "") { layerBox[anti_i].loopy         = LOOPY_DEFAULT;        }
            if (layerBox[anti_i].cx         == null || layerBox[anti_i].cx          == "") { layerBox[anti_i].cx            = CX_DEFAULT;           }
            if (layerBox[anti_i].cy         == null || layerBox[anti_i].cy          == "") { layerBox[anti_i].cy            = CY_DEFAULT;           }
            if (layerBox[anti_i].cw         == null || layerBox[anti_i].cw          == "") { layerBox[anti_i].cw            = Graphics.width;       }
            if (layerBox[anti_i].ch         == null || layerBox[anti_i].ch          == "") { layerBox[anti_i].ch            = Graphics.height;      }
            if (layerBox[anti_i].width      == null || layerBox[anti_i].width       == "") { layerBox[anti_i].width         = layerBox[anti_i].cw;  }
            if (layerBox[anti_i].height     == null || layerBox[anti_i].height      == "") { layerBox[anti_i].height        = layerBox[anti_i].ch;  }
            // - - convert to integer
            layerBox[anti_i].z          = parseInt(layerBox[anti_i].z,         10);
            layerBox[anti_i].x          = parseInt(layerBox[anti_i].x,         10);
            layerBox[anti_i].y          = parseInt(layerBox[anti_i].y,         10);
            layerBox[anti_i].scalex     = parseFloat(layerBox[anti_i].scalex);
            layerBox[anti_i].scaley     = parseFloat(layerBox[anti_i].scaley);
            layerBox[anti_i].scrollx    = parseInt(layerBox[anti_i].scrollx,   10);
            layerBox[anti_i].scrolly    = parseInt(layerBox[anti_i].scrolly,   10);
            layerBox[anti_i].opacity    = parseInt(layerBox[anti_i].opacity,   10);
            layerBox[anti_i].loopx      = parseInt(layerBox[anti_i].loopx,     10);
            layerBox[anti_i].loopy      = parseInt(layerBox[anti_i].loopy,     10);
            layerBox[anti_i].cx         = parseInt(layerBox[anti_i].cx,        10);
            layerBox[anti_i].cy         = parseInt(layerBox[anti_i].cy,        10);
            layerBox[anti_i].cw         = parseInt(layerBox[anti_i].cw,        10);
            layerBox[anti_i].ch         = parseInt(layerBox[anti_i].ch,        10);
            layerBox[anti_i].width      = parseInt(layerBox[anti_i].width,     10);
            layerBox[anti_i].height     = parseInt(layerBox[anti_i].height,    10);
        }

        // pack data into var "InfiniteLayers"
        var i = layerBox.length;
        while (i--) {
            var Z_INDEX = layerBox.z;
            InfiniteLayers[Z_INDEX] = layerBox;
        }
    }

    Spriteset_Map.prototype.createInfiniteLayer = function(Z_INDEX) {
        
        // Default Layers ...

             if (Z_INDEX == Z_PARALLAX)     { this.createParallax();    return; } // base
        else if (Z_INDEX == Z_TILEMAP)      { this.createTilemap();     return; } // base
        else if (Z_INDEX == Z_CHARACTERS)   { this.createCharacters();  return; } // tilemap
        else if (Z_INDEX == Z_SHADOW)       { this.createShadow();      return; } // tilemap
        else if (Z_INDEX == Z_DESTINATION)  { this.createDestination(); return; } // tilemap
        else if (Z_INDEX == Z_WEATHER)      { this.createWeather();     return; } // Spriteset_Map

        // Custom Layers ...

        var ldata = InfiniteLayers[Z_INDEX];
        var lobj = new TilingSprite();

        if      (Z_INDEX       < Z_PARALLAX                            ) { }
        else if (Z_PARALLAX    < Z_INDEX    && Z_INDEX < Z_TILEMAP     ) { }
        else if (Z_TILEMAP     < Z_INDEX    && Z_INDEX < Z_CHARACTERS  ) { lobj.z =  3; }
        else if (Z_CHARACTERS  < Z_INDEX    && Z_INDEX < Z_SHADOW      ) { lobj.z =  5; }
        else if (Z_SHADOW      < Z_INDEX    && Z_INDEX < Z_DESTINATION ) { lobj.z =  7; }
        else if (Z_DESTINATION < Z_INDEX    && Z_INDEX < Z_WEATHER     ) { lobj.z = 10; }
        else if (Z_WEATHER     < Z_INDEX                               ) { }

        lobj.setFrame(ldata.cx, ldata.cy, ldata.cw, ldata.ch);
        lobj.move(ldata.x, ldata.y, ldata.width, ldata.height);
        lobj.bitmap     = ImageManager.loadBitmap("img/"+ldata.path+"/",ldata.name);
        lobj.scale.x    = ldata.scalex;
        lobj.scale.y    = ldata.scaley;
        lobj.opacity    = ldata.opacity;
        lobj.visible    = ldata.visible;
        
        if      (Z_INDEX       < Z_PARALLAX)                         { this._baseSprite.addChild(lobj); }
        else if (Z_PARALLAX    < Z_INDEX && Z_INDEX < Z_TILEMAP)     { this._baseSprite.addChild(lobj); }
        else if (Z_TILEMAP     < Z_INDEX && Z_INDEX < Z_CHARACTERS)  { this._tilemap.addChild(lobj);    }
        else if (Z_CHARACTERS  < Z_INDEX && Z_INDEX < Z_SHADOW)      { this._tilemap.addChild(lobj);    }
        else if (Z_SHADOW      < Z_INDEX && Z_INDEX < Z_DESTINATION) { this._tilemap.addChild(lobj);    }
        else if (Z_DESTINATION < Z_INDEX && Z_INDEX < Z_WEATHER)     { this._tilemap.addChild(lobj);    }
        else if (Z_WEATHER     < Z_INDEX)                            { this.addChild(lobj);             }
        
        this._infiniteLayers[Z_INDEX] = lobj;
        
    }

    Spriteset_Map.prototype.updateInfiniteLayer = function(Z_INDEX) {

        // Default Layers ...

             if (Z_INDEX == Z_PARALLAX)     { this.updateParallax(); return; } // base
        else if (Z_INDEX == Z_TILEMAP)      { this.updateTilemap();  return; } // base
        else if (Z_INDEX == Z_CHARACTERS)   {                        return; } // tilemap
        else if (Z_INDEX == Z_SHADOW)       { this.updateShadow();   return; } // tilemap
        else if (Z_INDEX == Z_DESTINATION)  {                        return; } // tilemap
        else if (Z_INDEX == Z_WEATHER)      { this.updateWeather();  return; } // Spriteset_Map

        // Custom Layers ...
        
        var ldata = InfiniteLayers[Z_INDEX];
        var lobj = this._infiniteLayers[Z_INDEX];
        
        if (lobj.bitmap) {
            lobj.x = $gameMap.displayX() * ldata.scrollx * -1 + ldata.x;
            lobj.y = $gameMap.displayY() * ldata.scrolly * -1 + ldata.y;
            lobj.scale.x = ldata.scalex;
            lobj.scale.y = ldata.scaley;
            lobj.opacity = ldata.opacity;
            if (ldata.loopx) { lobj.origin.x += ldata.loopx / 48 / 2 * -1; }
            if (ldata.loopy) { lobj.origin.y += ldata.loopy / 48 / 2 * -1; }
        }
    }

    Spriteset_Map.prototype.createLowerLayer = function() {
        Spriteset_Base.prototype.createLowerLayer.call(this);
        for (var i in InfiniteLayers) { if (i <  0) { this.createInfiniteLayer(i); } }
        for (var i in InfiniteLayers) { if (i >= 0) { this.createInfiniteLayer(i); } }
    };

    Spriteset_Map.prototype.update = function() {
        Spriteset_Base.prototype.update.call(this);
        this.updateTileset();
        for (var i in InfiniteLayers) { if (i <  0) { this.updateInfiniteLayer(i); } }
        for (var i in InfiniteLayers) { if (i >= 0) { this.updateInfiniteLayer(i); } }
    };

})();[/pre]

[/fold]
[fold=UnlimitedLayers 2015.10.28 07.13.20]
基本复原了Taroxd在RMVA所编写的Unlimited Layers Display System脚本。

由于RMMV移除了Z轴的设定,因此部分功能的模拟将会在后续继续更新。
由于对RMMV脚本熟练度还欠缺,可能会有未知BUG,如果发现了,欢迎反馈给我。

另外目前本系统仍然处于开发阶段,部分功能也许会在后续进行阉割或者调整或者新增。

你可以关注这个帖子来得知本系统的最新动向。



懒得折腾场景了,随便用远景图做下演示 。

fdyty.png

UnlimitedLayers.rar (3.86 KB, 下载次数: 27)

[pre lang="javascript" file="UnlimitedLayers.js"]//=============================================================================
// UnlimitedLayers.js
// Last Updated: 2015-10-28 07:13:20 (GMT+8)
//=============================================================================

/*:
* @plugindesc 解放图层!
* @help
*
* 移植了Taroxd在RMVA所编写的Unlimited Layers Display System脚本。
* 由于水平限制,并没有采取Taroxd的编写风格,并且目前版本为测试版,因此未做代码优化。
*
* 在地图备注区按以下格式备注内容:
* <ulds=filename>
*   x: 图像初始 X 偏移坐标
*     整数,默认为 0
*   y: 图像初始 Y 偏移坐标
*     整数,默认为 0
*   z: 图像 Z 坐标
*     整数,默认为 10,可以设置为 -100 来当作远景图使用,但这要求你没有使用默认的远景图。下方有对 Z 坐标的详细说明。
*   zoom: 缩放倍率
*     整数,默认为 1。缩放的原点为画面左上角。
*   zoom_x: 横向缩放倍率
*     整数,默认为 zoom
*   zoom_y: 纵向缩放倍率
*     整数,默认为 zoom
*   opacity: 不透明度
*     整数,默认为 255
*   blend_type: 合成方式
*     整数,只计算一次。默认为 0 (0:正常、1:加法、2:减法、3:屏幕所用方式?)
*   scroll: 图像跟随地图卷动的速度
*     整数,默认为 48,即一个地图格子的大小。
*   scroll_x: 图像跟随地图横向卷动的速度
*     整数,默认为 scroll
*   scroll_y:图像跟随地图纵向卷动的速度
*     整数,默认为 scroll
*   visible: 图像是否显示
*     布尔,默认为 true
*   path: 图像的路径名
*     字符串,默认为 parallaxes
*   loop_x: 图像自动横向滚动的速度
*     整数,默认为 0,可为负数,但若填写为负数,目前将无法自动填充图像
*   loop_y: 图像自动纵向滚动的速度
*     整数,默认为 0,可为负数,但若填写为负数,目前将无法自动填充图像
*   tone: 图像色调
*     数组,默认为 null,可按顺序选填 红色, 绿色, 蓝色, 透明度 ,每一个参数的值都为 0 ~ 255 之间的整数
*     填写示例:
*         tone: 12, 254, 66, 128
* </ulds>
* ---------------------------
* 其中 filename 是图片文件名(无需扩展名),放入 img/parallaxes 文件夹内
* 这个文件夹名 parallaxes 可以通过设置 path 参数来修改
* 另外,文件名不能包含空格,否则将会无法读取
*
* 在 <ulds=filename> 和 </ulds> 中间的部分均为选填。不填则自动设为默认值。
* 每一个设置项只能写一行。(地图备注没有单行长度限制)
* 每一行只能写一个设置项。
* 一般来说,正常使用时大部分都是不需要设置的。
* ---------------------------
* 例:
*  <ulds=BlueSky>
*    x: 5
*    scroll_x: 16
*    scroll_y: 64
*    z: 501
*    opacity: 128
*    tone: 12, 254, 66, 128
*  </ulds>
* ---------------------------
* 图层 Z 坐标详解:
* -100 远景
*    0 游戏地表图层,在角色下方
*  100 与角色相同
*  200 云层等的阴影,在角色的上方
*  300 触碰设备上的目标提示
*  400 天气、云层等
* 注意:如果你的自定义图层与上述图层用了相同的 Z 坐标,那么这些图层将会被本插件无视从而无法显示。
* 即,你不能设置与系统默认图层相同的 Z 坐标。(至少目前版本不行)
* ---------------------------
* 特殊说明:
* 若某图层 Z 坐标大于或等于 500,则本插件会将该图层自动铺满屏幕,你可以使用这类图层来做动态天气效果。
* 但动态图层目前不支持zoom, tone属性并且要求 Z 坐标必须大于等于 500,这些问题将会在后续版本修复。
*/

/*:en
* @plugindesc Let layers free. ( Not support English yet. )
*/

(function() {

        // ------------------------------------
        // resort array's index while do loop
        var anti = function(now, origin) {
                return origin-(now+1);
        }
        // ------------------------------------

        var Z_DEFAULT = 10;
        var X_DEFAULT = 0;
        var Y_DEFAULT = 0;
        var ZOOM_DEFAULT = 1;
        var SCROLL_DEFAULT = 48;
        var OPACITY_DEFAULT = 255;
        var BLEND_TYPE_DEFAULT = 0;
        var VISIBLE_DEFAULT = true;
        var PATH_DEFAULT = "parallaxes";
        var LOOP_X_DEFAULT = 0;
        var LOOP_Y_DEFAULT = 0;
        var TONE_DEFAULT = null;

        var Z_PARALLAX = -100;
        var Z_TILEMAP = 0;
        var Z_CHARACTERS = 100;
        var Z_SHADOW = 200;
        var Z_DESTINATION = 300;
        var Z_WEATHER = 400;
        var Z_ANIMATION = 500;

        var InfiniteLayers = new Array;
        InfiniteLayers[Z_PARALLAX]    = "Parallax";
        InfiniteLayers[Z_TILEMAP]     = "Tilemap";
        InfiniteLayers[Z_CHARACTERS]  = "Characters";
        InfiniteLayers[Z_SHADOW]      = "Shadow";
        InfiniteLayers[Z_DESTINATION] = "Destination";
        InfiniteLayers[Z_WEATHER]     = "Weather";

        var _Spriteset_Map_Initialize = Spriteset_Map.prototype.initialize;
        Spriteset_Map.prototype.initialize = function() {
                this._infiniteLayers = new Array;
                this._infiniteLayersCount = 0;
                this.readInfiniteLayer();
                _Spriteset_Map_Initialize.call(this);
        }

        Spriteset_Map.prototype.readInfiniteLayer = function() {
                this._infiniteLayersNote = new Array;

                // analy infinite layers

                // - mark block's begin & end line index
                var note = $dataMap.note;
                while (note.match(" ")) {
                        note = note.replace(" ","");
                }
                var note = note.split("\n");
                var note_layerBegin = new Array;
                var note_layerEnd = new Array;

                var i = note.length;
                while (i--) {
                        var anti_i = anti(i, note.length);
                        if (note[anti_i].match("ulds=")) {
                                note_layerBegin.push(anti_i);
                        } else if (note[anti_i].match("\/ulds")) {
                                note_layerEnd.push(anti_i);
                        }
                }

                // - pack block
                var layerBox = new Array;
                var i = note_layerBegin.length;
                while (i--) {
                        var anti_i = anti(i, note_layerBegin.length);
                        layerBox[anti_i] = "";
                        var i2 = note_layerBegin[anti_i];
                        for (i2; i2 <= note_layerEnd[anti_i]; i2++) {
                                layerBox[anti_i] = layerBox[anti_i] + note[i2] + "\n";
                        }
                }

                // - analy block & pack to array
                var outputLayer = new Array();
                var i = layerBox.length;
                while (i--) {
                        var anti_i = anti(i, layerBox.length);
                        var outputBoxContent = layerBox[anti_i].split("\n");
                        var i2 = outputBoxContent.length;
                        while (i2--) {
                                anti_i2 = anti(i2, outputBoxContent.length);
                                if (outputBoxContent[anti_i2] == "") {
                                        outputBoxContent.splice(anti_i2, 1);
                                }
                        }
                        outputLayer[anti_i] = outputBoxContent;
                }

                // - convert origin text array to system data array
                var layerBox = new Array();
                var i = outputLayer.length;
                while (i--) {
                        var anti_i = anti(i, outputLayer.length);
                        layerBox[anti_i] = new Array();
                        var i2 = outputLayer[anti_i].length;
                        while (i2--) {
                                var anti_i2 = anti(i2, outputLayer[anti_i].length);
                                var currentText = outputLayer[anti_i][anti_i2];
                                if (currentText.match("=")) {
                                        var startPos = currentText.indexOf("=")+1;
                                        var endPos = currentText.indexOf(">");
                                        layerBox[anti_i]["name"] = currentText.substring(startPos,endPos);
                                } else if (currentText.match(":")) {
                                        var startPos_name = 0;
                                        var endPos_name = currentText.indexOf(":");
                                        var startPos_value = currentText.indexOf(":")+1;
                                        var endPos_value = currentText.length;
                                        layerBox[anti_i][currentText.substring(startPos_name,endPos_name)] = currentText.substring(startPos_value,endPos_value);
                                }
                        }
                        // - - add default
                        if (layerBox[anti_i].z == null) { layerBox[anti_i].z = Z_DEFAULT; }
                        if (layerBox[anti_i].x == null) { layerBox[anti_i].x = X_DEFAULT; }
                        if (layerBox[anti_i].y == null) { layerBox[anti_i].y = Y_DEFAULT; }
                        if (layerBox[anti_i].zoom_x == null) { if (layerBox[anti_i].zoom == null) { layerBox[anti_i].zoom_x = ZOOM_DEFAULT; } else { layerBox[anti_i].zoom_x = layerBox[anti_i].zoom; } }
                        if (layerBox[anti_i].zoom_y == null) { if (layerBox[anti_i].zoom == null) { layerBox[anti_i].zoom_y = ZOOM_DEFAULT; } else { layerBox[anti_i].zoom_y = layerBox[anti_i].zoom; } }
                        if (layerBox[anti_i].scroll_x == null) { if (layerBox[anti_i].scroll == null) { layerBox[anti_i].scroll_x = SCROLL_DEFAULT; } else { layerBox[anti_i].scroll_x = layerBox[anti_i].scroll; } }
                        if (layerBox[anti_i].scroll_y == null) { if (layerBox[anti_i].scroll == null) { layerBox[anti_i].scroll_y = SCROLL_DEFAULT; } else { layerBox[anti_i].scroll_y = layerBox[anti_i].scroll; } }
                        if (layerBox[anti_i].opacity == null) { layerBox[anti_i].opacity = OPACITY_DEFAULT; }
                        if (layerBox[anti_i].blend_type == null) { layerBox[anti_i].blend_type = BLEND_TYPE_DEFAULT; }
                        if (layerBox[anti_i].visible == null) { layerBox[anti_i].visible = VISIBLE_DEFAULT; }
                        if (layerBox[anti_i].path == null) { layerBox[anti_i].path = PATH_DEFAULT; }
                        if (layerBox[anti_i].loop_x == null) { layerBox[anti_i].loop_x = LOOP_X_DEFAULT; }
                        if (layerBox[anti_i].loop_y == null) { layerBox[anti_i].loop_y = LOOP_Y_DEFAULT; }
                        if (layerBox[anti_i].tone == null) { layerBox[anti_i].tone = TONE_DEFAULT; } else { layerBox[anti_i].tone = layerBox[anti_i].tone.split(","); }
                        // - - convert to integer
                        layerBox[anti_i].z = parseInt(layerBox[anti_i].z, 10);
                        layerBox[anti_i].x = parseInt(layerBox[anti_i].x, 10);
                        layerBox[anti_i].y = parseInt(layerBox[anti_i].y, 10);
                        layerBox[anti_i].zoom_x = parseInt(layerBox[anti_i].zoom_x, 10);
                        layerBox[anti_i].zoom_y = parseInt(layerBox[anti_i].zoom_y, 10);
                        layerBox[anti_i].scroll_x = parseInt(layerBox[anti_i].scroll_x, 10);
                        layerBox[anti_i].scroll_y = parseInt(layerBox[anti_i].scroll_y, 10);
                        layerBox[anti_i].opacity = parseInt(layerBox[anti_i].opacity, 10);
                        layerBox[anti_i].blend_type = parseInt(layerBox[anti_i].blend_type, 10);
                        layerBox[anti_i].loop_x = parseInt(layerBox[anti_i].loop_x, 10);
                        layerBox[anti_i].loop_y = parseInt(layerBox[anti_i].loop_y, 10);
                        if (layerBox[anti_i].tone != TONE_DEFAULT) { var i2 = layerBox[anti_i].tone.length; while(i2--) { layerBox[anti_i].tone[i2] = parseInt(layerBox[anti_i].tone[i2], 10); } }
                }

                // pack data into var "InfiniteLayers"
                var i = layerBox.length;
                while (i--) {
                        var Z_INDEX = layerBox.z;
                        InfiniteLayers[Z_INDEX] = layerBox;
                }
        }

        Spriteset_Map.prototype.createInfiniteLayer = function(Z_INDEX) {

                // Default Layers ...

                     if (Z_INDEX == Z_PARALLAX)                { this.createParallax(); return; }                // base
                else if (Z_INDEX == Z_TILEMAP)                { this.createTilemap(); return; }                // base
            else if (Z_INDEX == Z_CHARACTERS)        { this.createCharacters(); return; }        // tilemap
            else if (Z_INDEX == Z_SHADOW)                { this.createShadow(); return; }                // tilemap
            else if (Z_INDEX == Z_DESTINATION)        { this.createDestination(); return; }        // tilemap
            else if (Z_INDEX == Z_WEATHER)                { this.createWeather(); return; }                // Spriteset_Map

            // Custom Layers ...

            Z_INDEX < Z_ANIMATION ? this._infiniteLayers[Z_INDEX] = new Sprite() : this._infiniteLayers[Z_INDEX] = new TilingSprite();

            if (Z_INDEX <  Z_PARALLAX)                                                                        { }
            else if (Z_PARALLAX < Z_INDEX && Z_INDEX < Z_TILEMAP)                { }
            else if (Z_TILEMAP < Z_INDEX && Z_INDEX < Z_CHARACTERS)                { this._infiniteLayers[Z_INDEX].z =  3; }
            else if (Z_CHARACTERS < Z_INDEX && Z_INDEX < Z_SHADOW)                { this._infiniteLayers[Z_INDEX].z =  5; }
            else if (Z_SHADOW < Z_INDEX && Z_INDEX < Z_DESTINATION)                { this._infiniteLayers[Z_INDEX].z =  7; }
            else if (Z_DESTINATION < Z_INDEX && Z_INDEX < Z_WEATHER)        { this._infiniteLayers[Z_INDEX].z = 10; }
            else if (Z_WEATHER < Z_INDEX)                                                                { }

            Z_INDEX < Z_ANIMATION ? this._infiniteLayers[Z_INDEX].move(0, 0, Graphics.width, Graphics.height) : this._infiniteLayers[Z_INDEX].move(0, 0, Graphics.width*99999, Graphics.height*99999);
            this._infiniteLayers[Z_INDEX].bitmap = ImageManager.loadBitmap("img/"+InfiniteLayers[Z_INDEX].path+"/",InfiniteLayers[Z_INDEX].name);
            this._infiniteLayers[Z_INDEX].x = InfiniteLayers[Z_INDEX].x;
            this._infiniteLayers[Z_INDEX].y = InfiniteLayers[Z_INDEX].y;
            this._infiniteLayers[Z_INDEX].scale.x = InfiniteLayers[Z_INDEX].zoom_x;
            this._infiniteLayers[Z_INDEX].scale.y = InfiniteLayers[Z_INDEX].zoom_y;
            this._infiniteLayers[Z_INDEX].opacity = InfiniteLayers[Z_INDEX].opacity;
            this._infiniteLayers[Z_INDEX].blend_type = InfiniteLayers[Z_INDEX].blend_type;
            this._infiniteLayers[Z_INDEX].visible = InfiniteLayers[Z_INDEX].visible;
            this._infiniteLayers[Z_INDEX].loop_x = InfiniteLayers[Z_INDEX].loop_x;
            this._infiniteLayers[Z_INDEX].loop_y = InfiniteLayers[Z_INDEX].loop_y;
            if (InfiniteLayers[Z_INDEX].tone != null && this._infiniteLayers[Z_INDEX].setColorTone != null) {
                    this._infiniteLayers[Z_INDEX].setColorTone(InfiniteLayers[Z_INDEX].tone);
            }

                if (Z_INDEX < Z_PARALLAX)                                                                        { this._baseSprite.addChild(this._infiniteLayers[Z_INDEX]);        }
                else if (Z_PARALLAX < Z_INDEX && Z_INDEX < Z_TILEMAP)                { this._baseSprite.addChild(this._infiniteLayers[Z_INDEX]);        }
                else if (Z_TILEMAP < Z_INDEX && Z_INDEX < Z_CHARACTERS)                { this._tilemap.addChild(this._infiniteLayers[Z_INDEX]);        }
                else if (Z_CHARACTERS < Z_INDEX && Z_INDEX < Z_SHADOW)                { this._tilemap.addChild(this._infiniteLayers[Z_INDEX]);        }
                else if (Z_SHADOW < Z_INDEX && Z_INDEX < Z_DESTINATION)                { this._tilemap.addChild(this._infiniteLayers[Z_INDEX]);        }
                else if (Z_DESTINATION < Z_INDEX && Z_INDEX < Z_WEATHER)        { this._tilemap.addChild(this._infiniteLayers[Z_INDEX]);        }
                else if (Z_WEATHER < Z_INDEX)                                                                { this.addChild(this._infiniteLayers[Z_INDEX]);                                }

        }

        Spriteset_Map.prototype.updateInfiniteLayer = function(Z_INDEX) {

                // Default Layers ...

                     if (Z_INDEX == Z_PARALLAX)                { this.updateParallax(); }                // base
                else if (Z_INDEX == Z_TILEMAP)                { this.updateTilemap(); }                // base
            else if (Z_INDEX == Z_CHARACTERS)        {}                                                                // tilemap
            else if (Z_INDEX == Z_SHADOW)                { this.updateShadow(); }                // tilemap
            else if (Z_INDEX == Z_DESTINATION)        {}                                                                // tilemap
            else if (Z_INDEX == Z_WEATHER)                { this.updateWeather(); }                // Spriteset_Map

                // Custom Layers ...

            else if (this._infiniteLayers[Z_INDEX].bitmap) {
                this._infiniteLayers[Z_INDEX].x = $gameMap.displayX() * InfiniteLayers[Z_INDEX].scroll_x * -1;
                this._infiniteLayers[Z_INDEX].y = $gameMap.displayY() * InfiniteLayers[Z_INDEX].scroll_y * -1;
                this._infiniteLayers[Z_INDEX].scale.x = InfiniteLayers[Z_INDEX].zoom_x;
                this._infiniteLayers[Z_INDEX].scale.y = InfiniteLayers[Z_INDEX].zoom_y;
                this._infiniteLayers[Z_INDEX].opacity = InfiniteLayers[Z_INDEX].opacity;
                    if (this._infiniteLayers[Z_INDEX].loop_x) { this._infiniteLayers[Z_INDEX].x += Graphics.frameCount * this._infiniteLayers[Z_INDEX].loop_x / 48 / 2 * -1; }
                    if (this._infiniteLayers[Z_INDEX].loop_y) { this._infiniteLayers[Z_INDEX].y += Graphics.frameCount * this._infiniteLayers[Z_INDEX].loop_y / 48 / 2 * -1; }
            }
        }

        Spriteset_Map.prototype.createLowerLayer = function() {
            Spriteset_Base.prototype.createLowerLayer.call(this);
            for (var i in InfiniteLayers) { if (i <  0) { this.createInfiniteLayer(i); } }
            for (var i in InfiniteLayers) { if (i >= 0) { this.createInfiniteLayer(i); } }
        };

        Spriteset_Map.prototype.update = function() {
            Spriteset_Base.prototype.update.call(this);
            this.updateTileset();
            for (var i in InfiniteLayers) { if (i <  0) { this.updateInfiniteLayer(i); } }
            for (var i in InfiniteLayers) { if (i >= 0) { this.updateInfiniteLayer(i); } }
        };

})();
[/pre][/fold]

评分

参与人数 2星屑 +66 梦石 +1 收起 理由
余烬之中 + 1 原创发布
小传子 + 66 精品文章

查看全部评分

实力跳票,根本停不下来…… | bgpCore.js | 《下一站》2号DEMO | 插件开发无限延期中……正在研制适用性更强的普适模板,不再输出单体插件……
梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
回帖
1464
发表于 2015-10-28 08:10:23 | 显示全部楼层
抱走学习。
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-10-28 08:54:15 | 显示全部楼层
本帖最后由 taroxd 于 2015-10-28 08:57 编辑

https://rpg.blue/thread-384603-1-1.html

为啥都喜欢造这轮子 orz...

另外MV有Z轴设定了,Z轴会在 Tilemap 中排序。默认的图层是0~9,不过可以用小数嘛~ 所以z坐标还是很自由的~
回复

使用道具 举报

梦石
0
星屑
50
在线时间
119 小时
注册时间
2015-1-5
回帖
118
 楼主| 发表于 2015-10-28 11:37:16 来自手机 | 显示全部楼层
taroxd 发表于 2015-10-28 08:54
https://rpg.blue/thread-384603-1-1.html

为啥都喜欢造这轮子 orz...

的确看到了tilemap,但tilemap的封装不足,并且在部分画面处理上机制也还不清楚。
如果是满足基础功能的话推荐的url可用,不过如果想拓展点(比如做动态场景),还是得自己动手OTZ
(实际上做这个就是因为url的链接没满足游戏开发需要才弄的↑ ↓)
回复

使用道具 举报

梦石
0
星屑
50
在线时间
119 小时
注册时间
2015-1-5
回帖
118
 楼主| 发表于 2015-10-28 11:40:38 来自手机 | 显示全部楼层
taroxd 发表于 2015-10-28 08:54
https://rpg.blue/thread-384603-1-1.html

为啥都喜欢造这轮子 orz...

ORZ,还以为你贴的是另一个帖子。
求发到这里来一份↑ ↓

不过这样的话,就当我做的版本是另一个分支好了↑ ↓满足不同需求
回复

使用道具 举报

梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
回帖
1057
发表于 2015-10-28 13:50:05 | 显示全部楼层
老实说 为啥不直接做个tiledmap的绑定呢
RM-GUI延期。。。最近被黑心老板压迫T_T
二次元少女的shitake,长着长脸,身高165,蓝色卷双马尾,FCUP,瞳色黑色,病气和御宅属性,是天才少女。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
119 小时
注册时间
2015-1-5
回帖
118
 楼主| 发表于 2015-10-28 16:27:42 | 显示全部楼层
墨凌羽 发表于 2015-10-28 13:50
老实说 为啥不直接做个tiledmap的绑定呢

对tilemap特性了解还不够深,所以暂时没用它。
实力跳票,根本停不下来…… | bgpCore.js | 《下一站》2号DEMO | 插件开发无限延期中……正在研制适用性更强的普适模板,不再输出单体插件……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
119 小时
注册时间
2015-1-5
回帖
118
 楼主| 发表于 2015-10-29 04:57:14 | 显示全部楼层
人工置顶,更新为FreeLayers 2015-10-29 04:42:28版。
(BTW:这样不算连帖吧- -
实力跳票,根本停不下来…… | bgpCore.js | 《下一站》2号DEMO | 插件开发无限延期中……正在研制适用性更强的普适模板,不再输出单体插件……
回复

使用道具 举报

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
回帖
1464
发表于 2015-10-29 08:31:57 | 显示全部楼层
求大神讲解一下原理。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
119 小时
注册时间
2015-1-5
回帖
118
 楼主| 发表于 2015-10-29 11:50:59 来自手机 | 显示全部楼层
汪汪 发表于 2015-10-29 08:31
求大神讲解一下原理。


游戏每次加载游戏地图时必然调用Spriteset_Map类。
因此在每次游戏地图刚刚开始加载时,解析当前地图的备注区,判定是否有自定义图层。
如果有,则在加载默认图层时,将这些自定义图层插入。
你可以看看我代码的Spriteset.prototype.initialize和Spriteset.prototype.createLowerLayer部分。
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部