Project1

标题: 请问如何在游戏进程中截图,并且之后会显示截图。 [打印本页]

作者: 美丽晨露    时间: 2013-9-21 10:48
标题: 请问如何在游戏进程中截图,并且之后会显示截图。
比如:在游戏时间在20分钟时,截图一张到Pictures,命名为截图1
在游戏时间在40分钟时,截图一张到Pictures,命名为截图2
以此类推······

游戏完结时,用事件回放这些截图。

请问要怎么才能做到?
作者: 紫英晓狼1130    时间: 2013-9-21 12:31
可以参考截图存档的原理,加上计时器的操作应该可以
作者: 美丽晨露    时间: 2013-9-21 15:18
紫英晓狼1130 发表于 2013-9-21 12:31
可以参考截图存档的原理,加上计时器的操作应该可以

计时器操作跟游戏时间不是一个概率
作者: kuerlulu    时间: 2013-9-21 16:43
本帖最后由 kuerlulu 于 2013-9-21 17:16 编辑

来看看截图脚本吧 < 好喜欢这种语气233
  1. #===============================================================================
  2. # 目标:调教screenshot.dll
  3. # 说明:hy扒自截图存档脚本
  4. #===============================================================================
  5. # ■来设置存放截图文件夹吧(/代替\\哦~)■注意如果不存在此文件夹截图就无效
  6. DIR = "Screenshot/"
  7. # 主模块 Screen API ★方法:Screen::shot★
  8. module Screen
  9.   @i = 1 # 又要玩迭代了
  10.   @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
  11.   @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
  12.   @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l'
  13.   module_function
  14.   def shot(file = "shot", typ = 1) # 默认文件名是"shot"可以改哟
  15.     if typ == 0
  16.       typname = ".bmp"
  17.     elsif typ == 1
  18.       typname = ".jpg"
  19.     elsif typ == 2
  20.       typname = ".png"
  21.     end
  22.     dir = DIR
  23.     # ★ 下面这行是重点 能自动更名 我TM竟然想了1小时才想出来
  24.     @i += 1 while FileTest.exist?(file_name = dir + file.to_s  + @i.to_s + typname.to_s)
  25.     file_name = dir + file.to_s  + @i.to_s + typname.to_s # 生成带路径的文件名
  26.     #names = File.basename(Dir["#{DIR}/*.jpg"].to_s) # 来获取文件名吧(不带路径)
  27.     @screen.call(0,0,640,480, file_name, handel, typ) # call出截图
  28.   end
  29.   def handel
  30.     game_name = "\0" * 256
  31.     @readini.call('Game','Title','',game_name,255,".\\Game.ini")
  32.     game_name.delete!("\0")
  33.     return @findwindow.call('RGSS Player',game_name)
  34.   end
  35. end
复制代码
以上就是传说中的截图脚本的全部内容 只需要一句Screen::shot就能保存截图到指定目录下
对了 还差一个screenshot.dll screenshot.rar (48.16 KB, 下载次数: 59) 放到根目录 别忘了创建对应脚本中设置的文件夹
那么
试试放到Scene_Map里面吧
  1.   #--------------------------------------------------------------------------
  2.   # ● 刷新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     # ■来定时截图吧■
  6.     if (Graphics.frame_count % 48000) == 0
  7.       Screen::shot
  8.     end
  9.     ..........
  10.   end
复制代码
48000 = 20 * 60 * 40(fps)
不知道为什么使用Graphics.frame_count计算的时候必须用括号,不过确实是可行
那么关键的截图部分完成了,显示图片什么的用文件名+@i什么的不是很简单摸
↑我记得好像回答过这种问题
我觉得我发现了优化截图存档脚本的正确姿势!【滚【这样随便坐多少个存档点都没问题的说
作者: 新☆夏~夜之助    时间: 2013-9-21 16:55
好东西神马的,小新是不会错过的
作者: chd114    时间: 2013-9-21 16:56
那要看你的游戏存档档位有多少个···多了的话图片会乱的
作者: 恐惧剑刃    时间: 2013-9-21 17:20
有结局总有剧情吧~!
测试的时候,自己去截几张图,显示出来
不需要脚本
作者: 美丽晨露    时间: 2013-9-21 17:54
恋′挂机 发表于 2013-9-21 17:20
有结局总有剧情吧~!
测试的时候,自己去截几张图,显示出来
不需要脚本 ...

用系统截游戏图······
结局显示的图片由玩家的进程决定······
不是单一的一张图片,而是变化多端的效果。
作者: 美丽晨露    时间: 2013-9-21 19:17
定时存档.rar (237.08 KB, 下载次数: 42)

@kuerlulu

刚刚测试了一会,发现截不出截图出来······
不知道是怎么回事?另外,这里是怎么自定图片文件名字的?
再另外,这个效果是每在游戏中的20分钟截图一次吗?
游戏关闭之后,这个计数会不会被重置?
作者: kuerlulu    时间: 2013-9-21 20:03
标题: RE: 请问如何在游戏进程中截图,并且之后会显示截图。
本帖最后由 kuerlulu 于 2013-9-21 20:18 编辑
美丽晨露 发表于 2013-9-21 19:17
@kuerlulu
刚刚测试了一会,发现截不出截图出来······

不排除脚本常识错误(爪机也不知道你怎么弄的):其实是加了一个判断(3行)放到update里;
那个截图脚本主体就放到main前啦;
48000当然就是20分钟。。你不要真心去等,改成40(一秒一截)看看,然后是用的系统计数器所以除非重新开始游戏(读档后时间没问题)
文件夹名字一定要对,它不会自动创建文件夹。命名规则是设定的文件名(默认是"shot")加一个从1开始的数字,所以读取这些图片也很方便了
另外我觉得你是要特定时间截图,在特定地点事件里加一个那句截图方法就行了
明明最大的亮点是自动更名的说
作者: 美丽晨露    时间: 2013-9-21 20:15
kuerlulu 发表于 2013-9-21 20:03
48000当然就是20分钟。。你不要真心去等,改成40(一秒一截)看看,然后是用的系统计数器所以除非重新开始 ...

新建工程改帧数测试了,文件夹和DLL都存在,
还是截不了图。请您看看范例吧,不知道那儿设置错了。

作者: 弗雷德    时间: 2013-9-23 00:11
美丽晨露 发表于 2013-9-21 20:15
新建工程改帧数测试了,文件夹和DLL都存在,
还是截不了图。请您看看范例吧,不知道那儿设置错了。
...

kuerlulu 提供的方法不存在任何问题,俺看了一下,是露露脚本添加的位置错了……
kuerlulu的意思是让你将截图语句放进update中,而不是重新写个update方法
你将if (Graphics.frame_count % XXXXX什么的扔进update 方法的loop do下面可有了。
比如原 scene_map:
  1.   #--------------------------------------------------------------------------
  2.   # ● 刷新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     # 循环
  6.     loop do
  7.       # 按照地图、实例、主角的顺序刷新
复制代码
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 刷新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     # 循环
  6.     loop do
  7.     if (Graphics.frame_count % 1500) == 0
  8.       Screen::shot
  9.     end
  10.       # 按照地图、实例、主角的顺序刷新





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