| 赞 | 46 |
| VIP | |
| 好人卡 | |
| 积分 | 329 |
| 经验 | |
| 最后登录 | 2026-2-3 |
| 在线时间 | 248 小时 |
- 梦石
- 24
- 星屑
- 8942
- 在线时间
- 248 小时
- 注册时间
- 2020-12-4
- 回帖
- 259
  
|
发表于 2023-6-8 13:17:40
|
显示全部楼层
本帖最后由 纯属小虫 于 2023-6-8 13:24 编辑
试了下窗口放大,特别完美!
应该能够完全平替之前用过的一个画面放大脚本了。
原画面放大脚本1[pre lang="ruby"]# Win32Tools by Fux2
# 欢迎访问rpg.blue获取更多RPG Maker资源
# 发布、转载时请保留此处文字
class String
def address
[self].pack("p").unpack("L").first
end
def byte_length
ret = 0
each_byte{ret+=1}
ret
end
end
module Fux2
module Win32Tools
WriteProcessMemoryR = Win32API.new('kernel32','WriteProcessMemory','lplll','i')
WriteProcessMemoryW = Win32API.new('kernel32','WriteProcessMemory','llpll','i')
GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
GetProcAddress = Win32API.new('kernel32','GetProcAddress','lp','l')
CallWindowProc = Win32API.new('user32','CallWindowProc','ppll','v')
MoveWindow = Win32API.new('user32','MoveWindow','llllll','v')
GetSystemMetrics = Win32API.new('user32','GetSystemMetrics','l','l')
GetWindowRect = Win32API.new('user32','GetWindowRect','lp','v')
GetWindowLong = Win32API.new('user32','GetWindowLong','ll','l')
FindWindow = Win32API.new('user32','FindWindow','pp','l')
AdjustWindowRectEx = Win32API.new('user32','AdjustWindowRectEx','plll','l')
GetDC = Win32API.new('user32','GetDC','L','L')
def self.readmem(buf,addr,len)
WriteProcessMemoryR.call(-1,buf,addr,len,0)
end
def self.writemem(addr,buf,len)
WriteProcessMemoryW.call(-1,addr,buf,len,0)
end
def self.nop(addr,len)
buf = "\x90" * len
writemem(addr,buf,len)
end
def self.read_ptr_value(addr,*stacks)
rem = "\0"*4
value = addr
stacks.each do |offset|
readmem(rem,value+offset,4)
value = rem.unpack("L")[0]
end
return value
end
def self.get_proc_addr(module_name,proc_name)
mod = GetModuleHandle.call(module_name)
raise 'getprocaddress faild' if mod==0
ret = GetProcAddress.call(mod,proc_name)
raise 'getprocaddress faild' if ret==0
ret
end
def self.unprotect(addr,len)
VirtualProtect.call(addr,len,0x40,"\0"*4)
end
def self.init
@@hModule = GetModuleHandle.call("RGSS103J.dll")
raise 'wrong dll file' if @@hModule==0
@@window_hWnd = read_ptr_value(module_handle+0x12B6C4,0,8)
@@hook_contents = {}
end
def self.module_handle
@@hModule
end
def self.window_hwnd
@@window_hWnd
end
def self.callfunc(funcstr,args)
CallWindowProc.call(funcstr,args,0,0)
end
def self.set_window_size(x,y,w,h)
MoveWindow.call(@@window_hWnd,x,y,w,h,1)
end
def self.get_desktop_size
[GetSystemMetrics.call(0),GetSystemMetrics.call(1)]
end
def self.get_window_hdc
GetDC.call(window_hwnd)
end
def self.get_window_size
rem = "\0"*16
GetWindowRect.call(@@window_hWnd,rem)
l,t,r,b = *rem.unpack("l*")
ret = [l,t,r-l,b-t]
return ret
end
def self.get_tray_size
hwnd = FindWindow.call("Shell_TrayWnd","")
rem = "\0"*16
GetWindowRect.call(hwnd,rem)
l,t,r,b = *rem.unpack("l*")
ret = [l,t,r-l,b-t]
return ret
end
def self.get_window_size_with_client(width,height)
style = GetWindowLong.call(@@window_hWnd,-16)
exStyle = GetWindowLong.call(@@window_hWnd,-20)
rcClient = [0,0,width,height].pack("l*")
AdjustWindowRectEx.call(rcClient, style, 0, exStyle)
size = rcClient.unpack("l*")
[size[2]-size[0],size[3]-size[1]]
end
def self.hook(name,addr,len,code,*args)
if @@hook_contents[name]
raise 'hooked function'
else
@@hook_contents[name] = Hooker.new(addr,0,len,code,*args)
@@hook_contents[name].prepare
end
end
def self.hook_head(name,addr,len,code,*args)
if @@hook_contents[name]
raise 'hooked function'
else
@@hook_contents[name] = Hooker.new(addr,1,len,code,*args)
@@hook_contents[name].prepare
end
end
def self.get_hooker(name)
@@hook_contents[name]
end
init
class Hooker
JUMP_TYPE = [0xE8,0xE9]
def initialize(addr,type,len,code,*vars)
@addr = addr
@count = len
@type = type
@code = code
@vars = vars
@ptrs = "\x0"
@rem = "\x0"*@count
@hook_code = "\x0"*@count
@asm_code = "\x0"
@is_turn_on = false
end
def calc_asm_code
asm_code = []
@ptrs = @vars.pack("L*")
ptr_vars = @ptrs.address
@code.each do |byte|
if byte<0
addr = ptr_vars+(byte.abs-1)*4
asm_code.push(*[addr].pack("L").unpack("C*"))
elsif byte>=1000
index = byte/1000-1
asm_code.push(*[@vars[index]].pack("L").unpack("C*"))
else
asm_code << byte
end
end
@asm_code = asm_code.pack("C*")
end
def prepare
Win32Tools.readmem(@rem,@addr,@count)
calc_asm_code
addr_code = @asm_code.address
hook_code = [JUMP_TYPE[@type],addr_code-@addr-5]+[0x90]*(@count-5)
@hook_code = hook_code.pack("CLC*")
Win32Tools.unprotect(addr_code,@asm_code.byte_length)
end
def turn_on
return if @is_turn_on
Win32Tools.writemem(@addr,@hook_code,@count)
@is_turn_on = true
end
def turn_off
return unless @is_turn_on
Win32Tools.writemem(@addr,@rem,@count)
@is_turn_on = false
end
def get_var(index)
ret = "\0"*4
Win32Tools.readmem(ret,@ptrs.address+index*4,4)
ret.unpack("L").first
end
def get_var_addr(index)
@ptrs.address+index*4
end
end
end
module RGSS3Runtime
ADDR_EVAL = Win32Tools.module_handle + 0x3C10
end
end[/pre]
原画面放大脚本2[pre lang="ruby"]# LargerWindow by Fux2
# 欢迎访问rpg.blue获取更多RPG Maker资源
# 发布、转载时请保留此处文字
module Fux2
module GameResetController
ADDR_UPDATE_PRESS = Win32Tools.module_handle + 0x278B
def self.set_enable(flag)
if flag
Win32Tools.writemem(ADDR_UPDATE_PRESS,"\x7D",1)
else
Win32Tools.writemem(ADDR_UPDATE_PRESS,"\xEB",1)
end
end
end
module WindowManager
ADDR_GRAPHICS_UPDATE = Win32Tools.module_handle + 0x15470
ADDR_SWITCH_FULLSCREEN = Win32Tools.module_handle + 0x87720
ADDR_FULLSCREEN_BACK = Win32Tools.module_handle + 0x30DC
ADDR_WINDOW_STRUCT_BASE = Win32Tools.module_handle + 0x12B6C4
ADDR_HOOK_GRAPHICS_UPDATE1 = Win32Tools.module_handle + 0x2AC2
ADDR_HOOK_GRAPHICS_UPDATE2 = Win32Tools.module_handle + 0x2F0C
ADDR_HOOK_GRAPHICS_UPDATE3 = Win32Tools.module_handle + 0x2F6A
ADDR_HOOK_GAMEDRAW = Win32Tools.module_handle + 0x884DE
ADDR_HOOK_FULLSCREEN = Win32Tools.module_handle + 0x30D7
CODE_HOOK_GRAPHICS_UPDATE = [
0x55,
0x8B,0xEC,
0x51,
0xC6,0x05,-1,0x01,
0xFF,0x75,0x0C,
0xFF,0x75,0x08,
0xFF,0x15,-2,
0xC6,0x05,-1,0x00,
0x8B,0xE5,
0x5D,
0xC2,0x08,0x00
]
CODE_HOOK_GRAPHICS_UPDATE_DEC = [
0x55,
0x8B,0xEC,
0x51,
0xC6,0x05,1000,0x01,
0xFF,0x75,0x0C,
0xFF,0x75,0x08,
0xFF,0x15,-2,
0xC6,0x05,1000,0x00,
0x8B,0xE5,
0x5D,
0xC2,0x08,0x00
]
CODE_HOOK_GAMEDRAW = [
0x55,
0x8B,0xEC,
0x80,0x3D,1000,0x00,
0x74,0x37,
0x8B,0x45,0x28,
0x8B,0x4D,0x14,
0x8B,0x55,0x24,
0x50,
0x8B,0x45,0x18,
0x50,
0x51,
0x52,
0x8B,0x55,0x20,
0x52,
0x8B,0x55,0x1C,
0x52,
0x8B,0x55,0x10,
0x03,0xC0,
0x50,
0x03,0xC9,
0x51,
0x8B,0x4D,0x0C,
0x8D,0x04,0x12,
0x8B,0x55,0x08,
0x50,
0x51,
0x52,
0xFF,0x15,-3,
0x5D,
0xC2,0x24,0x00,
0x5D,
0xFF,0x25,-2
]
CODE_HOOK_FULLSCREEN = [
0x50,
0x8B,0x44,0x24,0x04,
0xA3,-1,
0x58,
0xFF,0x15,-2,
0x60,
0x68,3000,
0xFF,0x15,-4,
0x83,0xC4,0x04,
0x61,
0xFF,0x25,-5
]
STR_FULLSCREEN_EVENT = 'Fux2::WindowManager.after_switch_fullscreen'
DEFAULT_WIDTH = 640
DEFAULT_HEIGHT = 480
@@is_double = false
@@screen_width_addr = 0
def self.set_game_window_size(width,height)
need_w,need_h = *Win32Tools.get_window_size_with_client(width,height)
desktop_w,desktop_h = *Win32Tools.get_desktop_size
if need_w<=desktop_w && need_h<=desktop_h
new_x = (desktop_w-need_w)/2
new_y = (desktop_h-need_h)/2
Win32Tools.set_window_size(new_x,new_y,need_w,need_h)
return true
else
return false
end
end
def self.set_multiple(multiple,save=true)
multiple = [[1,multiple].max,3].min
if multiple==1
set_game_window_size(DEFAULT_WIDTH,DEFAULT_HEIGHT)
close_hooker
@@is_double = false if save
else
tw = DEFAULT_WIDTH * multiple
th = DEFAULT_HEIGHT * multiple
if set_game_window_size(tw,th)
Win32Tools.writemem(@@screen_width_addr,[tw].pack("L"),4)
open_hooker
@@is_double = true if save
end
end
Graphics.update
end
def self.open_hooker
return if is_fullscreen?
Win32Tools.get_hooker('reUpdate1').turn_on
Win32Tools.get_hooker('reUpdate2').turn_on
Win32Tools.get_hooker('reUpdate3').turn_on
Win32Tools.get_hooker('reDraw').turn_on
end
def self.close_hooker
Win32Tools.get_hooker('reUpdate1').turn_off
Win32Tools.get_hooker('reUpdate2').turn_off
Win32Tools.get_hooker('reUpdate3').turn_off
Win32Tools.get_hooker('reDraw').turn_off
end
def self.init
@@screen_width_addr = Win32Tools.read_ptr_value(ADDR_WINDOW_STRUCT_BASE,0,0x134,0xB4,0x20)+0x4
Win32Tools.hook('reUpdate1',ADDR_HOOK_GRAPHICS_UPDATE1,5,CODE_HOOK_GRAPHICS_UPDATE,1,ADDR_GRAPHICS_UPDATE)
ptr_indraw_flag = Win32Tools.get_hooker('reUpdate1').get_var_addr(0)
Win32Tools.hook('reUpdate2',ADDR_HOOK_GRAPHICS_UPDATE2,5,CODE_HOOK_GRAPHICS_UPDATE_DEC,ptr_indraw_flag,ADDR_GRAPHICS_UPDATE)
Win32Tools.hook('reUpdate3',ADDR_HOOK_GRAPHICS_UPDATE3,5,CODE_HOOK_GRAPHICS_UPDATE_DEC,ptr_indraw_flag,ADDR_GRAPHICS_UPDATE)
addr_bitblt = Win32Tools.get_proc_addr('gdi32','BitBlt')
addr_sbitblt = Win32Tools.get_proc_addr('gdi32','StretchBlt')
Win32Tools.hook('reDraw',ADDR_HOOK_GAMEDRAW,6,CODE_HOOK_GAMEDRAW,ptr_indraw_flag,addr_bitblt,addr_sbitblt)
Win32Tools.hook_head('fullScreenSwitch',ADDR_HOOK_FULLSCREEN,5,CODE_HOOK_FULLSCREEN,0,ADDR_SWITCH_FULLSCREEN,STR_FULLSCREEN_EVENT.address,RGSS3Runtime::ADDR_EVAL,ADDR_FULLSCREEN_BACK)
Win32Tools.get_hooker('fullScreenSwitch').turn_on
end
def self.after_switch_fullscreen
muilt = (@@is_double && !is_fullscreen?) ? 2 : 1
set_multiple(muilt,false)
end
def self.is_fullscreen?
Win32Tools.get_hooker('fullScreenSwitch').get_var(0) == 1
end
def self.is_double?
@@is_double
end
init
end
end
class << Input
alias _fux_ud update unless $@
def update
_fux_ud
if trigger?(Input::F5)
if Fux2::WindowManager.is_double?
Fux2::WindowManager.set_multiple(1)
else
Fux2::WindowManager.set_multiple(2) #双倍大小的窗口
end
end
end
end
# 屏蔽F12按钮
Fux2::GameResetController.set_enable(false)[/pre]
不过config里面的 System 中的各个值,能否当变量用呢?或者根据玩家的屏幕大小来做适应性的整数缩放。
如 WindowWidth 和 WindowHeight 我想做成游戏中按键操作后才会 * 2 的效果 (因为有些人的屏幕分辨率很小,或者很大)
 
再来就是烛光效果的移植,因为涉及了bitmap,无法兼容了~~
这个插件里面bitmap相关的内容还挺多的,虽然自己没有用过,不过看上去好酷炫的样子!
如果RGM能统统合并过去最好不过了(啥也不干还要求贼多的伸手党先自罚一巴掌)
Bitmap 追加 for 烛光[pre lang="ruby"]# coding: utf-8
=begin
= Bitmap類拡張 (DLL版)
RPGツクールXP/VX共用
添加功能 Bitmap 類。
- Marshaldump 啟用
- 保存為PNG文件
-色調變化
-馬賽克效果
-反相顏色
-模糊效果
-使用遮罩-切除
-混合
■ 注意
這個腳本需要"tktk_bitmap.dll"(ver0.1.2.6以上)。
Author:: 半生
Date:: 2010/12/13
Version:: 0.1.2.6
URL:: http://www.tktkgame.com/
################更新########################
2010/12/13 ver 0.1.2.6
dll名稱從"hn_rg_bitmap.dll"變更為"tktk_bitmap.dll"
LARGE_BITMAP機能でメモリを確保できなかった場合の処理を追加
2010/10/12 ver 0.1.2.5(デンジャラスベータ版)
大きいサイズのBitmapオブジェクトを機能を試験的に実装(危険)
2010/03/24 ver 0.1.2.2
ブレンディング機能関連の軽量化。
画像連結系メソッドの分離。
2010/03/24 ver 0.1.2.1
ブレンディング機能関連のバグフィックス
2010/03/22 ver 0.1.2.0
加算合成等のブレンディング機能の追加
2010/02/07 ver 0.1.1.0
マーシャル化の処理の一部をDLLに移動
2010/01/17 ver 0.1.0.0
dllの名称を"hn_rx_bitmap.dll"から"hn_rg_bitmap.dll"に変更
モザイク効果・色反転・ぼかし効果の追加
############################################
=end
module TKTK_Bitmap
LARGE_BITMAP = true # 是否使用大型點陣圖的功能
DLL_NAME = 'tktk_bitmap'
ERROR_ALLOCATE_FAILED = -110002
@@png_save = Win32API.new(DLL_NAME, 'PngSaveA', 'p n i i', 'i')
@@blur = Win32API.new(DLL_NAME, 'Blur', 'n i', 'i')
@@change_tone = Win32API.new(DLL_NAME, 'ChangeTone', 'n i i i i', 'i')
@@clip_mask = Win32API.new(DLL_NAME, 'ClipMask', 'n n i i i', 'i')
@@invert = Win32API.new(DLL_NAME, 'InvertColor', 'n', 'i')
@@mosaic = Win32API.new(DLL_NAME, 'Mosaic', 'n i i i i i i', 'i')
@@address = Win32API.new(DLL_NAME, 'GetAddress', 'n', 'n')
@@get_pixel_data = Win32API.new(DLL_NAME, 'GetPixelData', 'n p i', 'i')
@@set_pixel_data = Win32API.new(DLL_NAME, 'SetPixelData', 'n p i', 'i')
@@blend_blt = Win32API.new(DLL_NAME, 'BlendBlt', 'n i i n i i i i i i', 'i')
#@@get_hwnd = Win32API.new(DLL_NAME, 'GetGameHWND', 'v', 'l')
@@change_size = Win32API.new(DLL_NAME, 'ChangeSize', 'n i i', 'i')
module_function
# PNG形式儲存
def png_save(bitmap,file_name,compression_level,filter)
return @@png_save.call(file_name, bitmap.object_id, compression_level, filter)
end
# 模糊效果
def blur(bitmap, r = 1)
return @@blur.call(bitmap.object_id, r)
end
# 更改顏色平衡?
def change_tone(bitmap, red = 0, green = 0, blue = 0, simplify = 1)
return @@change_tone.call(bitmap.object_id, red, green, blue, simplify)
end
# 剪貼蒙版圖像(α乘法)
def clip_mask(g_bitmap, m_bitmap, x=0, y=0, outer=0)
return @@clip_mask.call(g_bitmap.object_id, m_bitmap.object_id, x, y, outer)
end
# 色的反轉
def invert(bitmap)
return @@invert.call(bitmap.object_id)
end
# 馬賽克效果
def mosaic(bitmap, msw=5, msh=5)
return self.mosaic_rect(bitmap, bitmap.rect, msw, msh)
end
# 馬賽克效果(範圍指定)
def mosaic_rect(bitmap, rect, msw=5, msh=5)
return @@mosaic.call(bitmap.object_id,
rect.x, rect.y, rect.width, rect.height, msw, msh)
end
# 獲取Bitmap資料位址
def address(bitmap)
return @@address.call(bitmap.object_id)
end
# 二進位資料獲取點Bitmap陣圖
def get_pixel_data(bitmap)
buffer = "bgra" * bitmap.width * bitmap.height
@@get_pixel_data.call(bitmap.object_id, buffer, buffer.size)
return buffer
end
#替換為Bitmap中的二進位資料
def set_pixel_data(bitmap, data)
return @@set_pixel_data.call(bitmap.object_id, data, data.size)
end
def blend_blt(dest_bmp, x, y, src_bmp, rect, blend_type=0, opacity=255)
@@blend_blt.call(dest_bmp.object_id, x, y, src_bmp.object_id,
rect.x, rect.y, rect.width, rect.height,
blend_type, opacity)
end
# 改變Bitmap的大小(風險)
def change_size(bitmap, new_width, new_height)
return -1 if (new_width <=0 or new_height <= 0)
result = @@change_size.call(bitmap.object_id, new_width, new_height)
if result == ERROR_ALLOCATE_FAILED
raise("tktk_bitmap:ERROR ALLOCATE FAILED")
end
return result
end
end
class Font
def marshal_dump;end
def marshal_load(obj);end
end
class Bitmap
# PNG 壓縮篩檢程式
PNG_NO_FILTERS = 0x00
PNG_FILTER_NONE = 0x08
PNG_FILTER_SUB = 0x10
PNG_FILTER_UP = 0x20
PNG_FILTER_AVG = 0x40
PNG_FILTER_PAETH = 0x80
PNG_ALL_FILTERS = (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP |
PNG_FILTER_AVG | PNG_FILTER_PAETH)
# Marshal_dump
def _dump(limit)
return "" if self.disposed?
data = TKTK_Bitmap.get_pixel_data(self)
[width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # ついでに圧縮
end
# Marshal_load
def self._load(str)
if str == ""
b = Bitmap.new(1,1)
b.dispose
return b
end
w, h, zdata = str.unpack("LLa*"); b = new(w, h)
TKTK_Bitmap.set_pixel_data(b, Zlib::Inflate.inflate(zdata))
return b
end
def address
TKTK_Bitmap.address(self)
end
# 模糊效果
def blur2(r=1)
TKTK_Bitmap.blur(self, r)
end
# 色調變化
def change_tone(red, green, blue, simplify = 1)
TKTK_Bitmap.change_tone(self, red, green, blue, simplify)
end
# 剪切
def clip_mask(bitmap, x=0, y=0, outer=0)
TKTK_Bitmap.clip_mask(self, bitmap, x, y, outer)
end
# 反相顏色
def invert
TKTK_Bitmap.invert(self)
end
# 馬賽克效果
def mosaic(msw=5, msh=5)
TKTK_Bitmap.mosaic(self, msw, msh)
end
# 馬賽克效果 (指定區域)
def mosaic_rect(rect=self.rect, msw=5, msh=5)
TKTK_Bitmap.mosaic_rect(self, rect, msw, msh)
end
# 混合
def blend_blt(x, y, src_bmp, rect, blend_type=0, opacity=255)
return if opacity <= 0
TKTK_Bitmap.blend_blt(self, x, y, src_bmp, rect, blend_type, opacity)
end
#Png 格式保存
def png_save(outp, level = 9, filter = PNG_NO_FILTERS)
if (TKTK_Bitmap.png_save(self, outp, level, filter) != 0)
raise("Bitmap\#png_save failed")
end
end
# 允許更大的 bitmap.new (危険)
# 寬度 * 高度大約是1073741823
if TKTK_Bitmap::LARGE_BITMAP
class << self
unless method_defined?(:_hn_large_bm__new)
alias :_hn_large_bm__new :new
end
def new(*args)
if args.size == 2 && args[0] * args[1] >= 4194304
new_width = args[0]
new_height = args[1]
# 暫時以小尺寸作成
bitmap = _hn_large_bm__new(16, 16)
TKTK_Bitmap.change_size(bitmap, new_width, new_height)
return bitmap
else
_hn_large_bm__new(*args)
end
end
end # Bitmap.new
end
end # CLASS Bitmap
[/pre]
烛光[pre lang="ruby"]=begin
HN_Light version 1.0.1.0 for VX Ace
by 半生
http://www.tktkgame.com
要HN_RG_BITMAP(ver 0.1.2.1以降)
2012/01/08 ver 1.0.1.2
队列歩行の仲间に対応
2015/04/25 Xp移植(ver 1.0)
By RyanBern
2015/12/20 ver 1.1
Z 坐标修正 && 战斗测试 BUG 修复
2018/02/11 ver 1.2
增加控制黑暗不透明度的变量
=end
# ----- 在这里设定-----
module HN_Light
# 简略化0:(精细)~2:(粗暴,负荷轻)
SIMPLIFY = 2
# 表示黑暗处的不透明度的变量号码
# 变量的数值为0-255,越大则不可见度越高
DARK_OPACITY_VAR = 33
# 玩家的烛光类型使用的变量号码
PLAYER_LIGHT_TYPE = 32
# 黑暗判断上使用的开关
DARK_SWITCH = 19
# 烛光事件识别用的正规表达式
REGEX_LIGHT = /@LIGHT(\d+)/
# 烛光图像的目录
LIGHT_IMG_DIR = "Graphics/Pictures/"
# 烛光Bitmap设定
LIGHTS = [
# [文件名 ,单元数, 放大率, Y偏移值, 色相]
["light1", 1, 1.3, 0, 0],#1·提着灯
["light2", 1, 1.8, 0, 0],#2·暗了
["light1", 1, 0.6, 0, 0],#3·提着小灯
["light2", 1, 0.6, -0, 0],#4·非常暗了
["light5", 1, 3.0, 0, 0],#5·火光
["light6", 1, 1.5, 0, 0],#6·存档光
["light3", 1, 0.6, -0, 0],#7·小天井光
["light8", 1, 3.0, 0, 0],#8·淡蓝色灯光
["light5", 1, 1.5, -23, 0],#9·火光(小)
["light5", 1, 3.0, -25, 0],#10·高火光
["light8", 1, 3.0, 0, 100],#11·淡紫色灯光
]
end
# ----- 在这里设定 -----
module HN_Light
# 事件mix-in用
module LightEvent
attr_reader :light_type
def initialize
super()
@light_type = 0
end
def check_light
@light_type = 0
return if @list.nil?
@list.each do |command|
break if @light_type > 0
if command.code == 108 or command.code == 408
command.parameters.each do |line|
if line =~ REGEX_LIGHT
@light_type = $1.to_i
break
end
end
end
end # END @list.each
end
end # END module LightEvent
class Light
attr_reader :bitmap
attr_reader :cells
attr_reader :width
attr_reader :height
attr_reader :ox
attr_reader :oy
def initialize(light_type, s_zoom = 1)
light = LIGHTS[light_type - 1]
if light.nil?
# 本来不应该来这里
@bitmap = Bitmap.new(32, 32)
@cells = 1
@zoom = 1.0
@oy = 16
@ox = 16
@width = 32
@height = 32
else
@bitmap = Bitmap.new(LIGHT_IMG_DIR + light[0])
@bitmap.invert()
@cells = light[1].to_i
@cells = 1 if (@cells < 1 or @cells > @bitmap.width)
@zoom = light[2].to_f
@zoom = 1.0 if @zoom <= 0.0
@zoom /= s_zoom
@width = @bitmap.width / @cells
@height = @bitmap.height
# 缩放处理
if @zoom != 1.0
new_width = (@width * @zoom).round
new_height = (@height * @zoom).round
if new_width * new_height < 1
@zoom = 1.0
else
@width = new_width
@height = new_height
new_bitmap = Bitmap.new(@width * @cells, @height)
new_bitmap.stretch_blt(new_bitmap.rect,@bitmap, @bitmap.rect)
@bitmap.dispose
@bitmap = new_bitmap
end
end
@ox = @width / 2
@oy = @height / 2 - light[3].to_i / s_zoom
# 色相変换
if ( (hue = light[4].to_i) != 0)
@bitmap.hue_change(hue)
end
end
end # End def initialize
# 色调转换
def dispose
@bitmap.dispose
@bitmap = nil
end
end
end
class Game_Event
include HN_Light::LightEvent
alias :_hn_light__setup :refresh unless method_defined?(:_hn_light__setup)
def refresh
_hn_light__setup
check_light()
end
end
class Game_Player
def light_type
return $game_variables[HN_Light::PLAYER_LIGHT_TYPE]
end
end
class Game_Map
attr_reader :light_events
# 更新烛光事件列表
def refresh_lights
@light_events = []
@events.values.each do |event|
if (event.light_type > 0)
@light_events.push(event)
end
end
end
alias :_hn_light__setup_events :setup unless method_defined?(:_hn_light__setup_events)
def setup(map_id)
_hn_light__setup_events(map_id)
refresh_lights() if @map_id > 0
end
alias :_hn_light__refresh :refresh unless method_defined?(:_hn_light__refresh)
def refresh
_hn_light__refresh()
refresh_lights() if @map_id > 0
end
end
class Sprite_Dark < Sprite
@@base_color = Color.new(255,255,255,192)
def initialize(viewport = nil)
super(viewport)
@width = 640
@height = 480
case HN_Light::SIMPLIFY
when 1
@zoom = 2
when 2
@zoom = 4
else
@zoom = 1
end
@width /= @zoom
@height /= @zoom
self.zoom_x = @zoom.to_f
self.zoom_y = @zoom.to_f
self.bitmap = Bitmap.new(@width, @height)
self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
self.blend_type = 2 # 混合型(减算)
self.z = 800
self.visible = false
@light_cache = {}
end
# 追加烛光
def add_light(charactor)
return if charactor.nil?
light_type = charactor.light_type
return if (light_type < 1 or light_type > HN_Light::LIGHTS.size)
unless @light_cache.key?(light_type)
@light_cache[light_type] = HN_Light::Light.new(light_type, @zoom)
end
light = @light_cache[light_type]
# 画面外什麽都不做
if @zoom == 1
return if (charactor.screen_x < 0 - light.width + light.ox)
return if (charactor.screen_x > @width + light.ox)
return if (charactor.screen_y < 0 - light.height + light.oy)
return if (charactor.screen_y > @height + light.oy)
else
return if (charactor.screen_x < 0 - (light.width + light.ox) * @zoom)
return if (charactor.screen_x > (@width + light.ox) * @zoom)
return if (charactor.screen_y < 0 - (light.height + light.oy) * @zoom)
return if (charactor.screen_y > (@height + light.oy) * @zoom)
end
# 动画判定
if light.cells > 1
index = (Graphics.frame_count / 4) % light.cells
rect = Rect.new(index * light.width , 0, light.width, light.height)
else
rect = light.bitmap.rect
end
if @zoom != 1
p_x = charactor.screen_x / @zoom - light.ox
p_y = (charactor.screen_y - 16) / @zoom - light.oy
else
p_x = charactor.screen_x - light.ox
p_y = charactor.screen_y - 16 - light.oy
end
# 乗算合成(3)
self.bitmap.blend_blt(p_x, p_y, light.bitmap, rect, 3)
end
def refresh
self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
$game_map.light_events.each do |event|
next if HN_Light::LIGHTS[event.light_type - 1].nil?
add_light(event)
end
add_light($game_player)
end
# 更新
def update
super
@@base_color = Color.new(255, 255, 255, $game_variables[HN_Light::DARK_OPACITY_VAR])
refresh()
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
self.bitmap.dispose
@light_cache.values.each do |light|
light.dispose
end
super
end
end
class Spriteset_Map
# 动画判定
def create_dark
@dark_sprite = Sprite_Dark.new(@viewport1)
end
# 更新黑暗Sprite
def update_dark
if (@dark_sprite.visible = $game_switches[HN_Light::DARK_SWITCH])
@dark_sprite.update
end
end
# 破弃黑暗Sprite
def dispose_dark
@dark_sprite.dispose
end
# 初期化
alias :_dark__initialize :initialize unless private_method_defined?(:_dark__initialize)
def initialize
_dark__initialize()
create_dark()
update_dark()
end
# 更新
alias :_dark__update :update unless method_defined?(:_dark__update)
def update
_dark__update()
update_dark() if !@dark_sprite.nil? and !@dark_sprite.disposed?
end
# 结束处理
alias :_dark__dispose :dispose unless method_defined?(:_dark__dispose)
def dispose
dispose_dark()
_dark__dispose()
end
end[/pre]
【tktk_bitmap.dll】烛光效果相关的插件
tktk_bitmap.zip
(88.68 KB, 下载次数: 5)
|
|