Project1

标题: [MV/MZ]ULDS无限图层插件使用详解 (2023-08-04更新+范例v3) [打印本页]

作者: Rose_shadows    时间: 2022-4-24 23:24
标题: [MV/MZ]ULDS无限图层插件使用详解 (2023-08-04更新+范例v3)
本帖最后由 Rose_shadows 于 2023-8-4 22:18 编辑

taroxd大佬的ULDS无限图层插件具有非常强大的图层功能,允许开发者在地图上叠加无限的视差图层。但相信不少人在研究插件的时候都曾为插件帮助中不甚详尽的说明绞尽脑汁……
现在论坛上似乎还没有系统的ULDS教程,为了能让更多的新人小白感受到这个插件的魅力,我以我对ULDS浅薄的认识写了这样一篇教程。
与此同时,诚邀各路大神一起解决该教程中的问题,弥补该教程中的缺憾。

2023-08-04 ULDS简易范例更新至v3.00(蓝奏云):
https://wwll.lanzout.com/iRUuY14d2yte
新增自由淡入淡出和遮罩房间范例,修复了Bug并进一步完善了内容,将无限图层插件帮助文档内容与本帖同步

旧版本范例


该教程将依次讲述以下5个模块,后续也许还会更新:

1. 地图注释(基础)
2. 地图注释(高级)
3. 地图注释例子
4. 设置碰撞体积
5. 技巧
     •关于相对地图远景
     •关于动态帧图层
     •关于简易光源 (2022-12-09更新)
        ├ 简易圆形光源
        └ 简易手电筒
     •关于淡入淡出 (2023-07-27更新)
        ├ 立即淡入淡出
        ├ 与开关相联的淡入/淡出(仅能同时实现一种)
        └ 与开关相联的自由淡入淡出(两种皆可实现)
     •关于遮罩房间 (2023-08-04更新)
     •(或许以后还会更新...)

* ---------------------------------------------------------------------
*  === ULDS插件使用说明 ===
*
* ULDS插件通过配置地图注释来实现图层功能。
*
*  == 1. 地图注释(基础) ==
*
* 在地图注释中按以下格式书写:
*
      <ulds> {
       参数1: 值1,
       参数2: 值2,
       ......
       参数n: 值n
    } </ulds>
*
*    <ulds>和</ulds>之间要以 JSON 格式书写。请自行学习JSON格式如何书写。
*   
*    其中,必须有的参数是:
*
*    "name": 图片名称。
*
*    "x": 图片的x坐标。x坐标越大,图片越靠右。
*         若为 纯数字 ,则表示以 屏幕左上角 为原点的图片x坐标。图片横向位置始终与屏幕保持一致。
*         若为 this.rx(n) ,则表示以 地图左上角 为原点的图片x坐标。
*         n 可以是以下2种情况:
*           - 若n为 数字,则表示以 地图左上角 为原点的图片x坐标,且x坐标为 n 。
*             例如 this.rx(48) 指的是图片会贴在地图x坐标为 48 像素的位置。
*           - 若n为 t ,则图片将会被从左向右滚动播放。
*             如果是 -t ,则图片会被从右向左滚动播放。
*
*    "y": 图片的y坐标。y坐标越大,图片越靠下。
*         若为 纯数字 ,则表示以 屏幕左上角 为原点的图片y坐标。图片纵向位置始终与屏幕保持一致。
*         若为 this.ry(n) ,则表示以 地图左上角 为原点的图片y坐标。
*         n 可以是以下2种情况:
*           - 若n为 数字,则表示以 地图左上角 为原点的图片y坐标,且y坐标为 n 。
*             例如 this.ry(48) 指的是图片会贴在地图y坐标为 48 像素的位置。
*           - 若n为 t ,则图片将会被从上到下滚动播放。
*             如果是 -t ,则图片会被从下向上滚动播放。
*
*    其他可供选择的基础参数有:
*
*    "z": 图片的z层级。默认是0.5(可在插件参数中设置)。小数点可精确至后两位。建议大于1,且为浮点数,这样设置可以最大程度地兼容其他涉及图层的插件(如灯光插件等)。
*         指定图片可以覆盖在z层级小于该图片z层级的所有图片之上。
*         例如,若指定A图片z层级为6,B图片z层级为10,则A图片会覆盖所有z层级低于6的贴图,但会被B图片覆盖。
*         RMMV中各贴图的原生层级:0 -> 远景/A区地面图块,3 -> 玩家/事件,4 -> 星标图块。
*
*    "path": 自定义图片所在的文件夹。文件夹必须在img文件夹里。默认是parallaxes(插件参数中可配置)
*
*    "loop": true/false
*            是否循环播放图片。
*
*    还有一些参数,需要开发人员对Sprite类, Bitmap类属性具有初步的认识:
*    (不过本人已将常用参数全部列在下方了,即便不懂脚本的小伙伴们应该也可以看懂)
*   
*    "smooth": true/false
*                   是否应用平滑缩放。
*
*    "blendMode": 图片的混合模式。默认是0(正常)。
*                        RMMV原生混合模式:0 -> 正常,1 -> 叠加,2 -> 正片叠底,3 -> 滤色
*
*    "opacity": 图片的不透明度。0-255间的一个数字。默认是255(完全不透明)。
*
*    "rotation": 图片的旋转角度(弧度)。数字 兀 在JS中是 Math.PI 。
*
*    "scale.x": 图片被横向缩放的倍数。默认是1(不放大)。可以是小数。
*                    如果是负数,图片就会被左右镜像翻转。
*
*    "scale.y": 图片被纵向缩放的倍数。默认是1(不放大)。可以是小数。
*                    如果是负数,图片就会被上下镜像翻转。
*
*    "visible": true/false
*                 图片是否可见。
*
*
*
*  == 2. 地图注释(高级) ==
*
* 上面模块讲的是地图注释的基本格式。这一模块将会讲到该插件的一些高级用法和提供的一些引用。
*
*
* 无限图层的设置在游玩时是即时动态更新的。
* 所以在地图注释中,可以调用$gameSwitches和$gameVariables等脚本的值来实时控制图片的状态。
*
* 例如:
*
* · 参数"visible"可以这样写:
*   "visible": "$gameSwitches.value(2)"
*   - 这表示由开关#2来实时控制图片的显示与隐藏。
*
* · 参数"rotation"可以这样写:
*   "rotation": "$gameVariables.value(1)*Math.PI"
*   - 这表示由变量#1来控制图片的旋转角度。变量#1最好是介于0到2的数字。
*
* 当然,以此类推,其他插件提供的脚本变量/开关也可以使用。
*
*
* 也许各位会觉得每次写$gameVariables, $gameSwitches什么的太麻烦了,还容易写错,
* 那么可以考虑使用插件作者提供的引用:s 和 v 来代替开关和变量。
*
* 仍以上面举过的两个例子为例:
*
* · 参数"visible"可以这样写:
*   "visible": "s.value(2)"
*   - 这表示由开关#2来实时控制图片的显示与隐藏。
*
* · 参数"rotation"可以这样写:
*   "rotation": "v.value(1)*Math.PI"
*   - 这表示由变量#1来控制图片的旋转角度。变量#1最好是介于0到2的数字。
*
* 除了 s, v 这两个引用之外,插件作者还提供了一个引用。
* 还记得前面提到的 this.rx(t) 吗?
* 其中的 t 也是一个引用。t 代表每帧都会自增(自己+1)的一个数字。初始值是0。
*
* 一个地图中可以添加多个注释。利用z层级来控制各图层的叠加情况,就可以非常灵活地制作视差地图了!
*
*
*
*   == 3. 例子 ==
*
   <ulds> {
     "name": "BlueSky",
     "x": "this.rx(t)",
     "y": 50,
     "z": 10.5,
     "loop": true,
     "scale.x": -1,
     "visible": "s.value(3)"
   } </ulds>
*   - 在地图中使用位于img/parallaxes/中的BlueSky.png图片。
*     该图片Z层级是10.5,在横向位置上以正常速度(1帧1像素)从左向右循环自滚动,在纵向位置上相对于屏幕的y坐标为50,图片被左右镜像反转,由开关#3控制显示和隐藏。
*
   <ulds> {
     "name": "Night",
     "path": "pictures",
     "x": "this.rx(48)",
     "y": "this.ry(48)",
     "z": 20,
     "visible": "s.value(5)",
     "scale.x": "v.value(2)",
     "scale.y": "v.value(2)",
     "blendMode": 2,
     "rotation": "Math.PI"
   } </ulds>
*   - 在地图中使用位于img/pictures/中的Night.png图片。
*     该图片Z层级是20,相对于地图的坐标为(48, 48),由开关#5控制显示和隐藏,
*     横纵向缩放的倍数是变量#2的值,混合模式是正片叠底,以图片左上角为锚点,旋转180°。
*
*
*
*  == 4. 设置碰撞体积 ==
*
* ULDS插件本身不提供碰撞体积功能。
*
* 默认情况下,在地图的图块组 A组 中随意寻找 可通行图块 和 不可通行图块 各一种,
* 然后根据所使用的图层直接在RMMV地图编辑器中绘制相应可通行/不可通行区域即可。
*
* 似乎也可以使用与该插件同作者的RegionPassage.js,用区域来设置相应可通行/不可通行区域。
*
* 如果有更为细微的需求(例如半格或不规则碰撞体积),也可以找找别的插件。
* 例如QM+CollisionMap.js及其前置插件QMovement.js,允许你进行像素级移动,
* 并通过检查一张图片的颜色来设定通行设置。
* 图片白色和透明部分是可通行的地方,其他颜色不可通行。
*
*
*
*  == 5. 技巧 ==
*
* 可以先稍微熟悉一下以上四个模块的内容,再来看这一模块。
*
*
*  = 关于相对地图远景 =
*
* 设想情景:玩家正行走在一处山峰中。山峰会随着玩家的走动而移动。
* 表现形式:距离镜头近的山峰移动速度快。距离镜头远的山峰(背景)移动速度慢。
* 核心问题:解决不同山峰贴图的不同移动速度问题。
* 解决方法:在原来注释的基础上,只给各个贴图相应的注释参数"x"和"y"值乘一个PARAM即可:
*          (比如如果贴图原先位于相对于地图的(0, 0)处,就做出如下改动:)
*             "x": "this.rx(0)*PARAM",
*             "y": "this.ry(0)*PARAM",
*          其中,PARAM 是一个数字。
*        - 对于 距离镜头近 的贴图:PARAM 最好是一个1以上的数字。
*          数字越大,贴图随玩家移动的速度越快,所演绎的贴图与镜头的距离就越近。
*          记得将z层级设为4以上。
*        - 对于 距离镜头远 的贴图:PARAM 最好是一个0到1之间的小数。
*          小数越小,贴图随玩家移动的速度越慢,所演绎的贴图与镜头的距离就越远。
*          记得将z层级设为3以下。
*
*
*  = 关于动态帧图层 =
*
* 设想情景:玩家走到一处风景宜人的桃源乡暂且歇脚。湖泊中流水潺潺,好一幅生机勃勃之景。
* 表现形式:用多帧图层来表现动态的湖水。
* 核心问题:如何按照指定帧数依次显示湖水的各个图层。
* 解决方法:假设图层相对于地图位于(144, 144),共有3帧(湖泊_1, 湖泊_2, 湖泊_3),
*          则创建以以下格式书写的地图注释:
          <ulds> {
               "name": "湖泊_1",
               "x": "this.rx(144)",
               "y": "this.ry(144)",
               "z": 1.5,
               "visible": "v.value(10) === 0"
          } </ulds>
            <ulds> {
               "name": "湖泊_2",
               "x": "this.rx(144)",
               "y": "this.ry(144)",
               "z": 1.5,
               "visible": "v.value(10) === 1"
          } </ulds>
            <ulds> {
               "name": "湖泊_3",
               "x": "this.rx(144)",
               "y": "this.ry(144)",
               "z": 1.5,
               "visible": "v.value(10) === 2"
          } </ulds>
*        在这个例子中,属性"visible"中的条件占用了变量#10。
*        如果想替换为别的变量,直接将所有出现的"10"替换为所使用的变量ID即可。
*        随后,在地图上创建一个并行处理的事件,内容如下:
*            ◆等待:n 帧
*            ◆变量操作:#0010 = 1
*            ◆等待:n 帧
*            ◆变量操作:#0010 = 2
*            ◆等待:n 帧
*            ◆变量操作:#0010 = 0
*        n 是图层的帧间隔。
*        这样应该就没什么问题了。
*
*
*  = 关于简易光源 = 2022-12-09更新
*
* 设想情景:玩家/跟随者/事件在黑暗中行走,只有柔和的光源相伴左右,营造出一种静谧的氛围。
*
* 注意,这一例子主要是讲解将图片绑定在玩家/跟随者/事件上的方法和介绍图片锚点属性。
* 这一部分所制作的光源一个地图只能使用一张,局限性非常大,如果有需求的话还是要使用插件。
* 不过通过将图片绑定在玩家/跟随者/事件上与动态帧图层方法结合起来,可以制作类似角色行走图特效等的效果。
*
* 0.光源图片的配置
*
* 这一部分所要用到的光源图片并非一张简单的有色光源图片,而是背景为纯黑色,只有中心部分镂空作为光源的一张图片。
* 图片的尺寸下限以游戏分辨率为准。一格默认为48像素x48像素,如果分辨率为17格x13格(816像素x624像素),那么图片的大小至少应当是(17x2-1)格x(13x2-1)格,即1584像素x1200像素。
* 在这一情况下,考虑到图片文件的大小,可以适当缩小图片,使用时设置"scale.x"和"scale.y"属性调整缩放值即可。
*
* 在此提供两张用于816x624分辨率下游戏的光源图片。使用时需要将"scale.x"和"scale.y"属性均设为2。建议将"opacity"设为225。
light_816x624.zip (13.19 KB, 下载次数: 60)
*
* 1.简易圆形光源 (烛光)
*
* 表现形式:以玩家/跟随者/事件为中心,周身环绕着圆形的光源。
* 核心问题:如何将圆形光源图片绑定在玩家/跟随者/事件身上。
* 解决方法:假设圆形光源图片名为 light.png ,为了将图片绑定到*玩家*身上,
*          则创建以以下格式书写的地图注释:
          <ulds> {
               "name": "light",
               "x": "this.rx(($gamePlayer._realX+1/2)*$gameMap.tileWidth())",
               "y": "this.ry(($gamePlayer._realY+1/2)*$gameMap.tileHeight())",
               "z": 5,
               "anchor.x": 0.5,
               "anchor.y": 0.5,
               "visible": "v.value(11) == 1"
          } </ulds>
*        将变量#11的值设为1时图片就会显现出来。
*
*        其中,"anchor.x"和"anchor.y"属性是指图片的锚点。锚点的位置将会影响图片的旋转和缩放效果。
*        锚点在左上角时"anchor.x"和"anchor.y"分别为0, 0,在中央时分别为0.5, 0.5,在右下角时分别为1, 1,以此类推。
*
*        ※如果想将光源图片绑定到*跟随者*上的话,就将"x""y"属性中的$gamePlayer替换成$gamePlayer.followers().visibleFollowers()[INDEX]。INDEX从零开始计数,第一个跟随者(地图上玩家身后的角色)索引是0。
*        ※如果想将光源图片绑定到*事件*上的话,就将"x""y"属性中的$gamePlayer替换成$gameMap.event(EVENT_ID)。EVENT_ID是事件ID。
*
* 2.简易手电筒
*
* 表现形式:手电筒的光源将会永远朝向玩家/跟随者/事件的正前方。
* 核心问题:如何让手电筒光源图片的旋转角度与玩家的朝向相关联。
* 解决方法:假设手电筒光源图片名为flashlight.png,图片中手电筒光源朝下,为了将图片绑定到*玩家*身上,
*          则创建以以下格式书写的地图注释:
          <ulds> {
               "name": "flashlight",
               "x": "this.rx(($gamePlayer._realX+1/2)*$gameMap.tileWidth())",
               "y": "this.ry(($gamePlayer._realY+1/2)*$gameMap.tileHeight())",
               "z": 5,
               "anchor.x": 0.5,
               "anchor.y": 0.5,
               "visible": "v.value(11) == 2",
               "rotation": "(function(){var obj = $gamePlayer;if(obj.direction()==2) return 0;if(obj.direction()==4) return 1/2*Math.PI;if(obj.direction()==8) return Math.PI;if(obj.direction()==6) return -1/2*Math.PI;})()"
          } </ulds>
*        将变量#11的值设为2时图片就会显现出来。
*
* 对于将手电筒光源图片绑定到跟随者/事件上的方法,参见 1.简易圆形光源 (烛光) 部分。记得将"rotation"属性值中的$gamePlayer也替换掉。
*
*
* = 关于淡入淡出 = 2023-07-27更新
*
* 1. 立即淡入淡出
*
* 设想情景:玩家甫一进入洋馆客房,房间墙壁和地毯上竟慢慢浮现出大块大块狰狞的暗褐色污渍。
* 表现形式:玩家进入地图时,血迹贴图渐渐由透明变为不透明(淡入)。
* 核心问题:如何使血迹贴图的不透明度随时间推移而增大。
* 解决方法:假设血液贴图的名称为 blood.png ,以图片左上角为锚点,贴图位于 (123, 456),需要在 1.5s 内显现,
*          则创建以以下格式书写的地图注释:
          <ulds> {
               "name": "blood",
               "x": "this.rx(123)",
               "y": "this.ry(456)",
               "z": 3.5,
               "opacity": "(function(){var duration=1.5;var f=duration*60;var val=255/f;if(t<f){return t*val;}else{return 255;}})()"
          } </ulds>
*        如果想自定义时长,可以将参数 opacity 中的变量 duration 的值从 1.5 改成别的数。
*
*        ※ 如果要表现玩家一进入洋馆客房,墙壁上狰狞的暗褐色污渍渐渐淡去(淡出),则创建以以下格式书写的地图注释:
          <ulds> {
               "name": "blood",
               "x": "this.rx(123)",
               "y": "this.ry(456)",
               "z": 3.5,
               "opacity": "(function(){var duration=1.5;var f=duration*60;var val=255/f;if(t<f){return 255-t*val;}else{return 0;}})()"
          } </ulds>
*        如果想自定义时长,可以将参数 opacity 中的变量 duration 的值从 1.5 改成别的数。
*
* 2. 与开关相联的淡入/淡出(仅能同时实现一种)
*
* 设想情景:玩家最终找到了真相,在幻象消失之际,怨魂渐渐现身。
* 表现形式:打开指定开关后,怨魂贴图渐渐由透明变为不透明(淡入)。
* 核心问题:如何在等到指定开关打开后,相关贴图的不透明度随时间推移而增大。
* 解决方法:假设怨魂贴图的名称为 phantom.png ,以图片左上角为锚点,贴图位于 (123, 456),需要在 1.5s 内消失,
*          则创建以以下格式书写的地图注释:
         <ulds> {
               "name": "phantom",
               "x": "this.rx(123)",
               "y": "this.ry(456)",
               "z": 3.5,
               "opacity": "(function(){var duration=1.5;var sId_show=20;var sId_prevent=21;var vId=13;var f=duration*60;var val=255/f;if(s.value(sId_show)){if(!v.value(vId)){v.setValue(vId, t);};var rt=t-v.value(vId);if(!s.value(sId_prevent)&&(rt<f)){return rt*val;}else{return 225;};}else{return 0;};})()"
          } </ulds>
*       !注意!这个注释占用了两个开关(#20, #21)和一个变量(#13)。
*       开关#20打开时,贴图就会慢慢显现。变量#13存储开关#20打开时 t 的值,用以与之后的 t 进行比较。开关#21是为了防止每次进入地图时贴图都会显现一次。
*       所以在执行淡入时,可以设置事件:
*         ◆开关操作:#0020 = ON
*         ◆等待:90帧
*         ◆开关操作:#0021 = ON
*         90帧 = 1.5s,即所设置的淡入时长。必须先打开用于显现图片的开关(#20),等待所设置的淡入时长后,再打开防止贴图重新显现的开关(#21)。
*       如果想再次执行淡入,在进入地图之前将两个开关关掉,再在进入地图后将两个开关按如上设置打开即可。
*       如果想自定义开关ID和变量ID,可以将参数 opacity 中的 sId_show 的值从 20 改成别的开关ID用以显示贴图,sId_prevent 用于防止贴图重新显现,vId 的值从 13 改为别的变量ID。
*       如果想自定义时长,可以将参数 opacity 中的变量 duration 的值从 1.5 改成别的数,单位秒。在事件中,记得打开两个开关之间等待的时长要和这里的值换算成帧数的最终结果相同。
*
*       ※ 如果要表现幻象渐渐消失,整个洋馆终于露出了它真实的样子(淡出),则创建以以下格式书写的地图注释:
          <ulds> {
               "name": "phantom",
               "x": "this.rx(123)",
               "y": "this.ry(456)",
               "z": 3.5,
               "opacity": "(function(){var duration=1.5;var sId_show=20;var sId_prevent=21;var vId=13;var f=duration*60;var val=255/f;if(s.value(sId_show)){if(!v.value(vId)){v.setValue(vId, t);};var rt=t-v.value(vId);if(!s.value(sId_prevent)&&(rt<f)){return 255-rt*val;}else{return 0;};}else{return 255;};})()"
          } </ulds>
*       !注意!这个注释占用了两个开关(#20, #21)和一个变量(#13)。
*       开关#20打开时,贴图就会慢慢消失。变量#13存储开关#20打开时 t 的值,用以与之后的 t 进行比较。开关#21是为了防止每次进入地图时贴图都会消失一次。
*       所以在执行淡出时,可以设置事件:
*         ◆开关操作:#0020 = ON
*         ◆等待:90帧
*         ◆开关操作:#0021 = ON
*         90帧 = 1.5s,即所设置的淡出时长。必须先打开用于淡出图片的开关(#20),等待所设置的淡出时长后,再打开防止贴图重新消失的开关(#21)。
*       如果想再次执行淡出,在进入地图之前将两个开关关掉,再在进入地图后将两个开关按如上设置打开即可。
*       如果想自定义开关ID和变量ID,可以将参数 opacity 中的 sId_show 的值从 20 改成别的开关ID用以淡出贴图,sId_prevent 用于防止贴图重新消失,vId 的值从 13 改为别的变量ID。
*       如果想自定义时长,可以将参数 opacity 中的变量 duration 的值从 1.5 改成别的数,单位秒。在事件中,记得打开两个开关之间等待的时长要和这里的值换算成帧数的最终结果相同。
*
* 3. 与开关相关联的自由淡入淡出(两种皆可实现)
*
* 设想情景:临近傍晚时分,街上的路灯一盏盏亮起;而至次日黎明,又会一盏盏暗去。
* 表现形式:打开用于淡入的开关后,路灯灯光贴图渐渐由透明变为不透明;打开用于淡出的开关后,路灯灯光贴图渐渐由不透明变为透明。
* 核心问题:如何将用于淡入的开关和用于淡出的开关同时绑定到灯光贴图上。
* 解决方法:假设路灯灯光贴图的名称为 streetlight.png,以图片左上角为锚点,贴图位于 (123, 456),淡入淡出时长为 1.5s,
* 则创建以以下格式书写的地图注释:
         <ulds> {
               "name": "streetlight",
               "x": "this.rx(123)",
               "y": "this.ry(456)",
               "z": 3.5,
               "opacity": "(function(){var duration=1.5;var init_opacity=0;var sId_show=4;var sId_hide=5;var sId_prevent=20;var vId_target=15;var vId_opacity=16;var f=duration*60;var val=255/f;if(!v.value(vId_opacity)){v.setValue(vId_opacity,0);}if(s.value(sId_show)){v.setValue(vId_target,255);}else if(s.value(sId_hide)){v.setValue(vId_target,0);}var result=v.value(vId_target)==255?Math.min(v.value(vId_target),v.value(vId_opacity)+val):Math.max(v.value(vId_target),v.value(vId_opacity)-val);if((s.value(sId_show)||s.value(sId_hide))&&s.value(sId_prevent)){result=v.value(vId_target);}v.setValue(vId_opacity,result);return result||init_opacity;})()"
          } </ulds>
*       !注意!这个注释占用了三个开关(#4, #5, #20)和两个变量(#15, #16)。
*       变量#15存储贴图的目标不透明度(0或255),变量#16存储贴图的当前不透明度,是动态变化的。这两个变量均只读。
*       开关#4是淡入贴图的开关,开关#5是淡出贴图的开关,开关#20是为了防止每次进入地图时贴图都会消失一次的开关。
*       在执行淡入时,可以设置事件:
*         ◆开关操作:#0020 防止每次淡入淡出 = OFF
*         ◆开关操作:#0005 开始淡出 = OFF
*         ◆开关操作:#0004 开始淡入 = ON
*         ◆等待:90帧
*         ◆开关操作:#0020 防止每次淡入淡出 = ON
*       在执行淡出时,可以设置事件:
*         ◆开关操作:#0020 防止每次淡入淡出 = OFF
*         ◆开关操作:#0004 开始淡入 = OFF
*         ◆开关操作:#0005 开始淡出 = ON
*         ◆等待:90帧
*         ◆开关操作:#0020 防止每次淡入淡出 = ON
*       90帧 = 1.5s,即所设置的淡入淡出时长。
*       注意,如果淡入淡出前没有关掉防止每次淡入淡出的开关#20,那么就无法淡入淡出。
*       在参数opacity的参数值中,sId_show 是淡入贴图的开关ID,sId_hide 是淡出贴图的开关ID,sId_prevent 是防止再次淡入淡出的开关ID,
*       vId_target 是存储贴图的目标不透明度的变量ID,vId_opacity 是存储贴图的当前不透明度的变量ID,
*       最开始的 duration 是淡入淡出时长,单位秒;init_opacity 是贴图的初始不透明度。
*
*
* = 关于遮罩房间 = 2023-08-04更新
*
* 设想情景:玩家只能看到自己当前所在的房间,其他房间在玩家看来一片漆黑。
* 表现形式:只有踩在特定ID的区域内,相应的房间贴图才会显示。
* 核心问题:如何将特定ID的区域与房间贴图的显隐相关联。
* 解决方法:创建以以下格式书写的地图注释:
         <ulds> {
                "name": "streetlight",
               "x": "this.rx(123)",
               "y": "this.ry(456)",
               "z": 3.5,
               "opacity": "(function(){var regionId=200;if($gamePlayer.regionId()==regionId){return true;}else{return false};})()"
          } </ulds>
        !注意!这个注释占用了区域#200。
        当玩家踩在区域#200上时,房间贴图才会显现,否则会消失。
        若想自定义区域ID,请设置 regionId 的值。
*
*       ※如果想在某个*跟随者*踩到特定ID的区域时显示房间贴图,就将"visible"属性中的$gamePlayer替换成$gamePlayer.followers().visibleFollowers()[INDEX]。INDEX从零开始计数,第一个跟随者(地图上玩家身后的角色)索引是0。
*       ※如果想在某个*事件*踩到特定ID的区域时显示房间贴图,就将"visible"属性中的$gamePlayer替换成$gameMap.event(EVENT_ID)。EVENT_ID是事件ID。
*
*
*
*/

如果想实现某种功能又不知从何下手的话可以回帖求助,我能帮得上忙的话,就会在主楼(这一层帖子)补充相关知识(技巧模块可能会持续更新)。大家的每一个问题、每一分解答都有助于完善该教程。
作者: 小怪兽奇奇侠    时间: 2022-4-24 23:51
真乃精品教程也!
作者: 时久之妖    时间: 2022-4-25 04:46
好耶!终于有教程了!
作者: play337    时间: 2022-4-25 09:54
很多人不知道楼主有多棒!
我帮楼主讲解一下!
无限图层外挂已经出来好几年了...
之所以明明很好用 结果却没有人再用 原因就是 连作者都不知道要怎麽用 没有说明 作者自己也说 他自己根本不会用
所以就无解了!
只能让想要试试看的人 盲目的去试验...
就拿我自己来说...
试成功了 固然很高兴 结果下一个功能又失败了.... 后来干脆用别的外挂取代就好了....
但是心里想 如果无限图层有教程就好了
好多年过去了
现在竟然有善心楼主出现了!
真的是太棒了!!!!!!!!!!!!!!!!!!!!!!!!!!!!
赞赞赞赞赞赞赞!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: 马铃薯条    时间: 2022-4-25 10:49
感谢分享,请问一下,我看ULDS网站上写着【* @target MZ】是说只能MZ用吗?MV可以使用吗?
作者: Rose_shadows    时间: 2022-4-25 10:58
本帖最后由 Rose_shadows 于 2022-4-25 11:00 编辑
马铃薯条 发表于 2022-4-25 10:49
感谢分享,请问一下,我看ULDS网站上写着【* @target MZ】是说只能MZ用吗?MV可以使用吗? ...


MV MZ通用。这篇教程就是基于MV测试出来的。
作者: huangjianxq    时间: 2022-4-25 11:10
B站上有大佬讲过基础的,但是没有这个这么详细大佬太棒了
作者: nie89    时间: 2022-4-25 14:47
太棒了哟!
作者: mollyko    时间: 2022-4-25 20:22
太棒了楼主
作者: ouo_lemon    时间: 2022-4-26 01:10
谢谢大佬的教程!
我这里有个问题,做动态帧我只有两帧 ,star1和star2,写了没有动起来是咋回事,麻烦太太有空帮我看下,谢谢qwq!!!
<ulds> {
"name": "star1",
"x": "this.rx(1)",
"y": "this.ry(1)",
"z": "-2",
"visible": "v.value(10) === 0"
} </ulds>



事件我写的是:
*            ◆等待:1 帧
*            ◆变量操作:#0010 = 1
*            ◆等待:1 帧
*            ◆变量操作:#0010 = 0

作者: ouo_lemon    时间: 2022-4-26 01:11
ouo_lemon 发表于 2022-4-26 01:10
谢谢大佬的教程!
我这里有个问题,做动态帧我只有两帧 ,star1和star2,写了没有动起来是咋回事,麻烦太太 ...

不好意思打错了,是这样的:

<ulds> {
"name": "star1",
"x": "this.rx(1)",
"y": "this.ry(1)",
"z": "-2",
"visible": "v.value(10) === 0"
} </ulds>

<ulds> {
"name": "star2",
"x": "this.rx(1)",
"y": "this.ry(1)",
"z": "-2",
"visible": "v.value(10) === 1"
} </ulds>


事件我写的是:
*            ◆等待:1 帧
*            ◆变量操作:#0010 = 1
*            ◆等待:1 帧
*            ◆变量操作:#0010 = 0
作者: ouo_lemon    时间: 2022-4-26 01:13
ouo_lemon 发表于 2022-4-26 01:11
不好意思打错了,是这样的:

{

我已经解决了,谢谢太太……太尴尬了 事件设置的按确定键开始 我改好了
作者: pillow鸽鸽    时间: 2022-5-10 22:00
我觉得应该让所有人看到这个
地图绘制的革命性突破
作者: 不安的传说    时间: 2022-5-11 12:36
太需要这样的文章,很多教程说了半天,什么都没说清楚
作者: 动漫二次元    时间: 2022-5-11 13:19
MZ插件在哪

作者: Rose_shadows    时间: 2022-5-11 16:37
动漫二次元 发表于 2022-5-11 13:19
MZ插件在哪

主楼第一行文字里的链接就是插件本体。插件MV和MZ通用。
作者: 动漫二次元    时间: 2022-5-13 11:29
在哪下载插件

作者: Rose_shadows    时间: 2022-5-13 17:54
本帖最后由 Rose_shadows 于 2022-5-13 18:23 编辑
动漫二次元 发表于 2022-5-13 11:29
在哪下载插件


点击链接,复制全文,将复制内容保存到记事本中,另存为.js格式文件。编码最好是utf-8。
这样应该就没什么问题了吧
作者: yxd5108    时间: 2022-6-11 13:59
楼主真是人才!在这里屈才了
作者: testevil    时间: 2022-6-12 08:24
谢谢楼主讲解
作者: syzygy    时间: 2022-6-13 13:30
太感谢楼主了!!!
作者: blackxzy    时间: 2022-6-24 15:07
多谢大佬的教程~~~
作者: Odeli    时间: 2022-6-27 09:26
谢谢大佬的教程,终于学fei了
作者: elewing1009    时间: 2022-10-11 17:06
先留个脚
作者: 墨痕随烟    时间: 2022-11-3 08:19
太棒了,谢谢大佬
作者: huangjianxq    时间: 2022-11-10 12:59
直呼牛逼
作者: 自由金    时间: 2022-12-3 21:40
楼主求教!!!!
我在使用了"blendMode": 的格式后就变成了这样!(有带这种格式的图像都消失了…………其他没带的可以正常看见)
请问我该怎么做————!!!๐·°(৹˃̵﹏˂̵৹)°·๐
(悲伤)

Q1.jpg (1.77 MB, 下载次数: 8)

Q1.jpg

作者: Rose_shadows    时间: 2022-12-4 10:30
自由金 发表于 2022-12-3 21:40
楼主求教!!!!
我在使用了"blendMode": 的格式后就变成了这样!(有带这种格式的图像都消失了…………其 ...

"loop": true  那一行后面少了个英文逗号。
作者: 自由金    时间: 2022-12-5 00:04
Rose_shadows 发表于 2022-12-4 10:30
"loop": true  那一行后面少了个英文逗号。

解决了!!!!!!!!非常感谢!!!!!!!!!
作者: Rose_shadows    时间: 2022-12-9 18:09
更新了主楼,新增以下内容:
1. 增加了技巧模块的“关于简易光源”部分;
2. 新增自做的简易ULDS范例。不过范例中暂时没有关于相对地图远景和动态帧图层的演示。
有问题的话欢迎留言。
作者: chiym    时间: 2022-12-16 01:14
大佬厉害了!学习!
作者: jienluck    时间: 2023-1-15 16:24
太棒了 萌新受教
作者: 深渊笛笛    时间: 2023-2-7 13:10
太感谢楼主了,终于弄明白了

作者: leliel    时间: 2023-2-7 14:50
多谢大佬测试和分享
作者: xuechen19940302    时间: 2023-3-13 16:38
大佬大佬 是这样的 我是mz版本 我用这个插件会有个不显示图片的问题。我尝试复制了其他人的注释,也重新开了一个新的项目测试,图片就是不显示。
作者: testevil    时间: 2023-3-14 07:22
多谢大佬!
作者: 微风晚院    时间: 2023-3-18 07:57
新手找了一晚上的缩放背景图的方法,蓦然回首,原来这个插件一直有,帮大忙了!
作者: Rose_shadows    时间: 2023-5-21 18:13
ULDS简易范例更新至v2.00,更新内容如下:
1. 新增视差滚动 (相对地图远景) 和动态帧图层范例;
2. 将无限图层插件帮助文档内容与本帖同步;
3. 更新了 ReadMe 自述文件,确认了无限图层插件与最新版 MV 和 MZ 的兼容性。
作者: yxremaen    时间: 2023-6-29 17:28
本帖最后由 yxremaen 于 2023-6-29 17:44 编辑

大佬,想请教下 "opacity"这个指令,能否设置成随帧数t透明度逐渐加深?我想要做一个黑暗中道路慢慢显现出来的效果,但是设置图层帧显得很生硬,不知能否用ulds来实现
作者: Rose_shadows    时间: 2023-6-30 20:05
本帖最后由 Rose_shadows 于 2023-6-30 20:07 编辑
yxremaen 发表于 2023-6-29 17:28
大佬,想请教下 "opacity"这个指令,能否设置成随帧数t透明度逐渐加深?我想要做一个黑暗中道路慢慢显现出 ...


可以试试:
opacity: "(function(){var duration=1;var f=duration*60;var val=255/f;if(t<f){return t*val;}else{return 255;}})()"
表示的是图片在 1s 内慢慢显现。
如果想自定义时长,可以设置变量 duration 的值。
手边没有电脑,没法测试,不过应该能用。
作者: Rose_shadows    时间: 2023-7-8 12:56
更新了主楼,新增以下内容:
1. 根据第39楼 @yxremaen 的问题,增加了技巧模块的“关于淡入淡出”部分。
有问题的话欢迎留言。
作者: 走出300加    时间: 2023-7-8 13:03
真乃精品教程也!
作者: yxremaen    时间: 2023-7-9 03:03
感谢大佬的指导,看到大佬还如此细致地出补充内容,让我的思路又拓宽了!
作者: li19910808    时间: 2023-7-10 23:32
大佬,我复制了你的关于开关淡入淡出的注释,把图片换成自己的素材进行使用。发现素材是绑定玩家视角的,会跟着玩家视角走,如何调整固定在地图上呢?我打算用做城市的灯光光效的昼夜渐变。已经准备好了城市的光效图了。
作者: li19910808    时间: 2023-7-10 23:38
li19910808 发表于 2023-7-10 23:32
大佬,我复制了你的关于开关淡入淡出的注释,把图片换成自己的素材进行使用。发现素材是绑定玩家视角的,会 ...

而且,按教程说明里面,换成 this rx()格式的,图片就不是渐变的,直接替换上来了。
作者: Rose_shadows    时间: 2023-7-12 11:43
li19910808 发表于 2023-7-10 23:38
而且,按教程说明里面,换成 this rx()格式的,图片就不是渐变的,直接替换上来了。 ...

嗯……如果图片立即显现出来,可能是因为事件中开启两个开关之间没有等待,和是否使用 this.rx() 没有什么关系。

你可以试试我的项目数据(新建一个项目后将解压的文件替换进去):
演示数据
作者: li19910808    时间: 2023-7-25 23:00
Rose_shadows 发表于 2023-7-12 11:43
嗯……如果图片立即显现出来,可能是因为事件中开启两个开关之间没有等待,和是否使用 this.rx() 没有什 ...

感谢大佬的回复跟测试文件,我新建项目测试了下,渐变出现是没问题的,但是人物一旦远离启动渐变的开关,背景的森林就会自动消失,靠近了又再次出现了。
还有个疑问,因为我是用了MOG的昼夜系统,之前设定也是用大佬你的注释配合开关跟昼夜系统的开关绑定了,从而做到图片伴随着昼夜进行渐变切换。教程里面的光效图片的淡入,跟淡出,需要两套相反功能的注释,与之配套的是不是需要6个开关,分两组?而且如果图片已经淡入,需要淡出,除了开启淡出的开关外,是否需要同步关闭淡入的开关,以备下次时间循环开关开启时候,淡入开关可以正常开启?
作者: play337    时间: 2023-7-26 11:59
本帖最后由 play337 于 2023-7-26 12:10 编辑

太强大了!

您的那个:2023-05-21 ULDS简易范例更新至v2.00

可以再增加更多范例吗? 帮助扩充思维~ ^_^ ~
=============================================
我是用ULDS外挂实现的动态帧水潭哦。
相关事件位于地图的最[右上角],可以在编辑器中看看。
: 应该是[左上角]吧~

>_<
作者: Rose_shadows    时间: 2023-7-27 18:28
本帖最后由 Rose_shadows 于 2023-8-4 10:49 编辑

更新了主楼,新增以下内容:
1. 更新“关于淡入淡出”部分第3个小技巧:与开关相关联的自由淡入淡出(两种皆可实现)
相关范例仍在制作中,如果等不及可以先试一试这个范例,希望对你的问题有帮助@li19910808
有问题的话欢迎留言。
作者: Rose_shadows    时间: 2023-8-4 10:46
更新了主楼,新增以下内容:
1. 增加了技巧模块的“关于遮罩房间”部分;
2. ULDS范例更新至v3.00,新增自由淡入淡出和遮罩房间范例,修复了Bug并进一步完善了内容,将无限图层插件帮助文档内容与本帖同步。
有问题的话欢迎留言。
作者: 妾而君亦然    时间: 2023-8-4 17:07
点赞点赞大拇指大拇指 爱心
作者: li19910808    时间: 2023-8-8 00:51
Rose_shadows 发表于 2023-7-12 11:43
嗯……如果图片立即显现出来,可能是因为事件中开启两个开关之间没有等待,和是否使用 this.rx() 没有什 ...

按着最新提供的那个淡入淡出的注释使用了,自己的素材文件,替换测试用的教程文件也下载了试过,都正常,但是注释诺到自己的游戏工程文件里面就是死活跑不起来。插件都换成了大佬教程文件里面的。。。感觉到死胡同了。
作者: li19910808    时间: 2023-8-8 13:50
li19910808 发表于 2023-8-8 00:51
按着最新提供的那个淡入淡出的注释使用了,自己的素材文件,替换测试用的教程文件也下载了试过, ...

<ulds> {
               "name": "guoxiao",
               "x": "this.rx(123)",
               "y": "this.ry(456)",
               "z": 3.5,
               "opacity": "(function(){var duration=1.5;var init_opacity=0;var sId_show=65;var sId_hide=66;var sId_prevent=67;var vId_target=64;var vId_opacity=63;var f=duration*60;var val=255/f;if(!v.value(vId_opacity)){v.setValue(vId_opacity,0);}if(s.value(sId_show)){v.setValue(vId_target,255);}else if(s.value(sId_hide)){v.setValue(vId_target,0);}var result=v.value(vId_target)==255?Math.min(v.value(vId_target),v.value(vId_opacity)+val):Math.max(v.value(vId_target),v.value(vId_opacity)-val);if((s.value(sId_show)||s.value(sId_hide))&&s.value(sId_prevent)){result=v.value(vId_target);}v.setValue(vId_opacity,result);return result||init_opacity;})()"
          } </ulds>
作者: li19910808    时间: 2023-8-8 20:17
Rose_shadows 发表于 2023-7-27 18:28
更新了主楼,新增以下内容:
1. 更新“关于淡入淡出”部分第3个小技巧:与开关相关联的自由淡入淡出(两种皆 ...

感谢大佬的辛苦,我参考了你的关于最新版本淡入淡出的注释命令,因为我的初期1-50多的开关命令都已经因为剧情占用了,所以都是用60多编号的开关进行设置,但是注释无法运行,大佬的工程样板我也下载了。我只是把触发开关进行了替换,如下图

<ulds> {
               "name": "guoxiao",
               "x": "this.rx(0)",
               "y": "this.ry(0)",
               "z": 3.5,
               "opacity": "(function(){var duration=1.5;var init_opacity=0;var sId_show=65;var sId_hide=66;var sId_prevent=67;var vId_target=64;var vId_opacity=63;var f=duration*60;var val=255/f;if(!v.value(vId_opacity)){v.setValue(vId_opacity,0);}if(s.value(sId_show)){v.setValue(vId_target,255);}else if(s.value(sId_hide)){v.setValue(vId_target,0);}var result=v.value(vId_target)==255?Math.min(v.value(vId_target),v.value(vId_opacity)+val):Math.max(v.value(vId_target),v.value(vId_opacity)-val);if((s.value(sId_show)||s.value(sId_hide))&&s.value(sId_prevent)){result=v.value(vId_target);}v.setValue(vId_opacity,result);return result||init_opacity;})()"
          } </ulds>
作者: ~谓伊~    时间: 2023-8-9 00:05
感谢分享
作者: li19910808    时间: 2023-10-5 22:03
大佬,有个关于循环图片的开关的问题,不知道是不是插件冲突,还是指令问题,
"visible": "s.value( )"指令跟循环图片"loop": true, 指令不能一起用,一起用,图片就不显示了。

我自己的指令如下,

<ulds> {
"name": "瘴气",
"x": "this.rx(0.25*t)",
"y": "this.ry(1)",
"z": "4.1",
"loop": true
} </ulds>

这个指令的图层可以正常循环,如果不用负责控制显示的"visible": "s.value( )指令的话,如果用"visible": "s.value( )指令,只能控制没有 "loop": true, 指令的静态图片的显示与否,是什么问题呢?
作者: Rose_shadows    时间: 2023-10-6 13:29
li19910808 发表于 2023-10-5 22:03
大佬,有个关于循环图片的开关的问题,不知道是不是插件冲突,还是指令问题,
"visible": "s.val ...

我这边试了一下,是可以运行的。
是不是loop属性后面少了英文逗号?

我是这样写的:
<ulds>{
  "name":"01_Mist",
  "x":"t*0.5",
  "y":0,
  "z":5,
  "loop":true,
  "visible":"s.value(13)"
}</ulds>
作者: 飞天老兲    时间: 2023-11-2 20:08
冒昧问一下,这个插件可以叠加角色行走图吗?
我做的RPG游戏里面,使用同一种武器(《鬼灭之刃》的日轮刀)的角色/NPC很多,我希望不用每一个行走图都做一个手持武器差分,
而是通过图层叠加的方式完成武器装备
作者: 带火星的木条    时间: 2023-12-19 00:10
打扰了,使用这个插件制作了树木图层,在同一套参数的情况下,816×624分辨率的地图没问题,换成1200×912分辨率的地图后,树木图层就变成跟着玩家走了。树木图层的分辨率和对应地图的分辨率检查过了都是匹配的,想问一下这种情况是怎么造成的啊
  1. <ulds> {
  2. "name": "05 cunzhong tree",
  3. "x": "this.rx(1)",
  4. "y": "this.rx(1)",
  5. "z": 15,
  6. "loop": false
  7. } </ulds>
复制代码

作者: 带火星的木条    时间: 2023-12-19 10:56
带火星的木条 发表于 2023-12-19 00:10
打扰了,使用这个插件制作了树木图层,在同一套参数的情况下,816×624分辨率的地图没问题,换成1200×912 ...

非常感谢!!终于解决了!
作者: 人偶师与机器人    时间: 2024-4-15 00:54
麻烦问一下,想做成进入遮罩房间后显示npc, 并且npc可以在遮罩房间和走廊之间来回移动,应该怎么做呢?
作者: Rose_shadows    时间: 2024-4-15 14:15
人偶师与机器人 发表于 2024-4-15 00:54
麻烦问一下,想做成进入遮罩房间后显示npc, 并且npc可以在遮罩房间和走廊之间来回移动,应该怎么做呢? ...

可以转换一下思路,底下铺上一整块房间+走廊的地图,然后用黑色遮罩图片遮住各个房间就行。玩家踩到哪个区域就隐藏哪个区域的黑色遮罩。遮罩的visible可以这样写:

"visible": "(function(){var regionId = 200; if($gamePlayer.regionId()===regionId){return false;}else{return true;}})()"

表示当玩家踩到区域#200时遮罩隐藏。




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