查看: 2550|回复: 0

[RMVA发布] Graphics.transition时执行代码及渐变算法

[复制链接]

老黄鸡

梦石
4
星屑
45692
在线时间
7947 小时
注册时间
2009-7-6
回帖
13335

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2014-9-7 17:59:15 | 显示全部楼层 |阅读模式

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

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

×
昨日某坛友想在transition时更新某些东西,所以下面的东西扔出来,可能有人用得上吧。
(可能一辈子没人用得上吧23333

扔~
[fold=transition算法]循环过程中冻结的画面透明度、阈值算法如下
i : 循环迭代器
d : 渐变帧数
如果指定了第二个参数
  1. grayV = i / d * 256 + 256
复制代码
如果没有指定第二个参数:
  1. 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]
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

在本版发帖返回顶部