Project1

标题: 【ULDS】无限图层显示系统 Unlimited Layers Display System [打印本页]

作者: taroxd    时间: 2014-5-21 16:15
标题: 【ULDS】无限图层显示系统 Unlimited Layers Display System
本帖最后由 taroxd 于 2015-2-7 16:13 编辑

在地图上显示图片。可用来制作图片地图,也可当做固定的远景图来使用。

RUBY 代码复制
  1. #----------------------------------------------------------------------------
  2. # ● require Taroxd基础设置
  3. #    无限图层显示系统 Unlimited Layers Display System By Taroxd
  4. #----------------------------------------------------------------------------
  5. #
  6. #  使用方法:导入此脚本后,在地图上备注如下内容。
  7. #
  8. #  <ulds=filename>
  9. #    x: X坐标
  10. #      公式,默认为 0
  11. #    y: Y坐标
  12. #      公式,默认为 0
  13. #    z: Z坐标
  14. #      公式,只计算一次,默认为 10,可以设置为 -100 来当作远景图使用
  15. #    zoom: 缩放倍率
  16. #      公式,默认为 1。缩放的原点为画面左上角。
  17. #    zoom_x: 横向缩放倍率
  18. #      公式,默认为 zoom
  19. #    zoom_y: 纵向缩放倍率
  20. #      公式,默认为 zoom
  21. #    opacity: 不透明度
  22. #      公式,默认为 255
  23. #    blend_type: 合成方式
  24. #      公式,只计算一次。默认为 0 (0:正常、1:加法、2:减法)
  25. #    scroll: 图像跟随地图卷动的速度
  26. #      实数,默认为 32
  27. #    scroll_x: 图像跟随地图横向卷动的速度
  28. #      实数,默认为 scroll
  29. #    scroll_y:图像跟随地图纵向卷动的速度
  30. #      实数,默认为 scroll
  31. #    loop: 循环
  32. #      冒号后面不需要填写任何东西。
  33. #    visible: 图像是否显示
  34. #      公式,默认为 true
  35. #    path: 图像的路径名
  36. #      默认为 Parallaxes
  37. #    color: 合成的颜色
  38. #      公式,只计算一次。默认为 Color.new(0, 0, 0, 0)
  39. #    tone: 色调
  40. #      公式,只计算一次。默认为 Tone.new(0, 0, 0, 0)
  41. #    eval: 初始化后,以 sprite 或 plane 为 self 执行的代码。
  42. #      公式,默认为空
  43. #    update: 图片显示时,每帧执行的更新代码
  44. #      公式,默认为 t += 1
  45. #  </ulds>
  46. #
  47. #  其中 filename 是图片文件名(无需扩展名),放入 Parallaxes 文件夹内
  48. #  这个文件夹可以通过 path 设置更改
  49. #
  50. #  在 <ulds=filename> 和 </ulds> 中间的部分均为选填。不填则自动设为默认值。
  51. #  每一个设置项只能写一行。(地图备注没有单行长度限制)
  52. #  每一行只能写一个设置项。
  53. #  一般来说,正常使用时大部分都是不需要设置的。
  54. #
  55. #  设置项目中的“公式”表示,这一个设置项可以像技能的伤害公式一样填写。
  56. #  “只计算一次”表示,该公式只会在刚刚进入地图时计算一次,之后不会更新。
  57. #  可用 t 表示当前已经显示的帧数,s[n], v[n] 分别表示 n 号开关和 n 号变量。
  58. #  width 表示图片宽度,height 表示图片高度。
  59. #
  60. #  例:
  61. #   <ulds=BlueSky>
  62. #     x: t
  63. #     scroll_x: 16
  64. #     scroll_y: 64
  65. #     loop:
  66. #   </ulds>
  67. #
  68. #  需要多行公式时,可以重复备注。
  69. #  例:
  70. #   <ulds=Slime>
  71. #     path: Battlers
  72. #     x: width / 2
  73. #     y: height / 2
  74. #     eval: self.ox = width / 2
  75. #     eval: self.oy = height / 2
  76. #     eval: self.angle = 180
  77. #   </ulds>
  78. #
  79. #--------------------------------------------------------------------
  80.  
  81. module Taroxd::ULDS
  82.  
  83.   DEFAULT_PATH = 'Parallaxes'               # 图片文件的默认路径
  84.   DEFAULT_Z = 10                            # 默认的 z 值
  85.   RE_OUTER = /<ulds=(.+?)>(.*?)<\/ulds>/mi  # 读取备注用的正则表达式
  86.   RE_INNER = /(\w+) *: *(.*)/               # 读取设置用的正则表达式
  87.  
  88.   module Base
  89.     include Math
  90.  
  91.     attr_accessor :scroll_x, :scroll_y
  92.  
  93.     def dispose
  94.       bitmap.dispose
  95.       super
  96.     end
  97.  
  98.     def adjust_x(x)
  99.       $game_map.adjust_x(x.fdiv(@scroll_x)) * @scroll_x
  100.     end
  101.  
  102.     def adjust_y(y)
  103.       $game_map.adjust_y(y.fdiv(@scroll_y)) * @scroll_y
  104.     end
  105.   end
  106.  
  107.   class Sprite < ::Sprite
  108.     include Base
  109.  
  110.     def x=(x)
  111.       super(adjust_x(x))
  112.     end
  113.  
  114.     def y=(y)
  115.       super(adjust_y(y))
  116.     end
  117.   end
  118.  
  119.   class Plane < ::Plane
  120.     include Base
  121.  
  122.     attr_reader :visible
  123.  
  124.     def x=(x)
  125.       self.ox = -adjust_x(x)
  126.     end
  127.  
  128.     def y=(y)
  129.       self.oy = -adjust_y(y)
  130.     end
  131.  
  132.     def visible=(visible)
  133.       super
  134.       @visible = visible
  135.     end
  136.  
  137.     def width
  138.       bitmap.width
  139.     end
  140.  
  141.     def height
  142.       bitmap.height
  143.     end
  144.   end
  145.  
  146.   class << self
  147.  
  148.     # 从备注中读取设置,并生成数组
  149.     def from_note(note, viewport)
  150.       note.scan(RE_OUTER).map do |name, contents|
  151.         settings = {nil => name}
  152.         contents.scan(RE_INNER) do |key, value|
  153.           (settings[key] ||= '') << value << "\n"
  154.         end
  155.         new(settings, viewport)
  156.       end
  157.     end
  158.  
  159.     # 返回一个 ULDS::Sprite 或 ULDS::Plane 的实例
  160.     def new(settings, viewport)
  161.       @settings = settings
  162.       holder(viewport)
  163.     end
  164.  
  165.     private
  166.  
  167.     def holder(viewport)
  168.       (extract('loop') ? Plane : Sprite).new(viewport).tap do |holder|
  169.         holder.bitmap = Bitmap.new(bitmap_filename)
  170.         holder.instance_eval(init_holder_code, __FILE__, __LINE__)
  171.       end
  172.     end
  173.  
  174.     # 在一个 sprite 或 plane 的上下文中执行的代码。
  175.     # 如果难以理解,请尝试输出这段代码来查看。
  176.     def init_holder_code
  177.       "#{binding_code}
  178.       #{init_attr_code}
  179.       #{define_update_code}
  180.       #{extract 'eval'}"
  181.     end
  182.  
  183.     # 定义变量的代码
  184.     def binding_code
  185.       's = $game_switches
  186.       v = $game_variables
  187.       t = 0'
  188.     end
  189.  
  190.     # 只计算一次的初始化代码
  191.     def init_attr_code
  192.       "#{set_attr_code 'z', DEFAULT_Z}
  193.       #{set_attr_code 'scroll_x', 32}
  194.       #{set_attr_code 'scroll_y', 32}
  195.       #{set_attr_code 'blend_type'}
  196.       #{set_attr_code 'color'}
  197.       #{set_attr_code 'tone'}"
  198.     end
  199.  
  200.     # 更新的代码
  201.     def define_update_code
  202.       %{
  203.         define_singleton_method :update do
  204.           #{set_attr_code 'visible'}
  205.           return unless visible
  206.           #{set_attr_code 'zoom_x'}
  207.           #{set_attr_code 'zoom_y'}
  208.           #{set_attr_code 'opacity'}
  209.           #{set_attr_code 'x', 0}
  210.           #{set_attr_code 'y', 0}
  211.           #{set_t_code}
  212.         end
  213.       }
  214.     end
  215.  
  216.     # 设置属性的代码
  217.     def set_attr_code(key, default = nil)
  218.       formula = extract(key, default)
  219.       formula && "self.#{key} = (#{formula})"
  220.     end
  221.  
  222.     # 设置时间的代码
  223.     def set_t_code
  224.       extract('update', 't += 1')
  225.     end
  226.  
  227.     # 位图文件名
  228.     def bitmap_filename
  229.       "Graphics/#{extract('path', DEFAULT_PATH).chomp}/#{extract(nil)}"
  230.     end
  231.  
  232.     # 获取备注中的设定值
  233.     def extract(key, default = nil)
  234.       @settings[key] || /(.+)_[xy]\Z/ =~ key && @settings[$1] || default
  235.     end
  236.   end
  237. end
  238.  
  239. class Spriteset_Map
  240.  
  241.   private
  242.  
  243.   def create_ulds
  244.     @ulds = Taroxd::ULDS.from_note($game_map.note, @viewport1)
  245.     @ulds_map_id = $game_map.map_id
  246.   end
  247.  
  248.   def refresh_ulds
  249.     dispose_ulds
  250.     create_ulds
  251.   end
  252.  
  253.   def update_ulds
  254.     refresh_ulds if @ulds_map_id != $game_map.map_id
  255.     @ulds.each(&:update)
  256.   end
  257.  
  258.   def dispose_ulds
  259.     @ulds.each(&:dispose)
  260.   end
  261.  
  262.   def_before :create_parallax,  :create_ulds
  263.   def_before :update_parallax,  :update_ulds
  264.   def_before :dispose_parallax, :dispose_ulds
  265.  
  266. end
            




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