Project1

标题: 我发现截图脚本可以做好多事情、、 [打印本页]

作者: kuerlulu    时间: 2013-9-30 21:58
标题: 我发现截图脚本可以做好多事情、、
本帖最后由 kuerlulu 于 2013-10-6 07:26 编辑

# 本贴分3层:第一层完善几天前回答@美丽晨露 的帖子,第二层用截图脚本拓展功能(不一定做出来)顺便看看大家有什么好玩的拓展方法,第三层吐槽
首先是对于原帖的描述,要对游戏进行截图然后组成不同的剧情流程(我觉得直接做图片是个好办法),嘛不过晨露很在意"系统截图"于是我就从截图存档脚本里扒出来截图部分,现在又做了一点优化
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Kernel
  3. #------------------------------------------------------------------------------
  4. #  该模块中定义了可供所有类使用的方法。Object 类中包含了该模块。
  5. #==============================================================================
  6. module Kernel
  7.   #--------------------------------------------------------------------------
  8.   # ● 需要的 Windows API 函数
  9.   #--------------------------------------------------------------------------
  10.   GetWindowThreadProcessId = Win32API.new("user32", "GetWindowThreadProcessId", "LP", "L")
  11.   GetWindow = Win32API.new("user32", "GetWindow", "LL", "L")
  12.   GetClassName = Win32API.new("user32", "GetClassName", "LPL", "L")
  13.   GetCurrentThreadId = Win32API.new("kernel32", "GetCurrentThreadId", "V", "L")
  14.   GetForegroundWindow = Win32API.new("user32", "GetForegroundWindow", "V", "L")
  15.   #--------------------------------------------------------------------------
  16.   # ● 获取窗口句柄
  17.   #--------------------------------------------------------------------------
  18.   def get_hWnd
  19.     # 获取调用线程(RM 的主线程)的进程标识
  20.     threadID = GetCurrentThreadId.call
  21.     # 获取 Z 次序中最靠前的窗口
  22.     hWnd = GetWindow.call(GetForegroundWindow.call, 0)
  23.     # 枚举所有窗口
  24.     while hWnd != 0
  25.       # 如果创建该窗口的线程标识匹配本线程标识
  26.       if threadID == GetWindowThreadProcessId.call(hWnd, 0)
  27.         # 分配一个 11 个字节的缓冲区
  28.         className = " " * 11
  29.         # 获取该窗口的类名
  30.         GetClassName.call(hWnd, className, 12)
  31.         # 如果匹配 RGSS Player 则跳出循环
  32.         break if className == "RGSS Player"
  33.       end
  34.       # 获取下一个窗口
  35.       hWnd = GetWindow.call(hWnd, 2)
  36.     end
  37.     return hWnd
  38.   end
  39. end
  40.  
  41. #===============================================================================
  42. # 目标:调教screenshot.dll
  43. # 说明:hy扒自截图存档脚本
  44. #===============================================================================
  45. # ■来设置存放截图文件夹吧(/代替\\哦~)■
  46. DIR = "Screenshot"
  47. # ■创建文件夹(内部方法)■# system("md Screenshot")方法一样可行,只是会弹cmd黑框
  48. Dir.mkdir("./#{DIR}") unless FileTest.exist?(DIR + "/")
  49.   # 主模块 Screen API ★方法:Screen::shot★
  50. module Screen
  51.   @i = 1 # 又要玩迭代了
  52.   @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
  53.   @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  54.   @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l'
  55.   module_function
  56.   def shot(file = "shot", typ = 1) # Screen::shot("Save", 1) 拿到截图存档脚本
  57.     if typ == 0
  58.       typname = ".bmp"
  59.     elsif typ == 1
  60.       typname = ".jpg"
  61.     elsif typ == 2
  62.       typname = ".png"
  63.     end
  64.     dir = DIR + "/"
  65.     # ★ 下面这行是重点 ★
  66.     @i += 1 while FileTest.exist?(dir + file.to_s  + @i.to_s + typname.to_s)
  67.     file_name = dir + file.to_s  + @i.to_s + typname.to_s # 生成带路径的文件名
  68.     @screen.call(0,0,640,480, file_name, get_hWnd, typ) # call出截图
  69.   end
  70. #  def handel
  71. #    game_name = "\0" * 256
  72. #    @readini.call('Game','Title','',game_name,255,".\\Game.ini")
  73. #    game_name.delete!("\0")
  74. #    return @findwindow.call('RGSS Player',game_name)
  75. #  end
  76.   def play
  77.     @i = 0
  78.     @x = 1
  79.     dir = DIR + "/"
  80.     file = "CG"
  81.     typname = ".jpg"
  82.     @file_name = dir + file.to_s  + @i.to_s + typname.to_s
  83.     @x += 1 while FileTest.exist?(dir + file.to_s  + @x.to_s + typname.to_s)
  84.     # ================== 赋值完毕 ===================
  85.     #   参数说明:
  86.     #   Graphics.transition(10) 用10帧完成画面渐变
  87.     # ============= 淡入真的只需要两句 ==============
  88.     [url=home.php?mod=space&uid=114926]@sprite[/url] = Sprite.new
  89.     Graphics.freeze     # 第一句
  90.     @sprite.bitmap = Bitmap.new(@file_name)
  91.     Graphics.transition(10) # 第二句
  92.     loop do
  93.       Graphics.freeze
  94.       # 赋值一次之后不会重复更新另一个值
  95.       @file_name = dir + file.to_s  + @i.to_s + typname.to_s
  96.       @sprite.bitmap = Bitmap.new(@file_name)
  97.       Graphics.update
  98.       @i += 1
  99.       if @i == @x
  100.         break
  101.       end
  102.       Graphics.transition(20) # 帧
  103.     end
  104.     @sprite.bitmap.dispose
  105.     @sprite.dispose
  106.     Graphics.transition(40)
  107.   end
  108. end

关于优化的说明:开头加了个判断可以自己创建文件夹了,然后就不用管它了,因为后面都是直接使用此常量;后面又做了个丧心病狂的方法,自动读取截图文件夹里的CG0.jpg~CG10.jpg并使用淡入淡出播放(这种脚本谁都写得出来LZ你在骗谁)范例工程因为老分卷是很danten的事
后来我发现这个脚本功能多多啊(主要是从原截图存档脚本发现的),首先关于它把图片存到外部文件夹这一点,可以做个开放式CG鉴赏,其次最主要的功能还是截图存档啦,如果把无限存档脚本(扩展存档格的脚本)整合一下,这是个多么科学的存档点啊!【泥垢了】
最后:
本脚本还有一些不足,直接用DIR命令获取文件名添加到数组的方法我不怎么会用,所以它只能读取连续的文件名(12345679,9文件就不读取),希望有人来优化学习;
也许你还有更好的优化(扩展)思路,不妨说出来也许就能做出来;
吐槽:【无关】写这篇帖子之前我盯某人的签名直到结束。。

范例里面的CG*10就当是深夜福利好了
作者: 紫英晓狼1130    时间: 2013-9-30 22:04
我是看完贪吃蛇然后回的帖…
截图脚本之前好像被柳柳抠出来了吧,我记得我下载一个范例也能修改储存文件夹路径
也可能是我记错了…
作者: 美丽晨露    时间: 2013-9-30 22:04
好吧,其实我忘记我提问了什么问题了
作者: 无脑之人    时间: 2013-9-30 22:25
1.那个贪吃蛇看过,我也盯着直到看完
2.RGE自带截图哇哈哈
3.LZ想法好顶赞
作者: 美丽晨露    时间: 2013-9-30 22:30
话说我还没有看完贪吃蛇呢?
不过看了看怎么想起了一个叫做《我们的大冒险》的游戏
作者: Algalon    时间: 2013-10-1 04:16
我是来看贪吃蛇的
作者: 秋寒    时间: 2013-10-1 15:07
那个贪吃蛇的签名档有一种奇怪的吸引力 = =




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1