查看: 72851|回复: 86

[原创发布] 【ULDS】无限图层显示系统 Unlimited Layers Display System Ver2.18

 火 [复制链接]

…あたしは天

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

开拓者贵宾

发表于 2014-7-9 21:32:30 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 taroxd 于 2017-11-22 18:29 编辑


禁止转载帖子链接之外的部分。
允许使用在商业、R18 等游戏中。
该脚本允许修改之后作为脚本素材二次发布(如移植或增加功能等)。这种情况下,请在任意位置注明原作者,并且有表明二次发布的版本并非 ULDS 的原始版本。


脚本编写:taroxd
范例制作:小柯

本脚本可以实现无限图片的显示,可以固定在地图上,也可以随主角移动,可以当做远景图、地图图层、遮挡图层甚至光效图层、阴影图层,并且可以受开关控制,灵活性非常大。
范例里面被当做类似于 overlay mapping 来做演示,但实际上ULDS在功能和自由度上都要更加强大,而且可以重复利用同一张图片以节约体积。

范例里不仅附带了制作地图的 PSD 源文件,而且赠送一个区域禁止通行的简单脚本。赠送的小脚本以 cc0 方式授权,在法律允许的范围内作者放弃该脚本相关的所有权利。

无标题.png 无标题2.png
地图ps完成图.png 雾截图.png


[pre lang="ruby" line="1"]

#----------------------------------------------------------------------------
# ● 无限图层显示系统 Unlimited Layers Display System By Taroxd
#----------------------------------------------------------------------------
#
#  使用方法:导入此脚本后,在地图上备注如下内容。
#
#  <ulds=filename>
#    x: X坐标
#      公式,默认为 0
#    y: Y坐标
#      公式,默认为 0
#    z: Z坐标
#      公式,只计算一次,默认为 10,可以设置为 -100 来当作远景图使用
#    zoom: 缩放倍率
#      公式,默认为 1。缩放的原点为画面左上角。
#    zoom_x: 横向缩放倍率
#      公式,默认为 zoom
#    zoom_y: 纵向缩放倍率
#      公式,默认为 zoom
#    opacity: 不透明度
#      公式,默认为 255
#    blend_type: 合成方式
#      公式,只计算一次。默认为 0 (0:正常、1:加法、2:减法)
#    scroll: 图像跟随地图卷动的速度
#      实数,默认为 32
#    scroll_x: 图像跟随地图横向卷动的速度
#      实数,默认为 scroll
#    scroll_y:图像跟随地图纵向卷动的速度
#      实数,默认为 scroll
#    loop: 循环
#      冒号后面不需要填写任何东西。
#    visible: 图像是否显示
#      公式,默认为 true
#    path: 图像的路径名
#      默认为 Parallaxes
#    color: 合成的颜色
#      公式,只计算一次。默认为 Color.new(0, 0, 0, 0)
#    tone: 色调
#      公式,只计算一次。默认为 Tone.new(0, 0, 0, 0)
#    eval: 初始化后,以 sprite 或 plane 为 self 执行的代码。
#      公式,默认为空
#    update: 图片显示时,每帧执行的更新代码
#      公式,默认为 t += 1
#    dispose: 图片释放前执行的代码
#      公式,默认为空
#  </ulds>
#
#  其中 filename 是图片文件名(无需扩展名),放入 Parallaxes 文件夹内
#  这个文件夹可以通过 path 设置更改
#
#  在 <ulds=filename> 和 </ulds> 中间的部分均为选填。不填则自动设为默认值。
#  每一个设置项只能写一行。(地图备注没有单行长度限制)
#  每一行只能写一个设置项。
#  一般来说,正常使用时大部分都是不需要设置的。
#
#  设置项目中的“公式”表示,这一个设置项可以像技能的伤害公式一样填写。
#  “只计算一次”表示,该公式只会在刚刚进入地图时计算一次,之后不会更新。
#  可用 t 表示当前已经显示的帧数,s[n], v[n] 分别表示 n 号开关和 n 号变量。
#  width 表示图片宽度,height 表示图片高度。
#
#  例:
#   <ulds=BlueSky>
#     x: t
#     scroll_x: 16
#     scroll_y: 64
#     loop:
#   </ulds>
#
#  需要多行公式时,可以重复备注。
#  例:
#   <ulds=Slime>
#     path: Battlers
#     x: width / 2
#     y: height / 2
#     eval: self.ox = width / 2
#     eval: self.oy = height / 2
#     eval: self.angle = 180
#   </ulds>
#
#----------------------------------------------------------------------------
#  z 坐标详解:【-100】远景图
#             【0】最低图块层、在普通角色下方
#             【100】与普通角色相同
#             【200】在普通角色上方
#----------------------------------------------------------------------------
#  更新记录:
#   2014.07.10 Ver1.01: 修正了 zoom、zoom_y 会报错的问题
#   2014.07.11 Ver1.02: 修正了切换图块组之后失效的问题
#   2014.08.14 Ver1.1:  增加了 speed_x, speed_y 的设置
#   2014.08.16 Ver1.2:  fix 设定更改为 scroll
#   2014.08.29 Ver1.21: 修正了坐标误差
#   2014.09.19 Ver1.22: 修正了远景图与图层使用相同文件时报错的问题
#   2014.09.25 Ver2.0:  属性可以用公式进行设置了;其他细节改进
#   2014.09.26 Ver2.01: 增加了 path、update 的设置
#   2015.01.02 Ver2.1:  增加了 init、color、tone 的设置;其他细节改进
#   2015.01.03 Ver2.11: 修复了 zoom 属性会导致坐标误差的问题
#   2015.02.02 Ver2.12: 支持多行备注和公式中的 width 和 height;其他细节改进
#   2015.07.04 Ver2.13: 修复了循环时可能不会更新的问题
#   2017.03.22 Ver2.15: 允许文件名为空,即备注 <ulds></ulds>
#   2017.05.10 Ver2.16: 增加了 dispose 设置
#   2017.08.22 Ver2.17: 修复文件名为空时导致的 bug
#   2017.10.04 Ver2.18: 增强兼容性
#----------------------------------------------------------------------------

module Taroxd; end

module Taroxd::ULDS

  DEFAULT_PATH = 'Parallaxes'                    # 图片文件的默认路径
  DEFAULT_Z = 10                                 # 默认的 z 值
  RE_OUTER = /<ulds[= ]?(.*?)>(.*?)<\/ulds>/mi  # 读取备注用的正则表达式
  RE_INNER = /(\w+) *: *(.*)/                    # 读取设置用的正则表达式

  module Base
    include Math

    attr_accessor :scroll_x, :scroll_y

    def dispose
      bitmap.dispose if bitmap
      super
    end

    def adjust_x(x)
      return x if !@scroll_x || @scroll_x.abs < Float::EPSILON
      $game_map.adjust_x(x.fdiv(@scroll_x)) * @scroll_x
    end

    def adjust_y(y)
      return y if !@scroll_y || @scroll_y.abs < Float::EPSILON
      $game_map.adjust_y(y.fdiv(@scroll_y)) * @scroll_y
    end
  end

  class Sprite < ::Sprite
    include Base

    def x=(x)
      super(adjust_x(x))
    end

    def y=(y)
      super(adjust_y(y))
    end
  end

  class Plane < ::Plane
    include Base

    attr_reader :visible

    def initialize(_)
      super
      @visible = true
    end

    def x=(x)
      self.ox = -adjust_x(x)
    end

    def y=(y)
      self.oy = -adjust_y(y)
    end

    def visible=(visible)
      super
      @visible = visible
    end

    def width
      bitmap.width
    end

    def height
      bitmap.height
    end
  end

  class << self

    # 从备注中读取设置,并生成数组
    def from_note(note, viewport)
      note.scan(RE_OUTER).map do |name, contents|
        settings = {nil => name}
        contents.scan(RE_INNER) do |key, value|
          (settings[key] ||= '') << value << "\n"
        end
        new(settings, viewport)
      end
    end

    # 返回一个 ULDS::Sprite 或 ULDS::Plane 的实例
    def new(settings, viewport)
      @settings = settings
      container(viewport)
    end

    private

    def container(viewport)
      (extract('loop') ? Plane : Sprite).new(viewport).tap do |container|
        container.bitmap = make_bitmap
        container.instance_eval(init_container_code, __FILE__, __LINE__)
      end
    end

    # 在一个 sprite 或 plane 的上下文中执行的代码。
    # 如果难以理解,请尝试输出这段代码来查看。
    def init_container_code
      "#{binding_code}
      #{init_attr_code}
      #{define_update_code}
      #{define_dispose_code}
      #{extract 'eval'}"
    end

    # 定义变量的代码
    def binding_code
      's = $game_switches
      v = $game_variables
      t = 0'
    end

    # 只计算一次的初始化代码
    def init_attr_code
      "#{set_attr_code 'z', DEFAULT_Z}
      #{set_attr_code 'scroll_x', 32}
      #{set_attr_code 'scroll_y', 32}
      #{set_attr_code 'blend_type'}
      #{set_attr_code 'color'}
      #{set_attr_code 'tone'}"
    end

    # 更新的代码
    def define_update_code
      %{
        define_singleton_method :update do
          #{set_attr_code 'visible'}
          return unless visible
          #{set_attr_code 'zoom_x'}
          #{set_attr_code 'zoom_y'}
          #{set_attr_code 'opacity'}
          #{set_attr_code 'x', 0}
          #{set_attr_code 'y', 0}
          #{set_t_code}
        end
      }
    end

    def define_dispose_code
      code = extract('dispose')
      !code ? "" : %{
        define_singleton_method :dispose do
          #{code}
          super()
        end
      }
    end

    # 设置属性的代码
    def set_attr_code(key, default = nil)
      formula = extract(key, default)
      formula && "self.#{key} = (#{formula})"
    end

    # 设置时间的代码
    def set_t_code
      extract('update', 't += 1')
    end

    # 获得位图
    def make_bitmap
      basename = extract(nil)
      if !basename.empty?
        folder_name = "Graphics/#{extract('path', DEFAULT_PATH).chomp}"
        Bitmap.new("#{folder_name}/#{basename}")
      else
        nil
      end
    end

    # 获取备注中的设定值
    def extract(key, default = nil)
      @settings[key] || /(.+)_[xy]\Z/ =~ key && @settings[$1] || default
    end
  end
end

class Game_Map

  def note
    @map.note
  end
end

class Spriteset_Map

  def create_ulds
    @ulds = Taroxd::ULDS.from_note($game_map.note, @viewport1)
    @ulds_map_id = $game_map.map_id
  end

  def refresh_ulds
    dispose_ulds
    create_ulds
  end

  def update_ulds
    refresh_ulds if @ulds_map_id != $game_map.map_id
    @ulds.each(&:update)
  end

  def dispose_ulds
    @ulds.each(&:dispose)
  end

  # 导入
  %w(create update dispose).each do |name|
    sym  = :"#{name}_parallax"
    hook = :"#{name}_ulds"
    old  = instance_method sym
    define_method sym do
      send hook
      old.bind(self).call
    end
  end
end
[/pre]


无限图层显示系统 Unlimited Layers Display System.7z

6.79 MB, 下载次数: 15883

评分

参与人数 18星屑 +736 梦石 +1 赞 +6 收起 理由
Glacier. + 1 精品文章
Yanhuai + 1 精品文章
库客蓝 + 1 精品文章
zyzzyzzyzzyz + 1 精品文章
徐铭的葬礼 + 1 感谢
noah0909961 + 1 精品文章
zaiy2863 + 154 大感谢
Kim_巧克力控 + 10 精品文章
3535 + 52 精品文章
龙和许也 + 10 打算用了!

查看全部评分

名侦探小柯

梦石
10
星屑
4393
在线时间
3739 小时
注册时间
2006-9-6
回帖
36595

极短27获奖MZ评测员开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

发表于 2014-7-9 22:33:49 | 显示全部楼层
范例制作的累死了,过来吃糖。
希望以后能看到很多作品使用国产的这个ULDS系统而不是进口货

评分

参与人数 4星屑 +12 梦石 +1 赞 +1 收起 理由
卫宫白 + 1
龙和许也 + 10 塞糖
迷糊的安安 + 1 好顶赞!
塞巴斯特 + 2 给柯柯的棒棒糖~

查看全部评分

不定期回归 ~ 游戏开发之旅
———————————————————————————————
回复

使用道具 举报

PIG·KIN

梦石
0
星屑
45
在线时间
442 小时
注册时间
2009-1-26
回帖
3231

贵宾

发表于 2014-7-9 22:43:13 | 显示全部楼层
小柯观光团路过,我对于墙体没有阴影耿耿于怀

点评

我画了阴影啊  发表于 2014-7-9 22:49
我是一个风一般的————外卖佬。
回复

使用道具 举报

职业の水客

梦石
2
星屑
16976
在线时间
7495 小时
注册时间
2010-6-16
回帖
3461

极短27评委MZ评测员极短26评委开拓者

发表于 2014-7-9 22:44:44 | 显示全部楼层
这个好 这个赞 直接弄到游戏来
一个看图的地方
群爆炸重建后状态:论坛老人最多(只剩下了活跃的老人),技术力很强(依旧不变)的编程灌水群:901540785
专门讨论RM相关的Q群:56875149
PS:第一个群不是专门讨论RM的,第二个才是哦。
回复

使用道具 举报

永夜蟄居の玖瀨

梦石
0
星屑
71
在线时间
1018 小时
注册时间
2011-9-5
回帖
2707

开拓者贵宾

发表于 2014-7-9 22:52:16 | 显示全部楼层
xd触观光团路过w
这样光效啥的就大丈夫了w

回复 1 0

使用道具 举报

小小的百鬼夜行<

梦石
0
星屑
54
在线时间
579 小时
注册时间
2010-7-29
回帖
2593

贵宾

发表于 2014-7-9 23:53:44 | 显示全部楼层
这奇葩的新dz折腾到要死
虽然确实比之前那个自由度高了很多..但是小柯你的阴影画出去了(
某只PHP/HTML小白鼠→退屈の间


Cause I knew you were trouble when you walked in
So shame is on me now
I flow me to place i ve never been
till you put me down oh
Now Im lying on the cold hard ground
回复

使用道具 举报

梦石
0
星屑
2306
在线时间
1010 小时
注册时间
2012-4-30
回帖
1455

开拓者

发表于 2014-7-10 03:01:26 来自手机 | 显示全部楼层
前排支持ww
回复

使用道具 举报

梦石
0
星屑
290
在线时间
3599 小时
注册时间
2012-2-29
回帖
3320

黄金编剧

发表于 2014-7-10 08:43:50 | 显示全部楼层
喔这个屌,地图的新世界!
{:2_270:}画一堆重岩叠嶂永远走不出去的迷宫好了
这阴影,简直酸爽
简化 高效 简约 便捷,为用户体验而思考。
回复

使用道具 举报

梦石
0
星屑
94
在线时间
648 小时
注册时间
2009-2-3
回帖
208
发表于 2014-7-10 10:18:33 | 显示全部楼层
木有XP版么

点评

XP三个地图分层够用了  发表于 2014-7-22 23:12
回复

使用道具 举报

…あたしは天

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

开拓者贵宾

 楼主| 发表于 2014-7-10 10:47:27 来自手机 | 显示全部楼层
lanyaolove 发表于 2014-7-10 10:18
木有XP版么


木有,也不会有

你需要的话可以尝试找人移植过去。
回复 0 1

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部