设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 10303|回复: 30
打印 上一主题 下一主题

[RMVX发布] 解决脚本改分辨率潜在问题(欢迎进入讨论)

[复制链接]

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4804
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
跳转到指定楼层
1
发表于 2011-4-10 15:12:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 一箭烂YiJL 于 2011-4-11 20:19 编辑

0.序
嗯~潜在问题,用Graphics.resize_screen这个函数来修改的游戏应该都会有。
(欢迎各位试一下会否出现此问题。)我在想着这个会是VX的bug?

虽然(画面)分辨率的确大了,但是窗体没大,所以看不清楚,
除此之外,还会令鼠标系统变得诡异。


1.楸出问题所在
  • 脚本里写下Graphics.resize_screen(640, 480)
  • 开启游戏,马上狂按最小化按钮,直至窗口最小化为止。
  • 过一阵子把窗口最大化,就会发现(用柳柳的姜太公的小岛做宣传对象):
如果不会弄以上的,二楼提供了一个用脚本楸出问题的办法。

正常的(请按一下图片放大至1比1后才做比较):

如果不相信者可以自己开新工程试,或者对照上图的窗口边的大小。
这种情况会发生在忙于弄其他窗口的玩家身上。
虽然分辨率的确大了,但是窗体没大,所以看不清楚,看不仔细。
除此之外,鼠标系统这种平面视觉都会很诡异!!!。

2.解决办法
先要统一使用紫苏大人的精准获取窗口句柄,请复制其中的脚本。然后才能用:
A.直接的方法——在改分辨率前强制最大化:

  1. $window_width  = 640      # 设置的长度
  2. $window_height = 480      # 设置的高度

  3. hWnd = get_hWnd
  4. ShowWindow = Win32API.new("user32", "ShowWindow", "ll", "l")
  5. ShowWindow.call(hWnd, 9)
  6. Graphics.resize_screen($window_width, $window_height)
复制代码
这个方法可能会有碍游戏给人的好感。

B.婉转的方法——不断的改直到有效
  1. $window_width  = 640      # 设置的长度
  2. $window_height = 480      # 设置的高度

  3. hWnd = get_hWnd
  4. GetClientRect = Win32API.new("user32", "GetClientRect", "lp", "l")
  5. rect = [0,0,0,0].pack("l4")

  6. while rect.unpack("l4")[2,3] != [$window_width, $window_height]
  7.   Graphics.resize_screen(544, 416)
  8.   Graphics.resize_screen($window_width, $window_height)
  9.   GetClientRect.call(hWnd, rect)
  10. end
复制代码
这样的好处就是在最大化的时候才真正改动,不用强制启动窗口。

C.更婉转的方法——面对着窗口的时候才会改:
  1. $window_width  = 640      # 设置的长度
  2. $window_height = 480      # 设置的高度

  3. hWnd = get_hWnd
  4. IsIconic = Win32API.new("user32", "IsIconic", "l", "l")
  5. while IsIconic.call(hWnd) != 0
  6. end
  7. Graphics.resize_screen($window_width, $window_height)
复制代码
这办法比以上二种都要好,但是关于while的停顿写的不好,希望有人指正。

欢迎讨论更多有关这问题的解决办法或思路。

点评

我在我的回复那上传了个恶心附件,您帮我研究研究吧。您是vx高手,到时候教教我啊。我知道我笨,但是我努力学习。  发表于 2011-4-24 21:13
我只是来求LZ头像出处的  发表于 2011-4-10 16:47

评分

参与人数 2星屑 +800 收起 理由
DeathKing + 776 讨论鼓励
summer92 + 24 我很赞同

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
26 小时
注册时间
2011-1-22
帖子
10
2
发表于 2011-4-10 15:53:08 | 只看该作者

用脚本的得出异常的办法

本帖最后由 剑兰的马甲 于 2011-4-10 16:36 编辑

二楼这里提供一个用脚本来得出异常的办法,
同样的需要紫苏大人的精准获取窗口句柄的脚本。然后插进脚本:
  1. hWnd = get_hWnd
  2. CloseWindow = Win32API.new("user32", "CloseWindow", "l", "l")
  3. CloseWindow.call(hWnd)
  4. Graphics.resize_screen(640, 480)
  5. ShowWindow = Win32API.new("user32", "ShowWindow", "ll", "l")
  6. ShowWindow.call(hWnd, 9)
复制代码
测试游戏时什么都不用干就可以了。(你就会发现和一楼的状况差不多。)
这个脚本没有什么动作,只是纯粹最小化然后改分辨率再最大化。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
668 小时
注册时间
2009-11-11
帖子
2787
3
发表于 2011-4-10 17:06:41 | 只看该作者
- -是不是又是开始就更改分辨率,然后减少错误。。。原来我用了个先限制窗口显示再显示的馊办法,进来顶

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4804
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
4
 楼主| 发表于 2011-4-10 17:23:02 | 只看该作者
回复 summer92 的帖子
不是又是开始就更改分辨率,然后减少错误

这个只是防止"分辨率变大,但是窗体没大"导致模糊的bug。
总之主楼的几个办法可以取代Graphics.resize_screen。
(其实可以重写Graphics.resize_screen的...但是目前的方法比较多。)

先限制窗口显示再显示

理解不能。能详细说明办法或者展示脚本吗?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
668 小时
注册时间
2009-11-11
帖子
2787
5
发表于 2011-4-10 17:30:43 | 只看该作者
回复 一箭烂YiJL 的帖子

脚本是使用API那些东西,就是紫苏大的创建窗口前就更改分辨率(XP版),不过是XP版的,我想用在VX上可惜不行,后来只能来个伪方法,先删除game.exe内的显示窗口API函数(这样打开游戏窗口,它就不显示),然后等窗口( 虽然看不见)分辨率改成640480后,再vx脚本里通过API函数将窗口显示出来,只是过程比较慢仔细观察还是能看出来,具体可以看我的帖子
http://rpg.blue/thread-170349-1-1.html
脚本大部分都是API,还有你标题里面的重设大小

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4804
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
6
 楼主| 发表于 2011-4-10 18:09:04 | 只看该作者

潜在问题?:resize_screen改分辨率(欢迎进入讨论)

回复 summer92 的帖子

窗体为最大化改分辨率才有效,而删除Game.exe的ShowWindow并不是好的方法,
毕竟可能还有更重要的任务留在Game.exe。第一个方法也用到ShowWindow,
删不删的分别是不删会弹出来一次。不删的话还有主楼的另外两个方法。

如果你用:精准获取窗口句柄
再加上ShowWindow的API的话。
会否无法显示呢? 精准获取窗口句柄 其中API牵涉到前台(焦点)窗口,
当没把窗口显示出来的时候,会否一直停在获取窗口句柄中呢? (希望你能帮我求证下.)
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
668 小时
注册时间
2009-11-11
帖子
2787
7
发表于 2011-4-10 18:18:23 | 只看该作者
回复 一箭烂YiJL 的帖子

- -我试过啊,就是不会用,API方面我什么都不懂,就是想把XP的移植到VX上,可能是哪个关键环节有问题,主要是不知道通过API控制Window窗口的核心代码吧,要是ruby代码我倒是还会,

“当没把窗口显示出来的时候,会否一直停在获取窗口句柄中呢?” 伪方法的使用倒是没什么问题,game.exe中也只修改了一个显示的DD没影响其他的,只是用起来比紫苏大真正的简洁式要慢一点点,从目的上来说是一样的

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4804
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
8
 楼主| 发表于 2011-4-10 18:37:06 | 只看该作者
本帖最后由 一箭烂YiJL 于 2011-4-10 18:37 编辑

回复 summer92 的帖子

核心代码? API函数和参数是吧。

什么从目的上来说一样,我是指不用HWND.dll来获取窗口句柄,
而使用紫苏大人的纯Ruby来获取。于是我自己尝试了一次,
虽然纯Ruby的获取窗口句柄是可以,但是开了等很久才执行ShowWindow,
反而对游戏造成玩家的不便。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
668 小时
注册时间
2009-11-11
帖子
2787
9
发表于 2011-4-10 19:01:53 | 只看该作者
回复 一箭烂YiJL 的帖子

对啊,就是怎么在ruby里用API控制窗口,不过根据贴子内容似乎不可能,因为创建窗口必须先要经过game.exe处理,所以必须在外面动手不可,XP版的好象是通过代理dll (user33.dll)控制窗口创建过程(user33.dll放到vx工程下无用。。悲剧),句柄的话是在VX脚本内获得的,那个全局变量就是,所以单纯依靠VX代码实现窗口控制是不行的,而且,VX还会在窗口创建后再检查并改回一次分辨率(幸好有大大做了一个删除检查的dll),,综合下来没有dll还是不行,还是等真正的XP游戏窗口启动控制移植VX吧。。。dll我也是外行。。

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4804
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
10
 楼主| 发表于 2011-4-10 20:00:29 | 只看该作者
回复 summer92 的帖子

user33.dll? user32.dll!
如果你说的XP是这个:http://rpg.blue/article-40821.html
原理是用SetWindowPos,其他API都是用于获取窗口句柄和正确坐标,
而SetWindowPos和MoveWindow的功能差不多,他们能让窗口变大,
但不能让RM的像素分辨率上升,也就是把窗口拉长拉高而已。
也就是说,这样可以说不是我们所追求的分辨率。

那么如果是修改RGSSxxxx.dll的话,大致上分两种:
1.脚本式,也就是Graphics.resize_screen释放更大空间
2.初始化式,一开出来的窗口就那么大了
两种来说XP和VX都已经见过了。

http://rpg.blue/article-40821.html
这个无法移植?实质上是可以的。先用紫苏大人的精准获得窗口句柄的脚本。
  1. MoveWindow = Win32API.new("user32", "MoveWindow", "llllll", "i")
  2. MoveWindow.call(get_hWnd, 0, 0, 1024, 768, 0)     # 随意写,所以没理xy坐标
复制代码
出来的效果窗口内很模糊,也就是"分辨率大了,但是窗体没大"。
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-20 10:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表