| 赞 | 8 |
| VIP | |
| 好人卡 | |
| 积分 | 24 |
| 经验 | |
| 最后登录 | 2022-11-9 |
| 在线时间 | 87 小时 |
- 梦石
- 0
- 星屑
- 2427
- 在线时间
- 87 小时
- 注册时间
- 2018-1-3
- 回帖
- 10
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 路路 于 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.最后这个居然又又又更新了
[fold=旧]
[/fold]
ps.编辑比较赶 可能有错误的地方 待补充 |
评分
-
查看全部评分
|