查看: 5456|回复: 10

[原创发布] 【简易化】世界地图系统(更新遮罩 图层

[复制链接]
梦石
0
星屑
2427
在线时间
87 小时
注册时间
2018-1-3
回帖
10
发表于 2019-9-6 21:48:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 路路 于 2019-9-24 11:03 编辑

很久以前写的一个世界地图界面脚本,但是旧版的用起来太难了(自己都懵了 我太难了…
所以重新整理和优化,更加容易使用
*注意 这里的容易是指脚本基础(基本不需要)
实际上手步骤还是挺多的 需要画出地图,整理出数据。你的图越复杂 数据量越多,要知道想是变不出来的 多动手!
另外该脚本好像还可以用在其他奇怪地方?解谜?…等待有缘人解锁新的姿势
ps.那张宝可梦的只是张没有数据的空图


声明:
范例里素材均为RTP+本人绘制交流用,请不要用于商业目的
该系统可以兼容鼠标脚本,范例不带, 请自行探索添加


使用方法:
参考对应版本注释的步骤
参考热心的3楼
参考范例

最近更新:
增加了遮罩层插件 大大提高“探索性” 2019.9.13
增加了图片显示插件 可以更自由的自定义界面 2019.9.13
插件相互独立 可以自由选用
使用方法参考注释和高级版范例



高级版 包含所有插件(无dll): LYA_WMM 2.2ex_b20.rar (1.89 MB, 下载次数: 202)
标准版(无dll): LYA_WMM 2.2_b01.rar (892.71 KB, 下载次数: 90)
特效版(无dll): LYA_WMM 2.2_b02.rar (898.56 KB, 下载次数: 68)
古董版(无dll): WOR-MAPS V1.4.6.rar (791.82 KB, 下载次数: 67)
[fold=LYA_WMM 2.2ex 主体]
[pre lang="ruby"]
#————————————————————————————————————————
# ●LYA_WMM By.Lyaci
#   *世界地图界面 v2.2ex
#   -用于打开单/多个世界地图
#   -适用于 RPG MAKER ACE
#————————————————————————————————————————
=begin
————————————————————————————————————————
基本使用:
呼出界面
SceneManager.call(LYA_WMM::Scene_Wmap) 呼出任意世界地图界面
LYA_WMM.scene_call 呼出当前地图数据索引的世界地图界面
界面快捷键默认 A 键(可用开关控制启用状态)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
设置步骤:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.一张世界地图图片、对应一张蒙版图片(地图文件名+_OF,步骤2说明)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2.设置蒙版图片数据
  *蒙版为每个区域的识别数据,由不同颜色(含透明度)的色块组成的图片
   -需自用PS等图形软件制作,优先级最高的为100%不透明度 255^4种色选择 随便选色即可
制作出蒙版后打开DEBUG开关,光标移动到欲设置区域按F5获得色数据、步骤3的XY数据
把色数据添加到<COLOR:R,G,B,O>(步骤3)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.设置地图数据(集合了基本内容,可不设)
-转到脚本“数据设置”
*DataSet ID:1 风之城 ID:设置对应地图的ID
<COLOR:R,G,B,O> R,G,B,O:设置该区域的蒙版色(未设置会自动分配)
<BASE:FILE,X,Y> FILE:地图图片文件名,X, Y:主角显示的坐标(步骤2或PS获取)
未设置便自动向上搜索父图的该设置
<INF: ...> 带控制符的信息文本(未设置不显示)*必须使用双斜线\\控制符
<MOV:X,Y,D,WID> 传送坐标(游戏地图)、开关数据(未设置不能传送)
X, Y:坐标,D:朝向(2,4,6,8)->>(下,左,右,上),WID:传送开启的开关ID
<LSE:FILE> FILE:指针经过时播放的SE文件名(未设置不播放)

数据请放置在%<>之中,*DataSet ID:为一个地图数据 注意格式的正确性
数据设置完后请关闭DEBUG

3步后基本的数据设置完成了 更多请参考示例
4.制作传送道具
-数据库道具-备注
<SC:...> 将呼出脚本写入里面即可,也可以用公共事件(不能无缝返回上一个界面)
————————————————————————————————————————
深入使用:
增加一个区域的范围(参考设置)
OFLOCK_XY {[地图文件名,X,Y,偏量] => 区域(地图)ID}
移动结束时执行代码块(参考设置)
MP = { 地图ID => 定义代码块}
更多请转到"内部设置"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
特别说明:
禁止传送有4种开关
WID为该地图是否可传送的独立开关(上面步骤3里的WID)
MAP_WMOVSET为未设置WID时的统一开关(下面常量设置的游戏开关ID)
MAP_AMOVSET为顶层传送功能开关(下面常量设置的游戏开关ID)
MAP_MOVSET_RUN则为不可逆完全关闭传送功能 包括弹窗(下面常量设置的内部开关)
优先级:MAP_WMOVSET < WID < MAP_AMOVSET < MAP_MOVSET_RUN

MAP_VSET为储存欲打开界面的地图图片文件名的变量,一般在打开界面前设置
快捷键打开世界地图时会覆盖该变量
快捷键打开世界地图会受限于地图设置的NAME数据
脚本打开界面则不会(所以设定MAP_VSET后可打开任意图片的世界地图)

设置<NAME,X,Y>时XY未取得只是想测试时不能设置重复的XY 但可超出窗口大小隐藏

设置数据库道具、技能备注转脚本<SC:...> 可以作为独立的功能使用

使用鼠标脚本时可以把锁标图片改成空白
————————————————————————————————————————
*Ver
Ver:1.0 Date:2014.6.25 ~ Ver:2.2ex Date:2019.9.12
————————————————————————————————————————
声明:
本体与拓展脚本可用于非商业、商业,使用和转载请保留此信息
=end
#————————————————————————————————————————
module LYA_WMM
  #————————————————————————————————————————
  DEBUG = false        #调试模式(蒙版、主量、偏量范围显示/关闭 F5按键取色)
  MOUSE_PATCH = false  #使用鼠标脚本时使用补丁开关
  #————————————————————————————————————————
  #●数据设置(步骤3)
  #————————————————————————————————————————
MAPDATA = %<
*DataSet ID:1 风之城
<COLOR:89,198,170,224>
<BASE:AM,342,266>
<INF:\\I[122]风之城 \\I[336]\\V[101] \\I[238]任务达成\\V[1]/3
这是游戏的帝都,美丽而富饶\\n对了那些门都是没用的,去下一个地图吧\\\I[107]>
<MOV:20,28,8,101>
<LSE:applause2>
  
*DataSet ID:7 风之城魔女家
<BASE:AM,312,226>
<INF:\\I[122]风之城-魔女之家 \\I[336]\\V[101] \\I[238]任务达成\\V[1]/3
这是游戏的帝都,美丽而富饶\\n对了那些门都是没用的,去下一个地图吧\\I[107]>
<MOV:20,28,8,101>
<LSE:MISS>
  
*DataSet ID:8 吐槽城堡
<COLOR:116,123,199,224>
<BASE:AM,318,135>
<INF:\\I[122]吐槽城堡 \\I[336]\\V[106]
emmmm?>
<LSE:CAT>
  
*DataSet ID:9 吐槽水族馆
<COLOR:109,154,164,224>
<BASE:AM,200,185>
<INF:\\I[122]吐槽水族馆 \\I[336]\\V[106]
emmmm?>
<LSE:POISON>
  
*DataSet ID:10 破碎深渊
<COLOR:137,183,99,224>
<BASE:AM,596,64>
<INF:\\I[122]破碎深渊(阿!) \\I[336]\\V[106]
这是什么中二的地方!?>
<LSE:DEVIL1>

*DataSet ID:11 水之城
<COLOR:138,209,89,224>
<BASE:AM,79,265>
<INF:\\I[122]水之城 \\I[336]\\V[106]
雨之子!>
<LSE:DIVE>

*DataSet ID:12 火之城
<COLOR:182,137,82,224>
<BASE:AM,524,350>
<INF:\\I[122]烈焰王城! \\I[336]\\V[106]
其实是卖烧烤的地方(●ˇ∀ˇ●)>
<LSE:FIRE2>

*DataSet ID:13 仪式之地
<COLOR:182,95,149,224>
<BASE:AM,600,211>
<INF:\\I[122]仪式之地 \\I[336]\\V[103]
林克 是李妈?>
<LSE:CHIME1>
<MOV:8,6,2,103>

*DataSet ID:15 水之国领地
<COLOR:125,184,78,192>
<BASE:AM,660,1>
<INF:\\I[1]水之国领地
emmmm?>

*DataSet ID:16 风之国领地
<COLOR:78,158,161,192>
<BASE:AM,660,2>
<INF:\\I[1]风之国领地
emmmm?>

*DataSet ID:17 火之国领地
<COLOR:120,92,61,192>
<BASE:AM,660,3>
<INF:\\I[1]火之国领地
emmmm?>

*DataSet ID:18 阳光海岸
<COLOR:60,116,107,192>
<BASE:AM,271,385>
<INF:\\I[202]阳光海岸 \\I[336]\\V[102]\n这是度假胜地哦~>
<MOV:7,5,2,102>

*DataSet ID:19罗德岛
<COLOR:53,57,128,192>
<BASE:AM,660,4>
<INF:\\I[1]罗德岛
emmmm?>

*DataSet ID:20光之岛
<COLOR:169,135,98,192>
<BASE:AM,660,5>
<INF:\\I[1]光之岛
emmmm?>

*DataSet ID:21 骷髅岛
<COLOR:53,122,102,192>
<BASE:AM,660,6>
<INF:\\I[1]骷髅岛
emmmm?>

*DataSet ID:23 海
<COLOR:84,91,108,128>
<BASE:AM,660,7>
<INF:\\I[99]蔚蓝海域
新的疯豹已出现>

*DataSet ID:24 漩涡
<COLOR:212,150,235,128>
<BASE:AM,660,8>
<INF:\\I[119]无尽漩涡
已经旋转了五百年的巨型漩涡,是道德的沦丧 还是……>
<LSE:SAINT4>

*DataSet ID:25 圣湖
<COLOR:141,35,180,128>
<BASE:AM,660,9>
<INF:\\I[112]圣湖
水之国朝拜的圣域 不容侵犯>
<LSE:UP3>
  
*DataSet ID:26 亚丁湖
<COLOR:35,141,180,128>
<BASE:AM,660,10>
<INF:\\I[359]亚丁湖
大陆最大的湖 属于公域>
<LSE:SLEEP>
  
*DataSet ID:27 河流
<COLOR:84,176,206,192>
<BASE:AM,660,11>
<INF:\\I[359]河流
延绵的长河 斩断大地 直通大海>
  
*DataSet ID:28 马路
<COLOR:251,242,229,255>
<BASE:AM,660,12>
<INF:\\I[360]马路
要想富 先修路>

>
  #————————————————————————————————————————
  #锁定偏量增加 [地图文件名,X,Y,偏量范围] => 地图ID
  #偏量用于增加响应范围,按范围影响度自行调整
  OFLOCK = 20         #默认主、偏量范围(未手动设置范围即使用该值)
  OFLOCK_XY = {}
  #————————————————————————————————————————
  #传送后执行该地图的设定代码块(不添加就忽略)
  MP = {
  #1 => self.mov_proc {msgbox 123},
  #2 => self.mov_proc {msgbox 456},
  }
  #————————————————————————————————————————
  #地图数据(内部用)
  MAP_NOTE = {}
  #————————————————————————————————————————
  #区域蒙版(内部用)
  OFLOCK_COLOR = {}
  #————————————————————————————————————————
  #●内部设置
  #————————————————————————————————————————
  MAP_KEY  = :X         #快捷键设置
  MAP_WSET = 1          #禁止/允许打开世界地图开关ID
  MAP_VSET = 100        #设置新的世界地图文件名的变量ID
  MAP_WMOVSET = 100     #公用地图传送开关ID
  MAP_AMOVSET = 99      #全局传送开关ID(优先公用与独立开关)
  MAP_MOVSET_RUN = true #是否启用传送功能(脚本层)
  LSE_ON = true         #是否开启捕获新地时的音效(脚本层)
  #————————————————————————————————————————
  WMAPS_FOLDER = "Graphics/WMAP/" #存放所有资源的文件夹
  MAP_FILE = "AM"       #初始的地图文件名
  WINSKIN_INFO_FILE = "winskin_info" #信息窗口皮肤文件名(nil则使用默认窗口)
  ICON_FILE = "micon"   #锁标的文件名
  ICON_XY_WIN = true    #辅助坐标窗口是否生成
  LOCKDIS = 2           #锁标初始速度
  LOCKDIS_MAX = 16      #锁标最大移速
  LOCKDIS_RATIO = 0.15  #锁标移速增幅比
  CAP_SPEED = 40        #队长行走图更新帧周期
  #————————————————————————————————————————
  LOCK_RES_ZR = 0.08                          #呼吸幅度
  LOCK_RES = true                             #是否开启呼吸效果
  LOCK_FLASH = true                           #是否开启闪烁效果
  LOCK_FLASH_C1 = Color.new(100,200,255,168)  #闪烁色1
  LOCK_FLASH_C2 = Color.new(255,200,100,168)  #闪烁色2
  LOCK_FLASH_SPEED = 48                       #闪烁周期
  LOCKMOV_SOUND_SPEED = 6                     #锁标移动声音间隔帧
  MOVCOMM_ALIGN = 1                           #移动窗口文字对齐方式nil为默认
  MOVCOMM_WIDTH = 120                         #移动窗口宽
  UB_EFFE = true                              #飘散特效(需要Unravel_Bitmap)
  #————————————————————————————————————————
#————————————————————————————————————————
# ●Scene_WMAP
#   *界面生成
#————————————————————————————————————————
class Scene_Wmap
  #———————————————————————————————————————
  #数据内容
  #———————————————————————————————————————
  def data
    #———————————————————————————————————————
    #常量
    @graphics_w = Graphics.width
    @graphics_h = Graphics.height
    #———————————————————————————————————————
    #生成背景
    map_back
    #———————————————————————————————————————
    #生成地图
    spr_map_ini
    #———————————————————————————————————————
    #生成锁标
    spr_lock_ini
    #———————————————————————————————————————
    #锁标地址数据
    LOCKCOM.com(@map)
    @comx,@comy,@comf,@comi = LOCKCOM.comdata(@map)
    @comofc = LOCKCOM.comofc(@map)
    @comide = LOCKCOM.comide(@map)
    #———————————————————————————————————————
    #生成范围
    spr_of_ini
    #———————————————————————————————————————
    #锁标初始坐标
    lock_xy_ini
    #———————————————————————————————————————
    #生成锁标坐标显示窗口
    win_lockxy_ini
    #生成地图信息显示窗口
    win_mapint_ini
    #生成移动指令窗口
    win_movcomm
    #———————————————————————————————————————
    #生成队长
    spr_cap_ini
    #生成信息窗口皮肤
    spr_mapint_ini
    #———————————————————————————————————————
    #更新一次信息栏位置
    update_map_int_yof
    #锁标灵敏值参数
    @plong = 0
    #飘散效果参数
    @ubn = 1
    #取得现在的界面对象
    LYA_WMM.__now__scene_self = self
  end
  #———————————————————————————————————————
  #主循环
  #———————————————————————————————————————
  def main
    #准备数据
    data
    #执行过渡
    Graphics.transition
    #进行更新
    update until SceneManager.scene != self
    #准备过渡
    Graphics.freeze
    #释放全部
    dispose
  end
  #———————————————————————————————————————
  #主更新
  #———————————————————————————————————————
  def update
    update_input1
    update_GI
    return if @window_mov_comm.active
    update_input2
    update_lock_flash if LOCK_FLASH
    update_lock_zoom if LOCK_RES
  end
  #———————————————————————————————————————
  #画面、输入更新
  #———————————————————————————————————————
  def update_GI
    Graphics.update
    Input.update
    update_cap
    update_lockeffe if UB_EFFE
    @window_mov_comm.update
  end
  #———————————————————————————————————————
  #数据更新
  #———————————————————————————————————————
  def update_data
    update_lms
    update_oflock
    update_map_int_yof
    refresh_window_lock_xy
  end
  #———————————————————————————————————————
  #按键更新
  #———————————————————————————————————————
  def update_input1
    if Input.trigger?(:C)
      open_window_mov_comm if lock_map_id && MAP_MOVSET_RUN
    end
    if Input.trigger?(:B) or Input.trigger?(MAP_KEY)
      if @window_mov_comm.active
        close_window_mov_comm
      else
         Audio.se_stop
         return SceneManager.return
      end
    end
  end
  def update_input2
    if Input.press?(:DOWN)
      @lock_dy += get_lockdis ; if @lock_dy <= @graphics_h-@lock_h+@lock_mh
      @spr_lock.y += get_lockdis
      @lock_dy = @lock_y = @spr_lock.y ; lock_mov = true ; end
    end
    if Input.press?(:UP)
      @lock_dy -= get_lockdis ; if @lock_dy >= -@lock_mh
      @spr_lock.y -= get_lockdis
      @lock_dy = @lock_y = @spr_lock.y ; lock_mov = true ; end
    end
    if Input.press?(:LEFT)
      @lock_dx -= get_lockdis ; if @lock_dx >= -@lock_mw
      @spr_lock.x -= get_lockdis
      @lock_dx = @lock_x = @spr_lock.x ; lock_mov = true ; end
    end
    if Input.press?(:RIGHT)
      @lock_dx += get_lockdis ; if @lock_dx <= @graphics_w-@lock_w+@lock_mw
      @spr_lock.x += get_lockdis
      @lock_dx = @lock_x = @spr_lock.x ; lock_mov = true ; end
    end
    if Input.trigger?(:F5) && DEBUG
      p @bit_mapof.get_pixel(@lock_cx,@lock_cy)
    end
    if lock_mov
      @ubn = 6
      @plong += 1
      update_data
      lock_mov = false
    else
      @ubn = 2
      @plong = 0
    end
  end
  #———————————————————————————————————————
  #飘散更新
  #———————————————————————————————————————
  def update_lockeffe
    bitmap = @spr_lock.bitmap
    w = bitmap.width
    h = bitmap.height
    Unravel_Bitmap.new(@lock_x,@lock_y,bitmap,0,0,w,h,@ubn,2,0.5,:LRUD,:S,false)
  end
  #———————————————————————————————————————
  #范围更新
  #———————————————————————————————————————
  def update_oflock ; new_cxy
    if @bit_mapof.get_pixel(@lock_cx,@lock_cy).alpha != 0
      @new_map_id = lock_map_id
      if @new_map_id != @now_map_id
        @now_map_id = @new_map_id
        update_lock_xy(@now_map_id)
      end
    else
      @now_map_id = nil ; update_lock_xy(nil)
    end
  end
  #———————————————————————————————————————
  #更新锁标移动声音
  #———————————————————————————————————————
  def update_lms
    @lock_mov_dsc += 1
    if @lock_mov_dsc == LOCKMOV_SOUND_SPEED
    @lock_mov_dsc = 0 ; Sound.play_cursor ; end
  end
  #———————————————————————————————————————
  #锁标地址更新
  #———————————————————————————————————————
  def update_lock_xy(map_id)
    if map_id
      refresh_window_map_int(map_id)
      @wint_clear = false
    else
      unless @wint_clear
        @window_map_int.contents.clear
        @wint_clear = true
      end
    end
  end
  #———————————————————————————————————————
  #地图信息窗口坐标更新
  #———————————————————————————————————————
  def update_map_int_yof
    if @spr_lock.y >= @graphics_h - (@lock_h + 136)
      @window_map_int.y = @spr_mapint.y = 0
      win_lock_y_set(100)
    elsif @spr_lock.y <= @lock_h + 96
      @window_map_int.y = @spr_mapint.y = @graphics_h - 96
      win_lock_y_set(@graphics_h - 96 - 78)
    end
  end
  #———————————————————————————————————————
  #更新队长动作
  #———————————————————————————————————————
  def update_cap
    @cap_dsc += 1
    if @cap_dsc == CAP_SPEED ; @cap_index += 1 ; @cap_dsc = 0
    @cap_index = 0 if @cap_index >= 3
    @spr_cap.src_rect.x = @zx+@cw*@cap_index ; end
  end
  #———————————————————————————————————————
  #更新锁标“呼吸”
  #———————————————————————————————————————
  def update_lock_zoom
    if @lock_zoom_mr
      @spr_lock.zoom_x += 0.01 ; @spr_lock.zoom_y += 0.01
      @lock_zoom_mr = false if @spr_lock.zoom_x >= (1.0+LOCK_RES_ZR) ; else
      @spr_lock.zoom_x -= 0.01 ; @spr_lock.zoom_y -= 0.01
      @lock_zoom_mr = true if @spr_lock.zoom_x <= (1.0-LOCK_RES_ZR)
    end
  end
  #———————————————————————————————————————
  #更新锁标闪烁
  #———————————————————————————————————————
  def update_lock_flash
    @spr_lock.update ; @lock_flash_dsc += 1
    if @lock_flash_dsc == LOCK_FLASH_SPEED
      @lock_flash_dsc = 0 ; @lock_flash_wb = !@lock_flash_wb
      color = @lock_flash_wb ? LOCK_FLASH_C1 : LOCK_FLASH_C2
      @spr_lock.flash(color,LOCK_FLASH_SPEED)
    end
  end
  #———————————————————————————————————————
  #移动指令窗口
  #———————————————————————————————————————
  def win_movcomm
    #生成实例和方法
    @window_mov_comm = Window_Command.new(0,0)
    @window_mov_comm.set_handler(:move,      method(:movcomm_move))
    @window_mov_comm.set_handler(:cancel,      method(:movcomm_cancel))
    #新建指令
    movcomm_make
    @window_mov_comm.visible = false
    close_window_mov_comm
  end
  #新建指令(同时获取移动传送数据)
  def movcomm_make
    @window_mov_comm.clear_command_list
    @window_mov_comm.add_command("移动", :move, map_mov?(lock_map_id))
    @window_mov_comm.add_command("取消", :cancel, true)
    @window_mov_comm.run_refresh_window(MOVCOMM_WIDTH,MOVCOMM_ALIGN)
  end
  #按下移动时
  def movcomm_move
    close_window_mov_comm
    map_mov(lock_map_id)
  end
  #按下取消时
  def movcomm_cancel
    close_window_mov_comm
  end
  #打开指令窗口
  def open_window_mov_comm
    movcomm_make
    tracklock_window_mov_comm
    @window_mov_comm.visible = true
    @window_mov_comm.open
    @window_mov_comm.activate
  end
  #关闭指令窗口
  def close_window_mov_comm
    @window_mov_comm.close
    @window_mov_comm.deactivate
  end
  #跟踪锁定位置
  def tracklock_window_mov_comm
    wb = @window_mov_comm.width
    hb = @window_mov_comm.height
    base_x = @lock_cx - wb / 2
    base_y = @lock_cy - hb / 2
    x = [[0, base_x].max, @graphics_w - wb].min
    y = [[0, base_y].max, @graphics_h - hb].min
    @window_mov_comm.x = x
    @window_mov_comm.y = y
  end
  #———————————————————————————————————————
  #地图精灵
  #———————————————————————————————————————
  def spr_map_ini
    @spr_map = Sprite.new
    @map = $game_variables[MAP_VSET] == 0 ? MAP_FILE :
    $game_variables[MAP_VSET]
    @map_id = $game_map.instance_variable_get(:@map_id)
    @spr_map.bitmap = Bitmap.new(WMAPS_FOLDER+@map)
  end
  #———————————————————————————————————————
  #锁标精灵
  #———————————————————————————————————————
  def spr_lock_ini
    @spr_lock = Sprite.new
    @spr_lock.bitmap = Bitmap.new(WMAPS_FOLDER+ICON_FILE)
    @spr_lock.z = 6000
    #锁标变量
    @lock_x = 0 ; @lock_y = 0 ; @lock_dx = 0 ; @lock_dy = 0
    @near_min = [] ; @lock_mov_dsc = 0
    @lock_w = @spr_lock.bitmap.width ; @lock_h = @spr_lock.bitmap.height
    @lock_mw = (@lock_w*0.5).truncate  ; @lock_mh = (@lock_h*0.5).truncate
    @lock_flash_dsc = 0 ; @lock_flash_wb = false ; @lock_zoom_mr = true
  end
  #———————————————————————————————————————
  #锁标初始坐标
  #———————————————————————————————————————
  def lock_xy_ini
    lock_xy = LOCKCOM.commxy(@map,@map_id)
    @capxy = lock_xy
    unless lock_xy.instance_of? Array
      @party_vtrue = false
      lock_xy = [@graphics_w/2, @graphics_h/2]
    else
      @party_vtrue = true
    end
    @near_x = lock_xy[0].to_i ; @near_y = lock_xy[1].to_i
    @spr_lock.x = @lock_x = @lock_dx = @near_x - @lock_mw
    @spr_lock.y = @lock_y = @lock_dy = @near_y - @lock_mh ; new_cxy
  end
  #———————————————————————————————————————
  #队长精灵
  #———————————————————————————————————————
  def spr_cap_ini
    #生成队长
    @spr_cap = Sprite.new
    @spr_cap.visible = @party_vtrue
    cap = $game_party.members[0]
    cap_name =  cap ? cap.character_name : "Actor1"
    cap_index = cap ? cap.character_index : 0
    @spr_cap.bitmap = Bitmap.new("Graphics/Characters/"+cap_name)
    #捕捉位置
    @cw = @spr_cap.bitmap.width / 12 ; @ch = @spr_cap.bitmap.height / 8
    @zx = (cap_index%4*3)*@cw ; @zy = (cap_index/4*4)*@ch
    #位图矩形
    @spr_cap.src_rect = Rect.new(@zx, @zy, @cw, @ch)
    #更新数据
    @cap_dsc = 0 ; @cap_index = 0
    cenx = @capxy[0].to_i - @cw / 2
    ceny = @capxy[1].to_i - @ch / 2
    @spr_cap.x,@spr_cap.y = cenx,ceny
  end
  #———————————————————————————————————————
  #锁标坐标窗口
  #———————————————————————————————————————
  def win_lockxy_ini
    return unless ICON_XY_WIN
    @window_lock_xy_false = Window_Base.new(0,240,260,78)
    @window_lock_xy_false.opacity = 0
    c1 = Color.new(255,255,255,128)
    c2 = Color.new(255,255,255,0)
    @window_lock_xy_false.contents.gradient_fill_rect(0, 0, 260, 24, c1, c2)
    @window_lock_xy_false.contents.gradient_fill_rect(0, 26, 260, 24, c1, c2)
    @window_lock_xy = Window_Base.new(0,240,260,78)
    @window_lock_xy.opacity = 0
    win_lock_y_set(100)
    refresh_window_lock_xy
  end
  #———————————————————————————————————————
  #地图信息窗口
  #———————————————————————————————————————
  def win_mapint_ini
    @window_map_int = Window_Base.new(0,0,@graphics_w,96)
    @window_map_int.opacity = 0 if WINSKIN_INFO_FILE
    #更新地图信息
    map_id = lock_map_id
    if map_id
      refresh_window_map_int(map_id)
      @now_map_id = map_id
    else
      @now_map_id = nil
    end
  end
  #———————————————————————————————————————
  #信息窗口皮肤
  #———————————————————————————————————————
  def spr_mapint_ini
    @spr_mapint = Sprite.new
    if WINSKIN_INFO_FILE
      @spr_mapint.bitmap = Bitmap.new(WMAPS_FOLDER+WINSKIN_INFO_FILE)
    else
      @spr_mapint.bitmap = Bitmap.new(1,1)
    end
  end
  #———————————————————————————————————————
  #绘制地图信息
  #———————————————————————————————————————
  def refresh_window_map_int(map_id)
    note = LOCKCOM.comnote(map_id)
    /<INF:(.*?)>/ =~ note.gsub(/\n/){"\\n"} #(/\\n/){"\\e"}
    return unless $1
    note1 = $1.gsub(/\\n/){"\n"}
    #note1 = $1.gsub(/\n/){""}
    #note1 = note1.gsub(/\\e/){"\n"}
    @window_map_int.contents.clear
    @window_map_int.draw_text_ex(4,0,note1)
    /<LSE:(.*?)>/ =~ note
    if $1 && LSE_ON
      play_se $1
    end
  end
  #———————————————————————————————————————
  #绘制锁标地址
  #———————————————————————————————————————
  def refresh_window_lock_xy
    return unless ICON_XY_WIN
    x,y = @lock_x,@lock_y ; cx = @lock_cx ; cy = @lock_cy
    @window_lock_xy.contents.clear
    @window_lock_xy.contents.draw_text(2,0,220,24,"X:#{x} Y:#{y}")
    @window_lock_xy.contents.draw_text(2,24,220,24,"CX:#{cx} CY:#{cy}")
  end
  #———————————————————————————————————————
  #设置坐标位置(Y)
  #———————————————————————————————————————
  def win_lock_y_set(y)
    return unless ICON_XY_WIN
    @window_lock_xy.y = y
    @window_lock_xy_false.y = y
  end
  #———————————————————————————————————————
  #生成背景
  #———————————————————————————————————————
  def map_back
    @map_back = Sprite.new
    @map_back.bitmap = SceneManager.background_bitmap
    @map_back.color.set(16, 16, 16, 128)
  end
  #———————————————————————————————————————
  #处理场景移动
  #———————————————————————————————————————
  def map_mov(map_id)
    MP[map_id].call if MP[map_id]
    x,y,d,swi = *@mov_data
    $game_player.reserve_transfer(map_id, x, y, d)
    $game_player.perform_transfer
    Sound.play_use_skill ; SceneManager.goto(Scene_Map)
  end
  def map_mov?(map_id)
    return false unless map_id
    @mov_data = []
    note = LOCKCOM.comnote(map_id)
    /<MOV:(.*?)>/ =~ note
    return false unless $1
    $1.scan(/\d+/) {|xy| @mov_data << xy.to_i}
    x,y,d,swi = *@mov_data
    swi = swi ? $game_switches[swi] : $game_switches[MAP_WMOVSET]
    if swi && $game_switches[MAP_AMOVSET]
      return true
    else
      return false
    end
  end
  #———————————————————————————————————————
  #获取当前锁定的地图ID
  #———————————————————————————————————————
  def lock_map_id
    @comide[@bit_mapof.get_pixel(@lock_cx,@lock_cy).to_s]
  end
  #———————————————————————————————————————
  #更新锁标中心位置
  #———————————————————————————————————————
  def new_cxy
    @lock_cx = @lock_x + @lock_mw
    @lock_cy = @lock_y + @lock_mh
  end
  #———————————————————————————————————————
  #取得锁标灵敏值
  #———————————————————————————————————————
  def get_lockdis
    dpi_speed = LOCKDIS + @plong * LOCKDIS_RATIO
    if dpi_speed >= LOCKDIS_MAX
      dpi_speed = LOCKDIS_MAX
    else
      dpi_speed = dpi_speed.truncate
    end
    return dpi_speed
  end
  #———————————————————————————————————————
  #生成范围
  #———————————————————————————————————————
  def spr_of_ini
    @spr_mapof = Sprite.new
    @spr_mapof.bitmap = Bitmap.new(@graphics_w,@graphics_h)
    @bit_mapof = @spr_mapof.bitmap
    debug(DEBUG)
    of_file = WMAPS_FOLDER+@map+"_OF.png"
    begin
      of_bitmap = Bitmap.new(of_file)
      @bit_mapof.blt(0,0,of_bitmap,Rect.new(0,0,@graphics_w,@graphics_h))
      of_bitmap.dispose
    rescue
    end
    @comx.each_with_index {|x,i|
    f = @comf ; y = @comy ; id = @comi
    color = @comofc[id]
    @bit_mapof.fill_rect(x-f/2,y-f/2,f,f,color)
    if DEBUG
      color = Color.new(color.red,color.green,color.blue)
      color2 = Color.new(255,255,255,100)
      @spr_debug.bitmap.fill_rect(x-f/2+1,y+1,f,1,color2)
      @spr_debug.bitmap.fill_rect(x+1,y-f/2+1,1,f,color2)
      @spr_debug.bitmap.fill_rect(x-f/2,y,f,1,color)
      @spr_debug.bitmap.fill_rect(x,y-f/2,1,f,color)
    end }
  end
  #———————————————————————————————————————
  #播放SE
  #———————————————————————————————————————
  def play_se(file, vol=100, pitch=100)
    Audio.se_play("Audio/SE/"+file, vol, pitch)
  end
  #———————————————————————————————————————
  #调试模式
  #———————————————————————————————————————
  def debug(tf)
    if tf
    @spr_debug = Sprite.new
    @spr_debug.bitmap = Bitmap.new(@graphics_w,@graphics_h)
    #@spr_lock.bitmap.fill_rect(@lock_mw,@lock_mh,1,1,Color.new(0,0,0,255))
    else ; @spr_mapof.visible = false ; end
    end
  #———————————————————————————————————————
  #释放全部
  #———————————————————————————————————————
  def dispose
    LYA_WMM.__now__scene_self = nil
    @spr_map.bitmap.dispose
    @spr_lock.bitmap.dispose
    @spr_cap.bitmap.dispose
    @spr_map.dispose ; @spr_lock.dispose
    @spr_cap.dispose ; @map_back.dispose
    @window_map_int.dispose
    @window_lock_xy.dispose if ICON_XY_WIN
    @window_lock_xy_false.dispose if ICON_XY_WIN
    @spr_debug.bitmap.dispose if DEBUG
    @spr_debug.dispose if DEBUG
    @spr_mapof.bitmap.dispose
    @spr_mapof.dispose
    @window_mov_comm.dispose
    @spr_mapint.dispose
    @spr_mapint.bitmap.dispose
  end
end
#———————————————————————————————————————
#呼出当前地图数据索引的世界地图界面
#———————————————————————————————————————
def self.scene_call
  file = LOCKCOM.commap_file_party
    if file
      $game_variables[MAP_VSET] = file
      SceneManager.call(Scene_Wmap)
    else
      Sound.play_buzzer
    end
    return file
  end
#———————————————————————————————————————
#读取地图数据
#———————————————————————————————————————
def self.get_oflock_color__note
    mapdata = MAPDATA.split("*DataSet")
    mapdata.each { |data|
    data[/ID:(\d+)/]
    id = $1
    data[/<COLOR:(.*)>/]
    color = $1
    if color
      color = color.split(",")
      r = color[0].to_i
      g = color[1].to_i
      b = color[2].to_i
      o = color[3].to_i
      OFLOCK_COLOR[id.to_i] = Color.new(r,g,b,o)
    end
    MAP_NOTE[id.to_i] = data
    }
  end
  self.get_oflock_color__note
end
#———————————————————————————————————————
#●LOCKCOM
#  *处理全部地图锁标的模块
#———————————————————————————————————————
module LOCKCOM
  #———————————————————————————————————————
  #载入偏量地址源
  #———————————————————————————————————————
  def self.com_set
    @com = {} ; @rof = {}
    LYA_WMM::OFLOCK_XY.each {|key,id|
    com=key[0,3] ; f = key[3] ; rof = f.nil? ? LYA_WMM::OFLOCK : f
    @com[com] = id ; @rof[com] = rof } ; @com
  end
  #———————————————————————————————————————
  #读取全部主、偏量地址源
  #———————————————————————————————————————
  def self.com(map)
    @com ||= LOCKCOM.com_set
    @map ||= Array.new
    unless @map.include?(map) ; @map << map
    LYA_WMM::MAP_NOTE.each {|id,note|
    /<BASE:#{map},(.*?)>/ =~ note ; if $1
    cof=[map] ; $1.scan(/\d+/) {|xy| cof << xy.to_i }
    com=cof[0,3] ; f = cof[3] ; rof = f.nil? ? LYA_WMM::OFLOCK : f
    @com[com] = id ; @rof[com] = rof ; end } ; end
  end
  #———————————————————————————————————————
  #分析地址源为标准数据
  #———————————————————————————————————————
  def self.comdata(map)
    @comxy ||= {}
    @comofc ||= {}
    @comide ||= {}
    unless @comxy.has_key?(map)
    x,y,f,i=[],[],[],[]
    @comofc[map] = {}
    @comide[map] = {}
    oc = LYA_WMM::OFLOCK_COLOR
    @com.each {|key,map_id|
    if key[0] == map
      unless @comofc[map][map_id]
        if oc[map_id] ; LOCKCOM.comio_set(map,map_id,oc[map_id])
        else ; LOCKCOM.comio_rc(map,map_id) ; end
      end
      x<<key[1];y<<key[-1];f<<@rof[key];i<<map_id
    end }
    @comxy[map] = [x,y,f,i] ; end ; return *@comxy[map]
  end
  def self.comio_rc(map,map_id)
    loop { color = LOCKCOM.color
    unless @comofc[map].has_value?(color)
    LOCKCOM.comio_set(map,map_id,color) ; break ; end }
  end
  def self.comio_set(map,map_id,color)
    @comide[map][color.to_s] = map_id
    @comofc[map][map_id] = color
  end
  #———————————————————————————————————————
  #读取指定地图主量坐标
  #———————————————————————————————————————
  def self.commxy(map,map_id)
    map_id = map_id ; until $1
    /<BASE:#{map},(.*?)>/ =~ LYA_WMM::MAP_NOTE[map_id]
    map_id = $data_mapinfos[map_id].parent_id unless $1
    break if map_id == 0 ; end ; $1 ? $1.split(",") : 0
  end
  #———————————————————————————————————————
  #读取所在地图地图文件名
  #———————————————————————————————————————
  def self.commap_file_party
    map_id = $game_map.map_id ; until $1
    /<BASE:(.*?),/ =~ LYA_WMM::MAP_NOTE[map_id]
    map_id = $data_mapinfos[map_id].parent_id unless $1
    break if map_id == 0 ; end ; $1 ? $1 : nil
  end
  #———————————————————————————————————————
  #读取指定地图的备注
  #———————————————————————————————————————
  def self.comnote(map_id)
    @comnote ||= {}
    unless @comnote.has_key?(map_id)
    note = LYA_WMM::MAP_NOTE[map_id]
    @comnote[map_id] = note ; end ; @comnote[map_id]
  end
  #———————————————————————————————————————
  #取得范围色、范围色识别串
  #———————————————————————————————————————
  def self.comofc(map)
    @comofc[map]
  end
  def self.comide(map)
    @comide[map]
  end
  def self.color
    Color.new(rand(255),rand(255),rand(255),84)
  end
end
BEGIN {
module LYA_WMM
  class << self
    attr_accessor :__now__scene_self
    def mov_proc(&block)
      block
    end
  end
end }
#———————————————————————————————————————
#●Scene_Map
#———————————————————————————————————————
class Scene_Map < Scene_Base
  alias :n_update :update
  def update
    n_update
    if Input.trigger?(LYA_WMM::MAP_KEY)
      if $game_switches[LYA_WMM::MAP_WSET]
        Sound.play_ok if LYA_WMM.scene_call
      else
        Sound.play_buzzer
      end
    end
  end
end
#———————————————————————————————————————
#●Window_Command
#———————————————————————————————————————
class Window_Command < Window_Selectable
  #重新更新窗口
  def run_refresh_window(w=window_width, align=nil)
    self.move(self.x, self.y, w, window_height)
    create_contents
    align ? wm_draw_item(align) : draw_all_items
    self.index = 0
  end
  #带align的draw_item
  def wm_draw_item(align)
    item_max.times {|i| index = i
    change_color(normal_color, command_enabled?(index))
    draw_text(item_rect_for_text(index), command_name(index), align) }
  end
end
#———————————————————————————————————————
#●Scene_ItemBase
#———————————————————————————————————————
class Scene_ItemBase < Scene_MenuBase
  alias :old_use_item :use_item
  def use_item
    old_use_item
    /<SC:(.*?)>/ =~ item.note.gsub(/\n/){"\\n"}
    sc = $1.gsub(/\\n/){"\n"}
    instance_eval sc if sc
  end
end
#————————————————————————————————————————
#●F12 清除储存组
#————————————————————————————————————————
module SceneManager
  class << self
    if method_defined?(:run)
      alias :wmm_old_run :run;
       def run
         LYA_WMM.__now__scene_self = nil
         wmm_old_run
       end
    end
  end
end
#————————————————————————————————————————
#●是否使用鼠标补丁
#————————————————————————————————————————
if LYA_WMM::MOUSE_PATCH
eval %<
class LYA_WMM::Scene_Wmap
  alias :n_update_GI :update_GI
  def update_GI ; n_update_GI ; update_mouse ; end
  def new_cxy ; @lock_cx = @lock_x ; @lock_cy = @lock_y ; end
  def update_mouse
    if @mx != Mouse.x || @my != Mouse.y
      @mx = Mouse.x ; @my = Mouse.y
      @lock_x = @spr_lock.x = @mx
      @lock_y = @spr_lock.y = @my
      update_data
    end
  end
end
>
end
[/pre][/fold]
[fold=LYA_WMM_Mask 1.3 遮罩插件]
[pre lang="ruby"]
#————————————————————————————————————————
# ●LYA_WMM By.Lyaci
#   *世界地图界面 遮罩插件v1.3
#   -用于单/多个世界地图的遮罩处理
#   -适用于 RPG MAKER ACE ~ LYA_WMM 2.2以上版本 放置于主脚本之下
#————————————————————————————————————————
=begin
————————————————————————————————————————
基本使用:
在世界地图素材文件夹里 带 "_MASK"后缀的图片即为遮罩层
最好在主角到新地图时执行一次该区域的“减少遮罩”
比如要设置“已探索”(范例里)时,可以放在这个变量前后


事件脚本或脚本
减少遮罩 LYA_WMM.sub_mask(wmap_file, x, y, unmask_file, otake)
添加遮罩 LYA_WMM.add_mask(wmap_file, x, y, unmask_file, otake)
wmap_file:世界地图图片名
x y:初始坐标(会自动纠正为中心位置)
unmask_file:反遮罩、遮罩图片名
otake:透明过滤值 默认为0
理论上每句调用一次即可

清除整张遮罩图(包括数据) LYA_WMM.clear_mask(wmap_file)
一般用于探索完毕后的整体清除(可以不用)
复位遮罩图(重新开启绘制) LYA_WMM.re_mask(wmap_file)
清除后再使用复位即可重新初始化遮罩图(用于二周目或其他)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
特别说明:
使用遮罩波动效果时 请把遮罩图左右各增长MASK_WAVE_AMP设置的像素
遮罩数据保存在MDAT/文件夹下 要修改转到MASK_DATA_DIR
为了保证FPS PIXINT_MAX请不要设置过大
————————————————————————————————————————
*Ver
Ver:1.0 Date:2019.9.9 ~ Ver:1.3 Date:2019.9.14
————————————————————————————————————————
声明:
本体与拓展脚本可用于非商业、商业,使用和转载请保留此信息
=end
#————————————————————————————————————————
module LYA_WMM
  #————————————————————————————————————————
  #●内部设置
  #————————————————————————————————————————
  MASK_WAVE = true                   #遮罩波动效果
  MASK_WAVE_AMP = 10                 #波的振幅
  MASK_WAVE_LENGTH = 300             #波长
  MASK_MAP_MAX = 5                   #遮罩位图储存组容量
  MASK_OTAKE = 64                    #遮罩判断透明过滤值(需大于0)
  PIXINT_MAX = 500                   #协处理像素量/帧(建议300~1500)
  MASK_FILE_EXT = "_MASK.png"        #遮罩命名格式
  MASK_AS_TEST = true               #绘制速度调试模式
  MASK_AUTO_INT = 90                 #遮罩数据自动处理间隔/帧(*停用)
  #————————————————————————————————————————
  #●容器
  #————————————————————————————————————————
  MASK_BITMAP = []                   #储存组
  MASK_BITMAP_INDEX = {}             #储存组索引
#———————————————————————————————————————
#●主界面的追加定义
#———————————————————————————————————————
class Scene_Wmap
  #———————————————————————————————————————
  #添加数据
  #———————————————————————————————————————
  alias :ma_old_data :data
  def data
    ma_old_data
    #生成遮罩
    spr_mask_ini
    #更新一次锁标信息
    update_oflock
  end
  #———————————————————————————————————————
  #生成遮罩精灵
  #———————————————————————————————————————
  def spr_mask_ini
    @mask_wave = MASK_WAVE
    #取得遮罩图文件
    mask_file = WMAPS_FOLDER+@map+MASK_FILE_EXT
    begin
    @spr_mask = Sprite.new
    #遮罩位图不在储存组时 重新添加
    unless LYA_WMM.get_mask_bitmap(@map)
      LYA_WMM.set_mask_bitmap(@map, Bitmap.new(mask_file))
    end
    LYA_WMM.run_MASK_DATA(@map) unless MASK_AS_TEST
    @spr_mask.bitmap = LYA_WMM.get_mask_bitmap(@map)
    @bit_mask = @spr_mask.bitmap
    @spr_mapint.z = @spr_mask.z + 1
    if @mask_wave
      @spr_mask.x -= MASK_WAVE_AMP
      @spr_mask.wave_amp = MASK_WAVE_AMP
      @spr_mask.wave_length = MASK_WAVE_LENGTH
    end
    rescue
    #没有遮罩图时
    @mask_wave = false
    end
  end
  #———————————————————————————————————————
  #画面、输入更新
  #———————————————————————————————————————
  alias :ma_old_update_GI :update_GI
  def update_GI
    ma_old_update_GI
    @spr_mask.update if @mask_wave
  end
  #———————————————————————————————————————
  #释放全部
  #———————————————————————————————————————
  alias :ma_old_dispose :dispose
  def dispose
    ma_old_dispose
    @spr_mask.dispose if @spr_mask
  end
  #———————————————————————————————————————
  #范围更新(覆盖)
  #———————————————————————————————————————
  def update_oflock ; new_cxy
    if @bit_mapof.get_pixel(@lock_cx,@lock_cy).alpha != 0 && mask?
      @new_map_id = lock_map_id
      if @new_map_id != @now_map_id
        @now_map_id = @new_map_id
        update_lock_xy(@now_map_id)
      end
    else
      @now_map_id = nil ; update_lock_xy(nil)
    end
  end
  #———————————————————————————————————————
  #遮罩透明过滤
  #———————————————————————————————————————
  def mask?
    return true unless @bit_mask
    @bit_mask.get_pixel(@lock_cx,@lock_cy).alpha < MASK_OTAKE
  end
end
#———————————————————————————————————————
#●储存遮罩数据的实例
#———————————————————————————————————————
class MASK_DATA
  attr_accessor :mask_data
  attr_accessor :mask_data_bitmap_clear
  def initialize
    @mask_data = {} #{""=>{[]=>""} }
    @mask_data_bitmap_clear = {} #{""=>bool}
  end
end
#———————————————————————————————————————
#●储存组和遮罩数据的实际处理
#———————————————————————————————————————
class << self
  attr_accessor :fiber_mask          #协处理遮罩数据纤程
  attr_accessor :wait_run_mask_data  #待处理的数据
  LYA_WMM.wait_run_mask_data = []    #初始化待处数据
  #———————————————————————————————————————
  #代入待处理数据(同时生成纤程)
  #———————————————————————————————————————
  def wait_run_mask_data=(new_wrma)
    @wait_run_mask_data = new_wrma
    unless @wait_run_mask_data.empty? && @fiber_mask
      make_auto_mask_fiber_mask
    end
  end
  #———————————————————————————————————————
  #生成自动处理遮罩数据的纤程
  #———————————————————————————————————————
  def make_auto_mask_fiber_mask
    @fiber_mask ||= Fiber.new {
    loop { fiber_mask_MASK_DATA }}
  end
  #———————————————————————————————————————
  #从头部进行处理遮罩数据/项(全部)
  #———————————————————————————————————————
  def fiber_mask_MASK_DATA
    #p @wait_run_mask_data
    data = @wait_run_mask_data[0]
    if data
      @__now__wait_run_mask_data = data #当前协处理的数据
      run_mask_bitmap_as(*data, true)
      @wait_run_mask_data.shift
    else
      #数据处理完毕 暂停纤程
      Fiber.yield
      @fiber_mask = nil
      #更新一次界面
      @__now__scene_self.update_oflock if @__now__scene_self && MASK_AS_TEST
    end
  end
  #———————————————————————————————————————
  #立即处理指定遮罩数据/组(指定遮罩图)
  #———————————————————————————————————————
  def run_MASK_DATA(map)
    maskd = @mask_data_object.mask_data
    return unless maskd[map]
    #暂停纤程
    #@fiber_mask = nil
    #计算未处理的全部数据
    datas = maskd[map].keys
    datas = @wait_run_mask_data & datas
    datas = datas - @__now__wait_run_mask_data
    datas.each {|data|
    run_mask_bitmap_as(*data, false) }
    #删除已计算的待数据
    self.wait_run_mask_data = @wait_run_mask_data - datas
  end
  #———————————————————————————————————————
  #清除储存组、暂停纤程
  #———————————————————————————————————————
  def mask_bitmap_clear
    MASK_BITMAP.clear
    MASK_BITMAP_INDEX.clear
    @fiber_mask = nil
    @wait_run_mask_data.clear
  end
  #———————————————————————————————————————
  #添加遮罩位图到储存组
  #———————————————————————————————————————
  def set_mask_bitmap(map, bitmap)
    unless MASK_BITMAP_INDEX[map]
      #自动释放
      self.mask_auto_dispose
      #添加位图到组
      MASK_BITMAP << bitmap
      MASK_BITMAP_INDEX[map] = MASK_BITMAP.index(bitmap)
      #清除标记打开时
      mask_clear = @mask_data_object.mask_data_bitmap_clear
      if mask_clear[map]
        bitmap.clear
        return
      end
      #添加对应待处理数据
      maskd = @mask_data_object.mask_data
      return unless maskd[map]
      datas = maskd[map].keys
      self.wait_run_mask_data = @wait_run_mask_data | datas
    end
  end
  #———————————————————————————————————————
  #取得储存组指定遮罩位图
  #———————————————————————————————————————
  def get_mask_bitmap(map)
    index = MASK_BITMAP_INDEX[map]
    return MASK_BITMAP[index] if index
    return nil
  end
  #———————————————————————————————————————
  #删除指定遮罩位图
  #———————————————————————————————————————
  def del_mask_bitmap(map)
    index = MASK_BITMAP_INDEX[map]
    if index
      MASK_BITMAP[index].dispose
      MASK_BITMAP.delete_at(index)
      MASK_BITMAP_INDEX.delete(map)
    end
  end
  #———————————————————————————————————————
  #储存组的自动释放
  #———————————————————————————————————————
  def mask_auto_dispose
    if MASK_BITMAP.size >= MASK_MAP_MAX
      #清除储存组容器
      map_key = MASK_BITMAP_INDEX.index(MASK_BITMAP[0])
      MASK_BITMAP_INDEX.delete(map_key)
      MASK_BITMAP[0].dispose
      MASK_BITMAP.delete_at(0)
      #清除对应待处理数据
      maskd = @mask_data_object.mask_data
      return unless maskd[map_key]
      datas = maskd[map_key].keys
      self.wait_run_mask_data = @wait_run_mask_data - datas
    end
  end
end
#———————————————————————————————————————
#●定义了执行遮罩处理的用户与内部方法 & 遮罩数据的读写
#———————————————————————————————————————
MASK_DATA_DIR = "MDAT/"
Dir::mkdir(MASK_DATA_DIR) unless File.directory? MASK_DATA_DIR
class << self
  attr_accessor :mask_data_object
  attr_accessor :mask_data__dup
  LYA_WMM.mask_data__dup = {}
  #———————————————————————————————————————
  #执行遮罩、反遮罩(内部用)
  #———————————————————————————————————————
  def run_mask_bitmap_as(wmap_file, x, y, unmask_file, sub=true, otake=0, fiber_mask)
    #设置并检查遮罩图
    mask_file = WMAPS_FOLDER+wmap_file+MASK_FILE_EXT
    #遮罩位图不在储存组时 重新添加
    unless get_mask_bitmap(wmap_file)
      set_mask_bitmap(wmap_file, Bitmap.new(mask_file))
    end
    obj = get_mask_bitmap(wmap_file)
    unmask_obj = Bitmap.new(WMAPS_FOLDER+unmask_file)
    ox = unmask_obj.width / 2
    oy = unmask_obj.height / 2
    x = x - ox
    y = y - oy
    #开始反或遮
    if sub
      obj.object_subtract(x,y,unmask_obj,otake,fiber_mask)
    else
      obj.object_addition(mask_file,x,y,unmask_obj,otake,fiber_mask)
    end
  end
  #———————————————————————————————————————
  #减少遮罩(用户用)
  #———————————————————————————————————————
  def sub_mask(wmap_file, x, y, unmask_file, otake=0)
    #run_mask_bitmap_as(wmap_file, x, y, unmask_file, otake) #直接执行
    @mask_data_object.mask_data[wmap_file] ||= {}
    data = [wmap_file, x, y, unmask_file, true, otake]
    @mask_data_object.mask_data[wmap_file][data] = wmap_file
    self.wait_run_mask_data = @wait_run_mask_data | [data]
  end
  #———————————————————————————————————————
  #添加遮罩(用户用)
  #———————————————————————————————————————
  def add_mask(wmap_file, x, y, unmask_file, otake=256)
    #run_mask_bitmap_as(wmap_file, x, y, unmask_file, otake) #直接执行
    @mask_data_object.mask_data[wmap_file] ||= {}
    data = [wmap_file, x, y, unmask_file, false, otake]
    @mask_data_object.mask_data[wmap_file][data] = wmap_file
    self.wait_run_mask_data = @wait_run_mask_data | [data]
  end
  #———————————————————————————————————————
  #清空遮罩图并删除数据(用户用)
  #———————————————————————————————————————
  def clear_mask(wmap_file)
    obj = get_mask_bitmap(wmap_file)
    @mask_data_object.mask_data_bitmap_clear[wmap_file] = true
    if @mask_data_object.mask_data[wmap_file].is_a? Hash
      @mask_data_object.mask_data[wmap_file].clear
    end
    obj.clear if obj
  end
  #———————————————————————————————————————
  #复位遮罩图(用户用)
  #———————————————————————————————————————
  def re_mask(wmap_file)
    del_mask_bitmap(wmap_file)
    @mask_data_object.mask_data_bitmap_clear[wmap_file] = false
  end
  #———————————————————————————————————————
  #写入遮罩数据
  #———————————————————————————————————————
  def write_maskd(index)
    File.open(get_maskd_file(index), "wb") do |file|
      Marshal.dump(@mask_data_object, file)
    end
  end
  #———————————————————————————————————————
  #读取遮罩数据 index为-1时 新建实例
  #———————————————————————————————————————
  def read_maskd(index)
    begin
      #读取全部数据
      @mask_data_object = load_data(get_maskd_file(index))
      #添加全部数据到待处理的纤程中
      @mask_data_object.mask_data.each {|map, data_hash|
      self.wait_run_mask_data = @wait_run_mask_data.concat data_hash.keys }
      return @mask_data_object
    rescue
      #新建数据实例
      @mask_data_object = MASK_DATA.new
      return @mask_data_object
    end
  end
  #———————————————————————————————————————
  #取得路径与文件名
  #———————————————————————————————————————
  def get_maskd_file(index)
    return MASK_DATA_DIR + "Mask_Data#{index+1}.wmm"
  end
end
#LYA_WMM.read_maskd(-1)
end
#———————————————————————————————————————
#●定义位图遮罩、反遮罩的着色计算
#———————————————————————————————————————
class Bitmap
  PIXINT_MAX = LYA_WMM::PIXINT_MAX
  @@pix_int = 0
  #————————————————————————————————————————
  #*以一个位图对象做减法着色作用在本位图
  #————————————————————————————————————————
  #x:位图x y:位图y bitmap_obj:位图对象 otake:透明度过滤值 默认0 fiber:使用纤程
  #bitmap_obj会在结束时释放
  def object_subtract(x, y, bitmap_obj, otake=0, fiber=false)
    @@fiber_mask = fiber
    bitmap_obj.width.times{|bx|
    bitmap_obj.height.times{|by|
    self_color = self.get_pixel(bx+x, by+y)
    if self_color.alpha > otake
      obj_color = bitmap_obj.get_pixel(bx,by)
      self_color.alpha = self_color.alpha - obj_color.alpha
      self.set_pixel(bx+x, by+y,self_color)
    end
    @@pix_int+=1
    if @@fiber_mask && @@pix_int > PIXINT_MAX
      Fiber.yield
      @@pix_int = 0
    end
    }}
    @@pix_int = 0
    bitmap_obj.dispose
  end
  #————————————————————————————————————————
  #*以一个位图对象做加法着色作用在本位图
  #————————————————————————————————————————
  #x:位图x y:位图y bitmap_obj:位图对象 otake:透明度过滤值 默认255 fiber:使用纤程
  #ori_file:必须指向一个原始图 bitmap_obj会在结束时释放
  def object_addition(ori_file, x, y, bitmap_obj, otake=255, fiber=false)
    @@fiber_mask = fiber
    bitmap_temp = Bitmap.new(ori_file)
    bitmap_obj.width.times{|bx|
    bitmap_obj.height.times{|by|
    self_color = self.get_pixel(bx+x, by+y)
    if self_color.alpha < otake
      obj_color = bitmap_obj.get_pixel(bx,by)
      temp_color = bitmap_temp.get_pixel(bx+x,by+y)
      temp_color.alpha = self_color.alpha + obj_color.alpha
      self.set_pixel(bx+x, by+y,temp_color)
    end
    @@pix_int+=1
    if @@fiber_mask && @@pix_int > PIXINT_MAX
      Fiber.yield
      @@pix_int = 0
    end
    }}
    @@pix_int = 0
    bitmap_obj.dispose
    bitmap_temp.dispose
  end
end
#————————————————————————————————————————
#●F12 清除储存组
#————————————————————————————————————————
module SceneManager
  class << self
    if method_defined?(:run)
      alias :ma_old_run :run;
       def run
         LYA_WMM.mask_bitmap_clear
         ma_old_run
       end
    end
  end
end
#————————————————————————————————————————
#●主更新 切换环境
#————————————————————————————————————————
module Graphics
  class << self
    alias_method :ma_old_update,:update
    def update
      LYA_WMM.fiber_mask.resume if LYA_WMM.fiber_mask
      ma_old_update
    end
  end
end
#————————————————————————————————————————
#●新游戏、保存和读取
#————————————————————————————————————————
module DataManager
class << self
  alias :ma_old_setup_new_game :setup_new_game
  def setup_new_game
    LYA_WMM.read_maskd(-1)
    ma_old_setup_new_game
  end
  alias :ma_old_save_game_without_rescue :save_game_without_rescue
  def save_game_without_rescue(index)
    LYA_WMM.write_maskd(index)
    ma_old_save_game_without_rescue(index)
  end
  alias :ma_old_load_game_without_rescue :load_game_without_rescue
  def load_game_without_rescue(index)
    LYA_WMM.read_maskd(index)
    ma_old_load_game_without_rescue(index)
  end
end
end
[/pre][/fold]
[fold=LYA_WMM_MPic 1.2 图层插件]
[pre lang="ruby"]
#————————————————————————————————————————
# ●LYA_WMM By.Lyaci
#   *世界地图界面 图层插件v1.2
#   -用于单/多个世界地图的自由添加图片
#   -适用于 RPG MAKER ACE ~ LYA_WMM 2.2以上版本  放置于主脚本之下
#————————————————————————————————————————
=begin
————————————————————————————————————————
基本使用:
事件脚本或脚本
删除图片 LYA_WMM.del_pic(pic_file)
添加图片 LYA_WMM.add_pic(pic_file, x, y, z, o, blend_type)
pic_file:要添加/删除的图片名
pic_file带有【&】时 后面为指定地图图片才会显示,省略【&】时总是显示该图
x y:初始坐标
z:优先级 默认0
o:初始不透明度 默认255
blend_type:合成方式 默认为0
一张图片名只指向一个数据,重新使用的话只会使用新数据而不是再增加一张一样的图

定义显示规则请转到 PICPROC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
特别说明:
使用PICPROC时要注意格式为哈希表 确认分隔标点是否存在
图片数据保存在MDAT/文件夹下 要修改转到MPIC_DATA_DIR
为了保证安全性该数据只是几个参数不包含PICPROC
————————————————————————————————————————
*Ver
Ver:1.0 Date:2019.9.9 ~ Ver:1.2 Date:2019.9.14
————————————————————————————————————————
声明:
本体与拓展脚本可用于非商业、商业,使用和转载请保留此信息
=end
#————————————————————————————————————————
module LYA_WMM
  #————————————————————————————————————————
  #●自定义规则
  #————————————————————————————————————————
  # 图片名 => self.mov_proc {|spr| } 生成一个块 spr为精灵 该块每帧更新
  # self.mpic_proc_end(图片名) 移除更新中的该块,用于移动结束后 可不设
  PICPROC = {
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  "pic_fname" => self.mov_proc {|spr|  #风之城名称图片移动规则
  if spr.x < 264
    spr.x += 5
  else
    self.mpic_proc_end("pic_fname")    #结束时停止该块
  end
  },
  
  "pic_yname" => self.mov_proc {|spr|  #仪式之地名称图片移动规则
  if spr.opacity < 255
    spr.opacity  += 5
  else
    self.mpic_proc_end("pic_yname")    #结束时停止该块
  end
  }
  #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  }
#———————————————————————————————————————
#●主界面的追加定义
#———————————————————————————————————————
class Scene_Wmap
  attr_reader :spr_mpic_proc
  #———————————————————————————————————————
  #添加数据
  #———————————————————————————————————————
  alias :mp_old_data :data
  def data
    mp_old_data
    #生成图片精灵组
    spr_mpic_ini
  end
  #———————————————————————————————————————
  #生成图片精灵组
  #———————————————————————————————————————
  def spr_mpic_ini
    @spr_mpic = []
    @spr_mpic_proc = []
    LYA_WMM.mpic_data_object.mpic_data.each {|k, v|
    file = k
    if k[/&/]
      k[/(.*)&(.*)/]
      next unless $2 == @map
      file = $1
    end
    bitmap = Bitmap.new(WMAPS_FOLDER+file)
    sprite = Sprite.new
    sprite.bitmap = bitmap
    sprite.x = v[0]
    sprite.y = v[1]
    sprite.z = v[2]
    sprite.opacity = v[3]
    sprite.blend_type = v[4]
    @spr_mpic << sprite
    @spr_mpic_proc << PICPROC[file]
    }
  end
  #———————————————————————————————————————
  #画面、输入更新
  #———————————————————————————————————————
  alias :mp_old_update_GI :update_GI
  def update_GI
    mp_old_update_GI
    #执行自定义块
    @spr_mpic_proc.each_with_index {|proc, index|
    next unless proc
    spr = @spr_mpic[index]
    proc.call(spr) }
  end
  #———————————————————————————————————————
  #释放全部
  #———————————————————————————————————————
  alias :mp_old_dispose :dispose
  def dispose
    mp_old_dispose
    @spr_mpic.each {|spr| spr.dispose ; spr.bitmap.dispose }
  end
end
#———————————————————————————————————————
#●储存图片数据的实例
#———————————————————————————————————————
class MPIC_DATA
  attr_accessor :mpic_data
  def initialize
    @mpic_data = {} #{""=>[]}
  end
end
#———————————————————————————————————————
#●定义了添加图片显示的用户与内部方法 & 遮罩数据的读写
#———————————————————————————————————————
MPIC_DATA_DIR = "MDAT/"
Dir::mkdir(MPIC_DATA_DIR) unless File.directory? MPIC_DATA_DIR
class << self
  attr_accessor :mpic_data_object
  def mpic_proc_end(pic_file)
    @__now__scene_self.spr_mpic_proc
    proc = PICPROC[pic_file]
    index = @__now__scene_self.spr_mpic_proc.index(proc)
    @__now__scene_self.spr_mpic_proc[index] = nil
  end
  #———————————————————————————————————————
  #减少图片(用户用)
  #———————————————————————————————————————
  def del_pic(pic_file)
    @mpic_data_object.mpic_data.delete pic_file
  end
  #———————————————————————————————————————
  #添加图片(用户用)
  #———————————————————————————————————————
  def add_pic(pic_file, x, y, z=0, o=255, blend_type=0)
    data = [x, y, z, o, blend_type]
    @mpic_data_object.mpic_data[pic_file] = data
  end
  #———————————————————————————————————————
  #写入图片数据
  #———————————————————————————————————————
  def write_mpicd(index)
    File.open(get_mpicd_file(index), "wb") do |file|
      Marshal.dump(@mpic_data_object, file)
    end
  end
  #———————————————————————————————————————
  #读取图片数据 index为-1时 新建实例
  #———————————————————————————————————————
  def read_mpicd(index)
    begin
      #读取全部数据
      @mpic_data_object = load_data(get_mpicd_file(index))
      return @mpic_data_object
    rescue
      #新建数据实例
      @mpic_data_object = MPIC_DATA.new
      return @mpic_data_object
    end
  end
  #———————————————————————————————————————
  #取得路径与文件名
  #———————————————————————————————————————
  def get_mpicd_file(index)
    return MPIC_DATA_DIR + "Mpic_Data#{index+1}.wmm"
  end
end

end
#————————————————————————————————————————
#●新游戏、保存和读取
#————————————————————————————————————————
module DataManager
class << self
  alias :mp_old_setup_new_game :setup_new_game
  def setup_new_game
    LYA_WMM.read_mpicd(-1)
    mp_old_setup_new_game
  end
  alias :mp_old_save_game_without_rescue :save_game_without_rescue
  def save_game_without_rescue(index)
    LYA_WMM.write_mpicd(index)
    mp_old_save_game_without_rescue(index)
  end
  alias :mp_old_load_game_without_rescue :load_game_without_rescue
  def load_game_without_rescue(index)
    LYA_WMM.read_mpicd(index)
    mp_old_load_game_without_rescue(index)
  end
end
end
[/pre][/fold]
高级版(ex)的数据是在脚本里统一设置,标准版是在地图编辑器备注里设置
ps.古董版虽然不兼容新版 但是范例内容具有不同的灵感
pss.最后这个居然又又又更新了


0.jpg
5.jpg
2.jpg
6.jpg
[fold=旧]
jm.jpg
ts.jpg
sz.jpg
p.jpg
[/fold]
ps.编辑比较赶 可能有错误的地方 待补充

评分

参与人数 1星屑 +500 收起 理由
VIPArcher + 500 原创发布

查看全部评分

david_ng223 该用户已被删除
发表于 2019-9-6 22:33:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

梦石
1
星屑
22078
在线时间
4885 小时
注册时间
2014-12-22
回帖
1509

开拓者

发表于 2019-9-7 18:27:38 | 显示全部楼层
本帖最后由 shencao 于 2019-9-7 18:44 编辑

大致看了下范例,效果挺好的,帮忙写一些使用者可能会关心的:

在游戏中:
* 可以做一个物品打开地图(脚本说明里 设置步骤:4)
* 可以做“快捷键”打开地图(可设定快捷键,可用开关控制启用状态)
* (当然也可以做到菜单选项里,需要自行写脚本or利用一些其他脚本)
* 可以做多张世界地图

在世界地图上:
* 显示角色当前所在地(在地图的“备注名称”备注)
* 光标移动到不同区域显示说明文字(在地图的“备注栏”备注,可带控制符,可替换窗口背景)
* 特效版的光标自带华丽特效(喂)
* 光标移动自带加速度(其实我不太喜欢这个效果,速度不恒定不容易判断光标停下的位置。不过距离远的时候更方便一些吧)
* 可以选择目标地点传送(在目标地的地图“备注栏”备注,可用开关控制是否允许传送)

调试模式(我开始没搞懂所以也写一下方便其他人~):
脚本里76行: DEBUG = true (范例里为false,改为true)
开启控制台测试游戏
打开世界地图,光标移动到某区域,按F5,输出坐标等信息
设置完毕后,DEBUG = false (数据设置完后请关闭DEBUG)

另外我有点没搞清楚多个世界地图的部分(虽然这些实际做一下应该就明白了,不过我懒得做一个测试的地图文件所以……)
1)若地图01的标题备注<NAME1,X,Y>
是不是这个NAME1=世界地图文件名=角色在地图01上默认打开的是世界地图NAME1?队长行走图就显示在世界地图NAME1的X,Y位置
若改变MAP_VSET对应的变量的内容为“NAME2”,之后呼出界面,则可以打开世界地图NAME2?(这个时候是不是就没有队长行走图了)
但如果是地图上用快捷键呼出世界地图,则只会在地图01打开NAME1世界地图
↑
是这样咩?
2)不同的世界地图怎么怎么设定“地图ID => 颜色”?或者意思是,不同的世界地图不同区块也要用不同的颜色,全部都用不重复的颜色?是这样咩?
以及这里设定的用意……我猜意思是不是,当光标在这个颜色范围内,在世界地图上显示的内容就会取自“地图ID”这个地图的设置?而移动、说明文字等则在地图备注里设定(那为啥不干脆全部都在脚本里设定呢……我感觉会方便很多哎。思路不同吧?←这里就随便一说,不代表要作者修改的意思!)

脚本说明里的“深入使用”这部分看不懂(。)

啊还有,特效版的光标是个羽毛笔,一般来说视觉上会默认笔尖部分是触发点,不过实际似乎是图片的中心?在细小的地方会有点错位感。
用其他光标就没有这个问题(配合呼吸特效也显眼)手感更好~

~~~~~~~~~~~~~~~~~~~~~~~~~
以上是我自己比较关注的部分。一些我自己不需要的(比如坐标)没仔细看。

就我的感受来说,设置不是很方便吧,需要在脚本、地图名称、地图备注栏三个地方分别设定。
如果从工程一开始就使用这个系统,那感觉应该还可以的,不算太麻烦~;但如果是中途加入,地图还多的话,就……

顶楼里“*注意 这里的容易是指脚本基础(基本不需要)”,我感觉基本不需要可能不太行吧……我懂一点点脚本,也懂做图,但是看范例也有点卡住。(会脚本的人无法理解不会脚本的人看说明有多迷茫!!!XD
制作蒙版也需要多一点美术方面的技能。
而且都要自己手动制作蒙版图片了,制作图片的时候记下颜色信息,比事后F5方便多了哎。(就是透明度那里可能会有点偏差。都用255就没问题了!)

整体感觉,还是适合进阶一点的制作者吧~


评分

参与人数 1星屑 +250 收起 理由
VIPArcher + 250 赞热心提供的使用说明

查看全部评分

回复

使用道具 举报

梦石
0
星屑
2427
在线时间
87 小时
注册时间
2018-1-3
回帖
10
 楼主| 发表于 2019-9-8 21:58:15 | 显示全部楼层
本帖最后由 路路 于 2019-9-8 22:08 编辑
shencao 发表于 2019-9-7 18:27
大致看了下范例,效果挺好的,帮忙写一些使用者可能会关心的:

在游戏中:


*关于光标加速度 不想要可以在设置里设置初速度和最大速度一样即可
答1:是的 不显示队长了。更改MAP_VSET后就等同于打开(查看)另一张地图 传送功能什么的都在,只是队长不显示了

答2:需要使用不同的颜色(颜色的逻辑在最上层)。全部写在脚本里 数据就要预处理(有可能会降低效率 未测试极限点)
也于“可视化”有关吧 再三考量就把初版数据设计到不同地方

*关于答2 已经更新EX版本,设置统一到了脚本里 以字符串设置地图整体数据,大体格式继承标准版

*进阶不进阶不重要,总之不适合想一键生成的同学。美术方面也可以画简易的类型(路径总会画……吧?)
回复

使用道具 举报

梦石
1
星屑
22078
在线时间
4885 小时
注册时间
2014-12-22
回帖
1509

开拓者

发表于 2019-9-9 13:41:29 | 显示全部楼层
本帖最后由 shencao 于 2019-9-9 13:47 编辑
路路 发表于 2019-9-8 21:58
*关于光标加速度 不想要可以在设置里设置初速度和最大速度一样即可
答1:是的 不显示队长了。更改MAP_VSE ...


高级版来得太快了吧?!大佬牛啤啊~!
(我还没上手用,能用rm的电脑不在手边)
都放在脚本里设定能省出很多打开地图的时间。
以及非常重要的,我用了ulds,地图备注栏已经塞不下啦~!(要塞是能塞,就是很不容易查找/修改⋯⋯咳)
能独立设置真是帮了大忙XD

* 全部写在脚本里 数据就要预处理(有可能会降低效率 未测试极限点)
我也还没用⋯⋯加粗供有需要的人参考吧~

光标加速度明白了,我之前没仔细看说明XD
颜色也明白了。
虽然我目前在做的工程可能不会用上,不过总之先感谢大佬~!

点评

哇,感谢通知~!  发表于 2019-9-14 00:52
今天更新了遮罩插件和添加图片插件  发表于 2019-9-13 20:11
回复

使用道具 举报

梦石
0
星屑
669
在线时间
77 小时
注册时间
2022-7-29
回帖
37
发表于 2023-7-21 15:30:40 | 显示全部楼层
首先感谢大佬制作的插件。但是在使用后与其他如“任务系统”,“合成系统”脚本有冲突。
冲突在LYA_WMM 2.2ex脚本的980行

#———————————————————————————————————————
#●Scene_ItemBase
#———————————————————————————————————————
class Scene_ItemBase < Scene_MenuBase
  alias :old_use_item :use_item
  def use_item
    old_use_item
    /<SC:(.*?)>/ =~ item.note.gsub(/\n/){"\\n"}
    sc = $1.gsub(/\\n/){"\n"}
    instance_eval sc if sc
  end
end

中的“ sc = $1.gsub(/\\n/){"\n"}”
回复

使用道具 举报

梦石
0
星屑
669
在线时间
77 小时
注册时间
2022-7-29
回帖
37
发表于 2023-7-21 16:14:45 | 显示全部楼层
    sc = $1.gsub(/\\n/){"\n"}if $1

改成这个就好用了
回复

使用道具 举报

梦石
0
星屑
95
在线时间
94 小时
注册时间
2021-4-23
回帖
37
发表于 2023-8-3 07:24:46 | 显示全部楼层
$1.没有中心句,所以if $1,后卫gsub(/\\n/){"\n"}(找操
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部