| 赞 | 87 |
| VIP | |
| 好人卡 | |
| 积分 | 136 |
| 经验 | |
| 最后登录 | 2021-1-24 |
| 在线时间 | 2753 小时 |
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 回帖
- 705

|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 SixRC 于 2018-1-27 20:12 编辑
18.1.27
之前是直接不管三七二十一把位图结构拷贝过去了 所以不能dispose 而F12的时候释放了位图会出错
现在新建的位图大小和分辨率一致 只把结构中关于数据操作的一部分拷过去了 F12时释放的还是原来新建的位图
范例还是老的范例 其实只要截图不需要在freeze的时候改位图的话不需要那么麻烦 拿到freeze的位图数据地址就行了
只要截图的话还可以不需要借助freeze只需要画面刷新
不过 颓废中 暂置
17.12.3
发现还需要修改一处数据 否则freeze的大小仍为640×480
暂留置不做处理
[fold=此处代码][pre lang="ruby"]#-------------------------------------------------------------------
# ---SixRC 于 2017.11.5
# 此脚本作用
# 创建一个 $snapshot 位图 把它指向 Graphics.freeze 得到的画面
# 每次需要一张截图时 freeze一次即可通过 $snapshot 访问
# 你甚至可以通过修改 $snapshot 在freeze的时候修改画面
# freeze的大小为dll初始创建窗口的大小 不会在之后改变
# 如果需要扩大freeze界面 需要改dll
# 不过切记不要 dispose 它 无特殊需要暂仅支持 RGSS103J
# 如上
#--------------------------------------------------------------------
RGSS103J=Win32API.new('kernel32','GetModuleHandleA','p','l').call('RGSS103J')
CWP = Win32API.new('user32.dll', 'CallWindowProc', 'pllll', 'l')
# freeze位图结构数据地址为 [[hmodule+0x12B6C4]+0x144]
copy=[139,124,36,4,139,63,139,127,8,139,116,36,8,139,54,139,182,68,1,0,0,139,78,12,137,79,12,139,78,16,137,79,16,194,16,0].pack('C*')
$snapshot=Bitmap.new(640,480)
CWP.call(copy,$snapshot.__id__*2+16,RGSS103J+0x12B6C4,0,0)[/pre][/fold]
这里原理及介绍
rgss 初始创建了一张窗口大小的位图用于之后的 freeze 操作
那张位图数据结构地址见脚本
这脚本就是新建了个$snapshot 然后把结构整个从freeze位图拷到$snapshot了
每一次 freeze 这张图都是 freeze 时显示的画面
操作 $snapshot 相当于操作 freeze 时的画面
你也可以 不需要精灵 改 $snapshot 就等于改了 freeze 时候的画面
要截图 只要freeze transition(0) 然后保存 $snapshot 就可以了
因为原生态 截图是不会有什么副作用的 比方遮挡啊全屏啊等等 游戏显示正常 截图必然显示正常
不过分辨率若不是在 dll 初始就改 freeze 只能 freeze 到初始的分辨率
下面截图范例
freeze截图范例.zip
(203.97 KB, 下载次数: 117)
|
评分
-
查看全部评分
|