赞 | 3 |
VIP | 1 |
好人卡 | 40 |
积分 | 1 |
经验 | 93188 |
最后登录 | 2020-7-27 |
在线时间 | 1379 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 76
- 在线时间
- 1379 小时
- 注册时间
- 2012-7-5
- 帖子
- 1698
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 kuerlulu 于 2013-10-6 07:26 编辑
# 本贴分3层:第一层完善几天前回答@美丽晨露 的帖子,第二层用截图脚本拓展功能(不一定做出来)顺便看看大家有什么好玩的拓展方法,第三层吐槽
首先是对于原帖的描述,要对游戏进行截图然后组成不同的剧情流程(我觉得直接做图片是个好办法),嘛不过晨露很在意"系统截图"于是我就从截图存档脚本里扒出来截图部分,现在又做了一点优化#============================================================================== # ■ Kernel #------------------------------------------------------------------------------ # 该模块中定义了可供所有类使用的方法。Object 类中包含了该模块。 #============================================================================== module Kernel #-------------------------------------------------------------------------- # ● 需要的 Windows API 函数 #-------------------------------------------------------------------------- GetWindowThreadProcessId = Win32API.new("user32", "GetWindowThreadProcessId", "LP", "L") GetWindow = Win32API.new("user32", "GetWindow", "LL", "L") GetClassName = Win32API.new("user32", "GetClassName", "LPL", "L") GetCurrentThreadId = Win32API.new("kernel32", "GetCurrentThreadId", "V", "L") GetForegroundWindow = Win32API.new("user32", "GetForegroundWindow", "V", "L") #-------------------------------------------------------------------------- # ● 获取窗口句柄 #-------------------------------------------------------------------------- def get_hWnd # 获取调用线程(RM 的主线程)的进程标识 threadID = GetCurrentThreadId.call # 获取 Z 次序中最靠前的窗口 hWnd = GetWindow.call(GetForegroundWindow.call, 0) # 枚举所有窗口 while hWnd != 0 # 如果创建该窗口的线程标识匹配本线程标识 if threadID == GetWindowThreadProcessId.call(hWnd, 0) # 分配一个 11 个字节的缓冲区 className = " " * 11 # 获取该窗口的类名 GetClassName.call(hWnd, className, 12) # 如果匹配 RGSS Player 则跳出循环 break if className == "RGSS Player" end # 获取下一个窗口 hWnd = GetWindow.call(hWnd, 2) end return hWnd end end #=============================================================================== # 目标:调教screenshot.dll # 说明:hy扒自截图存档脚本 #=============================================================================== # ■来设置存放截图文件夹吧(/代替\\哦~)■ DIR = "Screenshot" # ■创建文件夹(内部方法)■# system("md Screenshot")方法一样可行,只是会弹cmd黑框 Dir.mkdir("./#{DIR}") unless FileTest.exist?(DIR + "/") # 主模块 Screen API ★方法:Screen::shot★ module Screen @i = 1 # 又要玩迭代了 @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), '' @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l' @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' module_function def shot(file = "shot", typ = 1) # Screen::shot("Save", 1) 拿到截图存档脚本 if typ == 0 typname = ".bmp" elsif typ == 1 typname = ".jpg" elsif typ == 2 typname = ".png" end dir = DIR + "/" # ★ 下面这行是重点 ★ @i += 1 while FileTest.exist?(dir + file.to_s + @i.to_s + typname.to_s) file_name = dir + file.to_s + @i.to_s + typname.to_s # 生成带路径的文件名 @screen.call(0,0,640,480, file_name, get_hWnd, typ) # call出截图 end # def handel # game_name = "\0" * 256 # @readini.call('Game','Title','',game_name,255,".\\Game.ini") # game_name.delete!("\0") # return @findwindow.call('RGSS Player',game_name) # end def play @i = 0 @x = 1 dir = DIR + "/" file = "CG" typname = ".jpg" @file_name = dir + file.to_s + @i.to_s + typname.to_s @x += 1 while FileTest.exist?(dir + file.to_s + @x.to_s + typname.to_s) # ================== 赋值完毕 =================== # 参数说明: # Graphics.transition(10) 用10帧完成画面渐变 # ============= 淡入真的只需要两句 ============== [url=home.php?mod=space&uid=114926]@sprite[/url] = Sprite.new Graphics.freeze # 第一句 @sprite.bitmap = Bitmap.new(@file_name) Graphics.transition(10) # 第二句 loop do Graphics.freeze # 赋值一次之后不会重复更新另一个值 @file_name = dir + file.to_s + @i.to_s + typname.to_s @sprite.bitmap = Bitmap.new(@file_name) Graphics.update @i += 1 if @i == @x break end Graphics.transition(20) # 帧 end @sprite.bitmap.dispose @sprite.dispose Graphics.transition(40) end end
#==============================================================================
# ■ Kernel
#------------------------------------------------------------------------------
# 该模块中定义了可供所有类使用的方法。Object 类中包含了该模块。
#==============================================================================
module Kernel
#--------------------------------------------------------------------------
# ● 需要的 Windows API 函数
#--------------------------------------------------------------------------
GetWindowThreadProcessId = Win32API.new("user32", "GetWindowThreadProcessId", "LP", "L")
GetWindow = Win32API.new("user32", "GetWindow", "LL", "L")
GetClassName = Win32API.new("user32", "GetClassName", "LPL", "L")
GetCurrentThreadId = Win32API.new("kernel32", "GetCurrentThreadId", "V", "L")
GetForegroundWindow = Win32API.new("user32", "GetForegroundWindow", "V", "L")
#--------------------------------------------------------------------------
# ● 获取窗口句柄
#--------------------------------------------------------------------------
def get_hWnd
# 获取调用线程(RM 的主线程)的进程标识
threadID = GetCurrentThreadId.call
# 获取 Z 次序中最靠前的窗口
hWnd = GetWindow.call(GetForegroundWindow.call, 0)
# 枚举所有窗口
while hWnd != 0
# 如果创建该窗口的线程标识匹配本线程标识
if threadID == GetWindowThreadProcessId.call(hWnd, 0)
# 分配一个 11 个字节的缓冲区
className = " " * 11
# 获取该窗口的类名
GetClassName.call(hWnd, className, 12)
# 如果匹配 RGSS Player 则跳出循环
break if className == "RGSS Player"
end
# 获取下一个窗口
hWnd = GetWindow.call(hWnd, 2)
end
return hWnd
end
end
#===============================================================================
# 目标:调教screenshot.dll
# 说明:hy扒自截图存档脚本
#===============================================================================
# ■来设置存放截图文件夹吧(/代替\\哦~)■
DIR = "Screenshot"
# ■创建文件夹(内部方法)■# system("md Screenshot")方法一样可行,只是会弹cmd黑框
Dir.mkdir("./#{DIR}") unless FileTest.exist?(DIR + "/")
# 主模块 Screen API ★方法:Screen::shot★
module Screen
@i = 1 # 又要玩迭代了
@screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
@readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
@findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l'
module_function
def shot(file = "shot", typ = 1) # Screen::shot("Save", 1) 拿到截图存档脚本
if typ == 0
typname = ".bmp"
elsif typ == 1
typname = ".jpg"
elsif typ == 2
typname = ".png"
end
dir = DIR + "/"
# ★ 下面这行是重点 ★
@i += 1 while FileTest.exist?(dir + file.to_s + @i.to_s + typname.to_s)
file_name = dir + file.to_s + @i.to_s + typname.to_s # 生成带路径的文件名
@screen.call(0,0,640,480, file_name, get_hWnd, typ) # call出截图
end
# def handel
# game_name = "\0" * 256
# @readini.call('Game','Title','',game_name,255,".\\Game.ini")
# game_name.delete!("\0")
# return @findwindow.call('RGSS Player',game_name)
# end
def play
@i = 0
@x = 1
dir = DIR + "/"
file = "CG"
typname = ".jpg"
@file_name = dir + file.to_s + @i.to_s + typname.to_s
@x += 1 while FileTest.exist?(dir + file.to_s + @x.to_s + typname.to_s)
# ================== 赋值完毕 ===================
# 参数说明:
# Graphics.transition(10) 用10帧完成画面渐变
# ============= 淡入真的只需要两句 ==============
[url=home.php?mod=space&uid=114926]@sprite[/url] = Sprite.new
Graphics.freeze # 第一句
@sprite.bitmap = Bitmap.new(@file_name)
Graphics.transition(10) # 第二句
loop do
Graphics.freeze
# 赋值一次之后不会重复更新另一个值
@file_name = dir + file.to_s + @i.to_s + typname.to_s
@sprite.bitmap = Bitmap.new(@file_name)
Graphics.update
@i += 1
if @i == @x
break
end
Graphics.transition(20) # 帧
end
@sprite.bitmap.dispose
@sprite.dispose
Graphics.transition(40)
end
end
关于优化的说明:开头加了个判断可以自己创建文件夹了,然后就不用管它了,因为后面都是直接使用此常量;后面又做了个丧心病狂的方法,自动读取截图文件夹里的CG0.jpg~CG10.jpg并使用淡入淡出播放(这种脚本谁都写得出来LZ你在骗谁)范例工程因为老分卷是很danten的事 后来我发现这个脚本功能多多啊(主要是从原截图存档脚本发现的),首先关于它把图片存到外部文件夹这一点,可以做个开放式CG鉴赏,其次最主要的功能还是截图存档啦,如果把无限存档脚本(扩展存档格的脚本)整合一下,这是个多么科学的存档点啊!【泥垢了】 最后:
本脚本还有一些不足,直接用DIR命令获取文件名添加到数组的方法我不怎么会用,所以它只能读取连续的文件名(12345679,9文件就不读取),希望有人来优化学习;
也许你还有更好的优化(扩展)思路,不妨说出来也许就能做出来;
吐槽:【无关】写这篇帖子之前我盯某人的签名直到结束。。
范例里面的CG*10就当是深夜福利好了 |
评分
-
查看全部评分
|