| 赞 | 486 |
| VIP | |
| 好人卡 | |
| 积分 | 497 |
| 经验 | |
| 最后登录 | 2026-9-30 |
| 在线时间 | 7947 小时 |
老黄鸡
- 梦石
- 4
- 星屑
- 45692
- 在线时间
- 7947 小时
- 注册时间
- 2009-7-6
- 回帖
- 13335
   
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
昨日某坛友想在transition时更新某些东西,所以下面的东西扔出来,可能有人用得上吧。
(可能一辈子没人用得上吧23333
扔~
[fold=transition算法]循环过程中冻结的画面透明度、阈值算法如下
i : 循环迭代器
d : 渐变帧数
如果指定了第二个参数- grayV = i / d * 256 + 256
复制代码 如果没有指定第二个参数:- opacity = 255 - 255 * i / d
复制代码 [/fold]
扔~
[fold=在transition过程中执行脚本]
由于va的reset并不是从rgssmain重启,所以不用担心反复执行产生的后果。
[pre lang="ruby" line="1"]eval_code = "Fux2.eval_code\0"
GM = Win32API.new('kernel32','GetModuleHandle','p','l')
SP = Win32API.new('kernel32','RtlMoveMemory','lpl','v')
base_addr = GM.call("RGSS300.dll")
eval_addr = base_addr+0xC580
gpud_addr = base_addr+0xB000
hook_addr1 = base_addr+0xB69B
hook_addr2 = base_addr+0xB710
$_fux_patch_g_code = ""
$_fux_patch_g_code += [0x68].pack("C")+[eval_code].pack("p")
$_fux_patch_g_code += "\0"*10
$_fux_patch_g_code += [0x83,0xC4,0x04,0xC3].pack("C*")
code_addr = [$_fux_patch_g_code].pack("p").unpack("L")[0]
eval_call = [eval_addr-code_addr-10].pack("l")
gpud_call = [gpud_addr-code_addr-15].pack("l")
hook_call1 = [code_addr-hook_addr1-5].pack("l")
hook_call2 = [code_addr-hook_addr2-5].pack("l")
$_fux_patch_g_code[5,5] = [0xE8].pack("C")+eval_call
$_fux_patch_g_code[10,5] = [0xE8].pack("C")+gpud_call
SP.call(hook_addr1+1,hook_call1,4)
SP.call(hook_addr2+1,hook_call2,4)
# 以下是测试,
module Fux2
def self.eval_code
$test.call
end
end
arr = []
(0..9).each do |i|
b = Bitmap.new(32,32)
b.font.size = 22
b.draw_text(0,0,32,32,i.to_s,1)
arr << b
end
spr = Sprite.new
spr.z = 2147483647
$test = Proc.new{spr.bitmap = arr[rand(10)];spr.x=rand(544);spr.y=rand(416)}
$test.call
Graphics.freeze
Graphics.transition(1000)
arr.each{|i| i.dispose}
spr.dispose
[/pre][/fold] |
|