设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 12984|回复: 31
打印 上一主题 下一主题

[原创发布] 【移植】【ULDS】无限图层显示系统 for XP Ver 2.16

[复制链接]

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

跳转到指定楼层
1
发表于 2014-11-9 10:01:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 RyanBern 于 2017-10-3 10:37 编辑

ULDS (Unlimited Layers Display System) 这个名字在 P1 可谓是如雷贯耳,按照最新的改版观点,这是一个“能够改变 RMVA 游戏制作导向”的脚本。ULDS 的强大之处不必多说,懂的人自然懂。有些人问了这脚本能不能有 XP 版,有 VX 版,我们的高冷 taroxd 已经明确表示了:不会。此外,就我个人看来,RMXP 强大的图层编辑系统已经能够满足绝大多数人们的编辑需求,因此 ULDS 似乎不是很必要。

不过啊,既然发在这里了,我觉得肯定有人问我:那你做出来的这玩意,有啥用?这个问题……似乎很难回答。但是我可以告诉你另外一个故事:原版 ULDS 刚发布的时候,其作者 taroxd 也并不知道它有啥用。所以,谁知道呢?

脚本和范例都放在下面了,我不生产 ULDS,我只是一个 VA -> XP 的搬运工。范例的话比较丑,用的是原版范例素材和一个很愚蠢的截图。如果各位美工醋们能做出来更好的范例请一定要告诉我。用法和 VA 的 ULDS 有一些不同,因此使用之前请仔细阅读说明再做改动。

第一版序



RUBY 代码复制
  1. #----------------------------------------------------------------------------
  2. # ● 无限图层显示系统 Unlimited Layers Display System By Taroxd
  3. #   XP 移植 By RyanBern
  4. #----------------------------------------------------------------------------
  5. #
  6. #  使用方法:导入此脚本后,在游戏主目录新建一个名为 ULDS_Data 的文件夹,然后
  7. #            新建 txt 文本文件 ULDS000.txt,其中 000 请替换成真正的地图 ID。
  8. #            此后在此 txt 文件里面加入如下内容。
  9. #
  10. #  注意:保存 txt 文件请务必使用 UTF-8 编码,否则其中的中文不会被正常识别。
  11. #        如果文件名里面没有中文则无影响。
  12. #
  13. #  另:本脚本会尝试和原版 ULDS 保持一致,固不再单独写出版本号。
  14. #
  15. #  <ulds=filename>
  16. #    x: X坐标
  17. #      公式,默认为 0
  18. #    y: Y坐标
  19. #      公式,默认为 0
  20. #    z: Z坐标
  21. #      公式,只计算一次,默认为 10,可以设置为 -100 来当作远景图使用
  22. #    zoom: 缩放倍率
  23. #      公式,默认为 1。缩放的原点为画面左上角。
  24. #    zoom_x: 横向缩放倍率
  25. #      公式,默认为 zoom
  26. #    zoom_y: 纵向缩放倍率
  27. #      公式,默认为 zoom
  28. #    opacity: 不透明度
  29. #      公式,默认为 255
  30. #    blend_type: 合成方式
  31. #      公式,只计算一次。默认为 0 (0:正常、1:加法、2:减法)
  32. #    scroll: 图像跟随地图卷动的速度
  33. #      实数,默认为 32
  34. #    scroll_x: 图像跟随地图横向卷动的速度
  35. #      实数,默认为 scroll
  36. #    scroll_y:图像跟随地图纵向卷动的速度
  37. #      实数,默认为 scroll
  38. #    loop: 循环
  39. #      冒号后面不需要填写任何东西。
  40. #    visible: 图像是否显示
  41. #      公式,默认为 true
  42. #    path: 图像的路径名
  43. #      默认为 Parallaxes
  44. #    color: 合成的颜色
  45. #      公式,只计算一次。默认为 Color.new(0, 0, 0, 0)
  46. #    tone: 色调
  47. #      公式,只计算一次。默认为 Tone.new(0, 0, 0, 0)
  48. #    eval: 初始化后,以 sprite 或 plane 为 self 执行的代码。
  49. #      公式,默认为空
  50. #    update: 图片显示时,每帧执行的更新代码
  51. #      公式,默认为 t += 1
  52. #    dispose: 图片释放前执行的代码
  53. #      公式,默认为空
  54. #  </ulds>
  55. #
  56. #  其中 filename 是图片文件名(无需扩展名),放入 Pictures 文件夹内
  57. #  这个文件夹可以通过 path 设置更改
  58. #
  59. #  在 <ulds=filename> 和 </ulds> 中间的部分均为选填。不填则自动设为默认值。
  60. #  每一个设置项只能写一行。
  61. #  每一行只能写一个设置项。
  62. #  一般来说,正常使用时大部分都是不需要设置的。
  63. #
  64. #  设置项目中的“公式”表示,这一个设置项可以像技能的伤害公式一样填写。
  65. #  “只计算一次”表示,该公式只会在刚刚进入地图时计算一次,之后不会更新。
  66. #  可用 t 表示当前已经显示的帧数,s[n], v[n] 分别表示 n 号开关和 n 号变量。
  67. #  width 表示图片宽度,height 表示图片高度。
  68. #
  69. #  例:
  70. #   <ulds=BlueSky>
  71. #     x: t
  72. #     scroll_x: 16
  73. #     scroll_y: 64
  74. #     loop:
  75. #   </ulds>
  76. #
  77. #  需要多行公式时,可以重复备注。
  78. #  例:
  79. #   <ulds=Slime>
  80. #     path: Battlers
  81. #     x: width / 2
  82. #     y: height / 2
  83. #     eval: self.ox = width / 2
  84. #     eval: self.oy = height / 2
  85. #     eval: self.angle = 180
  86. #   </ulds>
  87. #
  88. #----------------------------------------------------------------------------
  89. #  z 坐标详解:
  90. #    ulds 图层的坐标和地图画面的三个视口(Viewport)是独立的,具体设定如下
  91. #      【0】最低图块层、在普通角色下方
  92. #      【1~200】在地图所有内容的上方(包括远景图,任意优先度的图块,角色图,雾图形)
  93. #      【201~3000】在【显示图片】所产生的图片上方
  94. #      【>3000】在【画面闪烁】效果的上方
  95. #    目前暂不支持在地图内容上的分割(例如不能设置为在角色上方而在雾图形下方),
  96. #    如果有需求可考虑添加。
  97. #----------------------------------------------------------------------------
  98. #  更新记录:
  99. #   2014.07.10 Ver1.01: 修正了 zoom、zoom_y 会报错的问题
  100. #   2014.07.11 Ver1.02: 修正了切换图块组之后失效的问题
  101. #   2014.08.14 Ver1.1:  增加了 speed_x, speed_y 的设置
  102. #   2014.08.16 Ver1.2:  fix 设定更改为 scroll
  103. #   2014.08.29 Ver1.21: 修正了坐标误差
  104. #   2014.09.19 Ver1.22: 修正了远景图与图层使用相同文件时报错的问题
  105. #   2014.09.25 Ver2.0:  属性可以用公式进行设置了;其他细节改进
  106. #   2014.09.26 Ver2.01: 增加了 path、update 的设置
  107. #   2015.01.02 Ver2.1:  增加了 init、color、tone 的设置;其他细节改进
  108. #   2015.01.03 Ver2.11: 修复了 zoom 属性会导致坐标误差的问题
  109. #   2015.02.02 Ver2.12: 支持多行备注和公式中的 width 和 height;其他细节改进
  110. #   2015.07.04 Ver2.13: 修复了循环时可能不会更新的问题
  111. #   2017.03.22 Ver2.15: 允许文件名为空,即备注 <ulds></ulds>
  112. #   2017.05.10 Ver2.16: 增加了 dispose 设置
  113. #----------------------------------------------------------------------------
  114.  
  115. module Taroxd; end
  116.  
  117. module Taroxd::ULDS
  118.  
  119.   DEFAULT_PATH = 'Pictures'                    # 图片文件的默认路径
  120.   DEFAULT_Z = 10                                 # 默认的 z 值
  121.   RE_OUTER = /<ulds[= ]?(.*?)>(.*?)<\/ulds>/mi  # 读取备注用的正则表达式
  122.   RE_INNER = /(\w+) *: *(.*)/                    # 读取设置用的正则表达式
  123.   MAPDATA_PREFIX = 'ULDS_Data'
  124.  
  125.   module Base
  126.     include Math
  127.  
  128.     attr_accessor :scroll_x, :scroll_y
  129.  
  130.     def dispose
  131.       bitmap.dispose
  132.       super
  133.     end
  134.  
  135.     def adjust_x
  136.       1.0 * @scroll_x * $game_map.display_x / 128
  137.       #return x if @scroll_x.abs < Float::EPSILON
  138.       #$game_map.display_x / (128.0 / @scroll_x)
  139.       #$game_map.adjust_x(1.0 * x / @scroll_x) * @scroll_x
  140.     end
  141.  
  142.     def adjust_y
  143.       1.0 * @scroll_y * $game_map.display_y / 128
  144.       #return y if @scroll_y.abs < Float::EPSILON
  145.       #$game_map.display_y / (128.0 / @scroll_y)
  146.       #$game_map.adjust_y(1.0 * y / @scroll_y) * @scroll_y
  147.     end
  148.   end
  149.  
  150.   class Sprite < ::Sprite
  151.     include Base
  152.  
  153.     def x=(x)
  154.       self.ox = adjust_x
  155.       super
  156.       #super(-adjust_x(x))
  157.     end
  158.  
  159.     def y=(y)
  160.       self.oy = adjust_y
  161.       super
  162.       #super(-adjust_y(y))
  163.     end
  164.   end
  165.  
  166.   class Plane < ::Plane
  167.     include Base
  168.  
  169.     attr_reader :visible
  170.  
  171.     def initialize(_)
  172.       super
  173.       @visible = true
  174.     end
  175.  
  176.     def x=(x)
  177.       self.ox = adjust_x + x
  178.     end
  179.  
  180.     def y=(y)
  181.       self.oy = adjust_y + y
  182.     end
  183.  
  184.     def visible=(visible)
  185.       super
  186.       @visible = visible
  187.     end
  188.  
  189.     def width
  190.       bitmap.width
  191.     end
  192.  
  193.     def height
  194.       bitmap.height
  195.     end
  196.   end
  197.  
  198.   class << self
  199.  
  200.     # 从备注中读取设置,并生成数组
  201.     def from_note(note, viewport)
  202.       note.scan(RE_OUTER).map do |name, contents|
  203.         settings = {nil => name}
  204.         contents.scan(RE_INNER) do |key, value|
  205.           (settings[key] ||= '') << value << "\n"
  206.         end
  207.         new(settings, viewport)
  208.       end
  209.     end
  210.  
  211.     # 返回一个 ULDS::Sprite 或 ULDS::Plane 的实例
  212.     def new(settings, viewport)
  213.       @settings = settings
  214.       container(viewport)
  215.     end
  216.  
  217.     private
  218.  
  219.     def container(viewport)
  220.       container = (extract('loop') ? Plane : Sprite).new(viewport)
  221.       container.bitmap = make_bitmap
  222.       container.instance_eval(init_container_code, __FILE__, __LINE__)
  223.       container
  224.     end
  225.  
  226.     # 在一个 sprite 或 plane 的上下文中执行的代码。
  227.     # 如果难以理解,请尝试输出这段代码来查看。
  228.     def init_container_code
  229.       "#{binding_code}
  230.       #{init_attr_code}
  231.       #{define_update_code}
  232.       #{define_dispose_code}
  233.       #{extract 'eval'}"
  234.     end
  235.  
  236.     # 定义变量的代码
  237.     def binding_code
  238.       's = $game_switches
  239.       v = $game_variables
  240.       t = 0'
  241.     end
  242.  
  243.     # 只计算一次的初始化代码
  244.     def init_attr_code
  245.       "#{set_attr_code 'z', DEFAULT_Z}
  246.       #{set_attr_code 'scroll_x', 32}
  247.       #{set_attr_code 'scroll_y', 32}
  248.       #{set_attr_code 'blend_type'}
  249.       #{set_attr_code 'color'}
  250.       #{set_attr_code 'tone'}"
  251.     end
  252.  
  253.     # 更新的代码
  254.     def define_update_code
  255.       %{
  256.         define_singleton_method :update do
  257.           #{set_attr_code 'visible'}
  258.           return unless visible
  259.           #{set_attr_code 'zoom_x'}
  260.           #{set_attr_code 'zoom_y'}
  261.           #{set_attr_code 'opacity'}
  262.           #{set_attr_code 'x', 0}
  263.           #{set_attr_code 'y', 0}
  264.           #{set_t_code}
  265.         end
  266.       }
  267.     end
  268.  
  269.     def define_dispose_code
  270.       code = extract('dispose')
  271.       !code ? "" : %{
  272.         define_singleton_method :dispose do
  273.           #{code}
  274.           super()
  275.         end
  276.       }
  277.     end
  278.  
  279.     # 设置属性的代码
  280.     def set_attr_code(key, default = nil)
  281.       formula = extract(key, default)
  282.       formula && "self.#{key} = (#{formula})"
  283.     end
  284.  
  285.     # 设置时间的代码
  286.     def set_t_code
  287.       extract('update', 't += 1')
  288.     end
  289.  
  290.     # 获得位图
  291.     def make_bitmap
  292.       basename = extract(nil)
  293.       if !basename.empty?
  294.         folder_name = "Graphics/#{extract('path', DEFAULT_PATH).chomp}"
  295.         Bitmap.new("#{folder_name}/#{basename}")
  296.       else
  297.         nil
  298.       end
  299.     end
  300.  
  301.     # 获取备注中的设定值
  302.     def extract(key, default = nil)
  303.       @settings[key] || /(.+)_[xy]\Z/ =~ key && @settings[$1] || default
  304.     end
  305.   end
  306. end
  307.  
  308. class Game_Map
  309.  
  310.   def note
  311.     filename = sprintf("%s/ULDS%03d.txt", Taroxd::ULDS::MAPDATA_PREFIX, @map_id)
  312.     if File.exist?(filename)
  313.       File.open(filename) do |f|
  314.         return f.read
  315.       end
  316.     else
  317.       return ""
  318.     end
  319.   end
  320. end
  321.  
  322. class Spriteset_Map
  323.  
  324.   def create_ulds
  325.     @ulds = Taroxd::ULDS.from_note($game_map.note, nil)
  326.     @ulds_map_id = $game_map.map_id
  327.   end
  328.  
  329.   def refresh_ulds
  330.     dispose_ulds
  331.     create_ulds
  332.   end
  333.  
  334.   def update_ulds
  335.     refresh_ulds if @ulds_map_id != $game_map.map_id
  336.     @ulds.each {|u| u.update}
  337.   end
  338.  
  339.   def dispose_ulds
  340.     @ulds.each {|u| u.dispose}
  341.   end
  342.  
  343.   # 导入 -- 没有 taroxd 那么醋的我只好瑟瑟发抖地 alias
  344.   alias rb_initialize_ulds initialize
  345.   def initialize
  346.     create_ulds
  347.     rb_initialize_ulds
  348.   end
  349.  
  350.   alias rb_update_ulds update
  351.   def update
  352.     update_ulds
  353.     rb_update_ulds
  354.   end
  355.  
  356.   alias rb_dispose_ulds dispose
  357.   def dispose
  358.     dispose_ulds
  359.     rb_dispose_ulds
  360.   end
  361.  
  362. end
  363.  
  364. # XP does not have define_singleton_method, then define it manually
  365. class Object
  366.   def define_singleton_method(sym, &block)
  367.     class << self; self; end.send(:define_method, sym, &block)
  368.   end
  369. end

ULDS-XP-2.16.7z (4.71 MB, 下载次数: 801)    

评分

参与人数 8星屑 +665 收起 理由
斜眼君 + 120 我很赞同
断电 + 100 塞糖
你最珍贵 + 60 塞糖
zmz6668 + 15 精品文章
VIPArcher + 40 塞糖
taroxd + 260 塞糖
进击の虎叔 + 45
chd114 + 25 移植Banzai

查看全部评分

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

2
发表于 2014-11-9 10:07:48 | 只看该作者
移植累的话就重写好了……

那段生成的代码确实难以理解,不过其实把代码p出来就可以了

要写公式就躲不开 eval 的说……

点评

每张地图的设置都不一样啊,用常量岂不是很啰嗦?  发表于 2014-11-28 21:00
说起来为什么不直接用常量呢,还省得读取了= =  发表于 2014-11-28 20:58
XP地图没备注所以我就转战txt了,然后顺便把XP区那个问题也搞清了……向下移植还是很有意思的  发表于 2014-11-9 10:10
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

3
发表于 2014-11-9 10:37:32 | 只看该作者
这两张效果图哪一张是无限图层的哪一张是默认的···

点评

呃··编辑器地图从123变成了456?  发表于 2014-11-9 12:44
不是,要是采用远景图作为地图的话,编辑器地图就不用了。如果不是,而是需要第4层图层,第5层,第6层,那么编辑器的地图仍然有用。  发表于 2014-11-9 12:32
···意思是编辑器的地图几乎废掉了吗···  发表于 2014-11-9 12:20
这个地图是原版VA的ULDS范例地图,自然翻不到。这里值得说的是,地图的显示完全没有依赖原有数据库图层  发表于 2014-11-9 12:03
你还是放一个原版的效果做个对比吧···这个地图的素材我没翻到···  发表于 2014-11-9 11:50
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

路路 该用户已被删除
4
发表于 2014-11-9 11:13:35 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

故九江太守

梦石
0
星屑
612
在线时间
2167 小时
注册时间
2012-12-5
帖子
4464
5
发表于 2014-11-9 11:18:16 | 只看该作者
{:2_271:}就是不能再编辑器里看

点评

范例中的是模仿双远景地图的效果,如果单单是想给地图加上一个光照效果一个阴影效果什么的,ULDS就能很好发挥作用  发表于 2014-11-9 19:20
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

6
发表于 2014-11-9 11:29:29 | 只看该作者
要保持一致的话或许可以这样(XP应该还是有 define_method 的吧……)
RUBY 代码复制
  1. def define_singleton_method(sym, &block)
  2.   class << self; self; end.send(:define_method, sym, &block)
  3. end

点评

define_method不知道,define_singleton_method铁定没有,XP神烦  发表于 2014-11-9 11:39
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

7
发表于 2014-11-9 19:59:39 | 只看该作者
这是显示太阳光的功能?

点评

不单单是这样,实际上就是在地图上面添加更多的图层,比如你同时要阴影 光照 雾效果,用XD的一句话,ULDS的功能还可以更强大。  发表于 2014-11-9 20:09
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

8
发表于 2016-11-2 20:57:08 | 只看该作者
@RyanBern
我有问题。
我用这个脚本设置图片为背景。
当工程执行默认的加密后,就不能使用了,不能显示出图片。

点评

更新了一下版本,加密数据似乎可以读  发表于 2017-10-3 11:24
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

9
 楼主| 发表于 2017-10-3 10:42:28 | 只看该作者
本帖最后由 RyanBern 于 2017-10-3 11:26 编辑

假装更新一下 ULDS。此后尽量和 VA 的 ULDS 保持一致。当然落后一两个 commit 也是正常的。基本上功能都弄过来了,用法上会有些改动。

以下是目前尚未解决或不清楚是否影响使用的问题:
1. 不能调出“位于角色上方但是在雾图形下方”的 z 值;也不能调出“位于地图画面上方但是位于【总在顶部显示】的事件下方”的 z
2. 如果经过 RMXP 加密,读取文件可能没问题。
3. 远景地图模式下,依然不能很愉快地设置通行度。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1495
在线时间
1101 小时
注册时间
2015-7-4
帖子
1561

开拓者

10
发表于 2017-10-3 10:45:03 | 只看该作者
本帖最后由 斜眼君 于 2018-8-8 18:06 编辑

[DATA EXPUNGED]
根本不需要什么最后的落脚处,只需要不断前行就够了。只要脚步不停下来,道路就会在脚下不断延伸!
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-24 23:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表