查看: 2671|回复: 6

[讨论] 我发现截图脚本可以做好多事情、、

[复制链接]
梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
回帖
1643

开拓者

发表于 2013-9-30 21:58:28 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 kuerlulu 于 2013-10-6 07:26 编辑

# 本贴分3层:第一层完善几天前回答@美丽晨露 的帖子,第二层用截图脚本拓展功能(不一定做出来)顺便看看大家有什么好玩的拓展方法,第三层吐槽
首先是对于原帖的描述,要对游戏进行截图然后组成不同的剧情流程(我觉得直接做图片是个好办法),嘛不过晨露很在意"系统截图"于是我就从截图存档脚本里扒出来截图部分,现在又做了一点优化[pre lang="ruby" line="1"]#==============================================================================
# ■ 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帧完成画面渐变
    # ============= 淡入真的只需要两句 ==============
    @sprite = 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[/pre]
关于优化的说明:开头加了个判断可以自己创建文件夹了,然后就不用管它了,因为后面都是直接使用此常量;后面又做了个丧心病狂的方法,自动读取截图文件夹里的CG0.jpg~CG10.jpg并使用淡入淡出播放(这种脚本谁都写得出来LZ你在骗谁)范例工程因为老分卷是很danten的事
后来我发现这个脚本功能多多啊(主要是从原截图存档脚本发现的),首先关于它把图片存到外部文件夹这一点,可以做个开放式CG鉴赏,其次最主要的功能还是截图存档啦,如果把无限存档脚本(扩展存档格的脚本)整合一下,这是个多么科学的存档点啊!【泥垢了】
最后:
本脚本还有一些不足,直接用DIR命令获取文件名添加到数组的方法我不怎么会用,所以它只能读取连续的文件名(12345679,9文件就不读取),希望有人来优化学习;
也许你还有更好的优化(扩展)思路,不妨说出来也许就能做出来;
吐槽:【无关】写这篇帖子之前我盯某人的签名直到结束。。
贪吃蛇.gif
范例里面的CG*10就当是深夜福利好了

点评

RGE有内建类的说明,标准库的你需要看RM的,【点开界面的「帮助」就可以了】  发表于 2013-10-1 09:05

评分

参与人数 2星屑 +38 收起 理由
化螺耕 + 8 精品文章,楼主继续加油哈
美丽晨露 + 30 塞糖

查看全部评分


  -fk: -azogi:
梦石
0
星屑
3905
在线时间
1972 小时
注册时间
2013-1-3
回帖
9146
发表于 2013-9-30 22:04:01 | 显示全部楼层
我是看完贪吃蛇然后回的帖…
截图脚本之前好像被柳柳抠出来了吧,我记得我下载一个范例也能修改储存文件夹路径
也可能是我记错了…
《宿愿·寻剑篇》正式版已经发布!快去看看!点击进入论坛发布贴
回复

使用道具 举报

梦石
20
星屑
1840
在线时间
6925 小时
注册时间
2012-12-14
回帖
10960

短篇十战斗者组别冠军开拓者贵宾短篇九勇士组亚军

发表于 2013-9-30 22:04:22 | 显示全部楼层
好吧,其实我忘记我提问了什么问题了

评分

参与人数 1星屑 +5 收起 理由
kuerlulu + 5 被版主塞糖是比升级还开心的事.

查看全部评分

大家好,这里是晨露的说。请多多指教。
刚入门RM软件制作,请大家多多帮助我哦。
落雪君的欢乐像素教程,欢迎查阅。

回复

使用道具 举报

梦石
0
星屑
122
在线时间
552 小时
注册时间
2012-8-18
回帖
1392
发表于 2013-9-30 22:25:22 | 显示全部楼层
1.那个贪吃蛇看过,我也盯着直到看完
2.RGE自带截图哇哈哈
3.LZ想法好顶赞

点评

刚才就剩5经验都给晨露了。。话说RGE放电脑里就没动过,这玩意有帮助嘛?或者有个内置方法说明也好啊  发表于 2013-9-30 22:29
我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复

使用道具 举报

梦石
20
星屑
1840
在线时间
6925 小时
注册时间
2012-12-14
回帖
10960

短篇十战斗者组别冠军开拓者贵宾短篇九勇士组亚军

发表于 2013-9-30 22:30:19 | 显示全部楼层
话说我还没有看完贪吃蛇呢?
不过看了看怎么想起了一个叫做《我们的大冒险》的游戏
大家好,这里是晨露的说。请多多指教。
刚入门RM软件制作,请大家多多帮助我哦。
落雪君的欢乐像素教程,欢迎查阅。

回复

使用道具 举报

梦石
0
星屑
50
在线时间
141 小时
注册时间
2013-8-6
回帖
114
发表于 2013-10-1 04:16:06 | 显示全部楼层
我是来看贪吃蛇的
回复

使用道具 举报

秋寒

梦石
0
星屑
63
在线时间
801 小时
注册时间
2013-1-17
回帖
1851
发表于 2013-10-1 15:07:35 | 显示全部楼层
那个贪吃蛇的签名档有一种奇怪的吸引力 = =
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

在本版发帖返回顶部