Project1

标题: 更改窗体分辨率真实版。 [打印本页]

作者: 美兽    时间: 2007-8-16 00:24
标题: 更改窗体分辨率真实版。
针对提问区的两个问题而写,
http://rpg.blue/viewthread.php?tid=61618
http://rpg.blue/viewthread.php?tid=63926

费了差不多一小时,主要最开始陷入误区,在MSDN找了许久
SetClientRect函数,却没找到,只好绕圈换个角度修改。

解决两个问题,
一:更改客户区大小,即显示画面真实的分辨率,而不是窗体。
二:自动居中。

if $myfirst == nil
  
   $myfirst = 'myGod'  
   宽度=800
   高度=600
   游戏ini名=".\\Game.ini"
   val = "\0"*256
   gps = Win32API.new('kernel32', 'GetPrivateProfileString','pppplp', 'l')
   gps.call("Game", "Title", "", val, 256, 游戏ini名)
   val.delete!("\0")
   title = val
   fw = Win32API.new('user32', 'FindWindow', 'pp', 'i')
   hWnd = fw.call("RGSS Player", title)
   swp = Win32API.new('user32', 'SetWindowPos', 'lliiiii', 'i')

   pointwds = [0,0,0,0].pack('llll')
   pointcet = [0, 0].pack('ll')

   wdsrect = Win32API.new('user32.dll', 'GetWindowRect', 'lp', 'l')
   client_screen = Win32API.new("user32", "ClientToScreen", 'ip', 'i')

   wdsrect.call(hWnd,pointwds)
   client_screen.call(hWnd, pointcet)

   wds = pointwds.unpack('llll')
   cet = pointcet.unpack('ll')

   addw =  wds[2] - wds[0] - 640
   addh =  wds[3] - wds[1] - 480

   x = wds[0] - (宽度 - 640) / 2
   y = wds[1] - (高度 - 480) / 2

   swp.call(hWnd, 0, x, y, 宽度 + addw, 高度 + addh, 0x20)
   
end



此为原版,对照测试下,即可明白区别。
http://rpg.blue/web/htm/news547.htm

作者: 美兽    时间: 2007-8-16 00:24
标题: 更改窗体分辨率真实版。
针对提问区的两个问题而写,
http://rpg.blue/viewthread.php?tid=61618
http://rpg.blue/viewthread.php?tid=63926

费了差不多一小时,主要最开始陷入误区,在MSDN找了许久
SetClientRect函数,却没找到,只好绕圈换个角度修改。

解决两个问题,
一:更改客户区大小,即显示画面真实的分辨率,而不是窗体。
二:自动居中。

if $myfirst == nil
  
   $myfirst = 'myGod'  
   宽度=800
   高度=600
   游戏ini名=".\\Game.ini"
   val = "\0"*256
   gps = Win32API.new('kernel32', 'GetPrivateProfileString','pppplp', 'l')
   gps.call("Game", "Title", "", val, 256, 游戏ini名)
   val.delete!("\0")
   title = val
   fw = Win32API.new('user32', 'FindWindow', 'pp', 'i')
   hWnd = fw.call("RGSS Player", title)
   swp = Win32API.new('user32', 'SetWindowPos', 'lliiiii', 'i')

   pointwds = [0,0,0,0].pack('llll')
   pointcet = [0, 0].pack('ll')

   wdsrect = Win32API.new('user32.dll', 'GetWindowRect', 'lp', 'l')
   client_screen = Win32API.new("user32", "ClientToScreen", 'ip', 'i')

   wdsrect.call(hWnd,pointwds)
   client_screen.call(hWnd, pointcet)

   wds = pointwds.unpack('llll')
   cet = pointcet.unpack('ll')

   addw =  wds[2] - wds[0] - 640
   addh =  wds[3] - wds[1] - 480

   x = wds[0] - (宽度 - 640) / 2
   y = wds[1] - (高度 - 480) / 2

   swp.call(hWnd, 0, x, y, 宽度 + addw, 高度 + addh, 0x20)
   
end



此为原版,对照测试下,即可明白区别。
http://rpg.blue/web/htm/news547.htm

作者: 美兽    时间: 2007-8-16 00:31
以下引用暴动冲锋于2007-8-15 16:28:58的发言:

是不是直接把画面扯成高分辨率?


将原本更改窗体改为更改用户区。
作者: 面粉    时间: 2007-8-16 01:04
还需要改一下视口的大小,同时很多坐标以及矩形的边缘也需要调整……

再测试测试 - -bbb


作者: 亿万星辰    时间: 2007-8-16 01:07
这个太好了,直接可以把分辨率弄大了....

找了一下,原来实现并不复杂,只是从来没想过这个问题竟然可以这样解决.......太神奇了....{/fd}
作者: yehaojie    时间: 2007-8-16 01:26
以下引用亿万星辰于2007-8-15 17:07:48的发言:

这个太好了,直接可以把分辨率弄大了....

找了一下,原来实现并不复杂,只是从来没想过这个问题竟然可以这样解决.......太神奇了....


[本贴由作者于 2007-8-15 17:19:06 最后编辑]

哈哈~{/cy}
作者: minji    时间: 2007-8-16 06:37
AdjustWindowRectEx [LINE]1,#dddddd[/LINE]版主对此帖的评论:『你在干嘛?』,积分『-200』。这些被扣积分的一半会用于对本帖正确答案的悬赏。 [LINE]1,#dddddd[/LINE]版主对此帖的认可:『不好意思』,积分『+220』。
作者: 面粉    时间: 2007-8-16 07:18
目前试验结果如下 - -bbbbbb

修改viewports和矩形坐标、范围后,战斗场景可以实现800*600

问题是地图类……仅仅修改Tilemap的关联视口范围会产生比较RP的问题……

只能显示部分640*480之外的地图元件。

怀疑是否需要接着修改Tilemap类中的一些方法,因为不能显示出来的大多是自动元件。

而Tilemap类在帮助内并没有给出……

头脑混乱了  @_@
作者: BB崽    时间: 2007-8-16 16:20
这个东西研究了很久了~~

就是无法完美化~~~

{/cy}{/cy}{/cy}

美兽大大 不如 出两套套800X600和1024X78的默认系统

刷新以前是一个大问题,再就是速度
作者: 柳柳    时间: 2007-8-16 16:23
以下引用面粉于2007-8-15 23:18:16的发言:

目前试验结果如下 - -bbbbbb


核心有了,别的难道还远吗?
——by 毛泽东

大不了直接把地图作成双远景的模式,不用tilemap了~
作者: BB崽    时间: 2007-8-16 16:27
用做AVG类游戏 比较好

RPG 对默认系统的修改还有很多~~

以前那个可是一年半前 66亲自手写的脚本啊{/cy}{/cy}
作者: 小真·爱舞    时间: 2007-8-16 19:44
800*600的美工排版和640*480是不一样的..我也没有经验。
640*480这个我还会继续用..美兽这个先搁置吧。
等以后制作别的游戏的时候再考虑。
作者: 美兽    时间: 2007-8-17 03:39
以下引用亿万星辰于2007-8-15 17:07:48的发言:

这个太好了,直接可以把分辨率弄大了....

找了一下,原来实现并不复杂,只是从来没想过这个问题竟然可以这样解决.......太神奇了....


[本贴由作者于 2007-8-15 17:19:06 最后编辑]


其实若最开始若知道minji所给的函数,应该就不是这种思路,不过现在想想思路确实很神奇。


以下引用minji于2007-8-15 22:37:04的发言:

AdjustWindowRectEx


谢谢,非常感谢,
仔细看了下,
若用该函数,还需要配合getwindowlong获取标题样式,
书写上简化不了多少,
感觉还是留个思路偏锋的比较有趣。
以下引用面粉于2007-8-15 23:18:16的发言:

目前试验结果如下 - -bbbbbb

修改viewports和矩形坐标、范围后,战斗场景可以实现800*600

问题是地图类……仅仅修改Tilemap的关联视口范围会产生比较RP的问题……

只能显示部分640*480之外的地图元件。

怀疑是否需要接着修改Tilemap类中的一些方法,因为不能显示出来的大多是自动元件。

而Tilemap类在帮助内并没有给出……

头脑混乱了  @_@


这个……
确实如此——
要不像66所说,用远景吧,或者利用精灵数组重构地图显示,并不是很复杂。


以下引用BB崽于2007-8-16 8:20:09的发言:

这个东西研究了很久了~~

就是无法完美化~~~



美兽大大 不如 出两套套800X600和1024X78的默认系统

刷新以前是一个大问题,再就是速度


这个——
修改杂七杂八的东西太多了——
而且大多都是没什么意义的坐标调整,
不上当,不上当。
作者: 美兽    时间: 2007-8-17 03:47
做了个小更新,解决F12重置引起的BUG,使用的是很笨的方法— —

if $myfirst == nil
  
   $myfirst = 'myGod'  
   宽度=800
   高度=600
   游戏ini名=".\\Game.ini"
   val = "\0"*256
   gps = Win32API.new('kernel32', 'GetPrivateProfileString','pppplp', 'l')
   gps.call("Game", "Title", "", val, 256, 游戏ini名)
   val.delete!("\0")
   title = val
   fw = Win32API.new('user32', 'FindWindow', 'pp', 'i')
   hWnd = fw.call("RGSS Player", title)
   swp = Win32API.new('user32', 'SetWindowPos', 'lliiiii', 'i')

   pointwds = [0,0,0,0].pack('llll')
   pointcet = [0, 0].pack('ll')

   wdsrect = Win32API.new('user32.dll', 'GetWindowRect', 'lp', 'l')
   client_screen = Win32API.new("user32", "ClientToScreen", 'ip', 'i')

   wdsrect.call(hWnd,pointwds)
   client_screen.call(hWnd, pointcet)

   wds = pointwds.unpack('llll')
   cet = pointcet.unpack('ll')

   addw =  wds[2] - wds[0] - 640
   addh =  wds[3] - wds[1] - 480

   x = wds[0] - (宽度 - 640) / 2
   y = wds[1] - (高度 - 480) / 2

   swp.call(hWnd, 0, x, y, 宽度 + addw, 高度 + addh, 0x20)
   
end

作者: 纯子    时间: 2007-8-17 18:31
美兽大人~
改为800×600后怎么还原呢?{/hx}
作者: 叶舞枫    时间: 2007-8-17 18:52
发布完毕
http://rpg.blue/web/htm/news821.htm
VIP 2
作者: 纯子    时间: 2007-8-17 19:21
以下引用纯子于2007-8-17 10:31:29的发言:

美兽大人~
改为800×600后怎么还原呢?

补充一下,全屏后好像就失效了...
再返回就又变成640×480了{/gg}
作者: gpra8764    时间: 2007-8-20 20:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: 爱吃鱼の猫    时间: 2007-8-24 00:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: 美兽    时间: 2007-8-29 02:38
以下引用纯子于2007-8-17 10:31:29的发言:

美兽大人~
改为800×600后怎么还原呢?


以下引用纯子于2007-8-17 11:21:41的发言:


以下引用纯子于2007-8-17 10:31:29的发言:

美兽大人~
改为800×600后怎么还原呢?


补充一下,全屏后好像就失效了...
再返回就又变成640×480了


还原??

更改独占设备的全屏环境在下暂时做不到,

但返回恢复为800*600很容易,

如果有使用的必要,

可以将要求一并提出,

在下尽量力所能及。

作者: 黑色连环画    时间: 2008-3-1 23:04
没效果啊。。。是黑边
作者: 千月    时间: 2008-4-3 00:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: 冰水    时间: 2008-4-3 04:04
这个直接用当然黑边了
因为默认的都是640×480的,几乎所有窗口的坐标都要自己调……orz

作者: 叶子    时间: 2008-7-19 14:38
有个问题想请教一下,顶起老贴先说句不好意思了
改大分辨率以后,关于渐变的操作(Graphics.freeze,Graphics.transition等)仍然只对原来的640x480范围有效,例如显示一张800x600的图,执行Graphics.freeze,把图关掉后再Graphics.transition,会发现640x480范围内正常渐变,范围外的内容则直接消失,显得非常突兀,不知道有没有解决办法?
作者: 司马睿风    时间: 2008-7-19 22:39
类似的问题我也遇见过,我现在也在想,虽然我不打算做超过640*480的游戏
作者: 灼眼的夏娜    时间: 2008-7-19 22:50
以下引用叶子于2008-7-19 6:38:13的发言:

有个问题想请教一下,顶起老贴先说句不好意思了
改大分辨率以后,关于渐变的操作(Graphics.freeze,Graphics.transition等)仍然只对原来的640x480范围有效,例如显示一张800x600的图,执行Graphics.freeze,把图关掉后再Graphics.transition,会发现640x480范围内正常渐变,范围外的内容则直接消失,显得非常突兀,不知道有没有解决办法?

~~ = = 叶子自己重写那两方法= ={/gg}
作者: 司马睿风    时间: 2008-7-19 22:53
和我思路一样,其实我看他就是懒,大家都看出来了
作者: hide秀    时间: 2008-7-19 23:30
有个问题想请教一下,顶起老贴先说句不好意思了
改大分辨率以后,关于渐变的操作(Graphics.freeze,Graphics.transition等)仍然只对原来的640x480范围有效,例如显示一张800x600的图,执行Graphics.freeze,把图关掉后再Graphics.transition,会发现640x480范围内正常渐变,范围外的内容则直接消失,显得非常突兀,不知道有没有解决办法?

估计叶子真的是懒了~赫赫
其实我的吞食天地2ND也碰到如此问题 还好叶子提醒我了{/cy}
对不起了小夏{/hx}
还是帮下叶子吧
也不开贴子了 估计大多数人还是用640的
如果窗口是1024*768的 开始的@@vt变量这里相应的修改分辨率就可以了

很容易裂解的脚本但和原来有点不一样:


module Graphics
  
  @@vt = Viewport.new(0,0,1024,768)
  @@vt.z = 9999999
  
  @@freezed = false
  @@st = nil
  @@bt = Bitmap.new(@@vt.rect.width,@@vt.rect.height)
  @@bt.fill_rect(@@bt.rect,Color.new(0,0,0,255))

  module_function
  
  def transition(frame_count = 20,filename = "")
    @@freezed = false
    value = (255.to_f / frame_count)

    if filename == ""
      @@st = Sprite.new(@@vt)
      @@st.bitmap = @@bt
      pls = 0
      for i in 0...frame_count
        pls += value
        @@st.opacity = 255 - pls
        self.update
      end
      @@st.dispose
      @@st = nil
      return
    end

    mask_sp = Sprite.new(@@vt)
    mask_bi = Bitmap.new(filename)
    mask_sp.bitmap = mask_bi
    mask_sp.z = @@st.z + 1 if @@st != nil
    mask_sp.blend_type = 2

    pls = 0
    for i in 0...frame_count
      pls += value
      mask_sp.opacity = 255 - pls
      @@bt.fill_rect(@@bt.rect,Color.new(pls,pls,pls,255 - pls))
      self.update
    end

    mask_bi.dispose
    mask_sp.dispose
   
    @@st.dispose if @@st != nil
    @@st = nil
  end

  def freeze
    return if @@freezed
    @@freezed = true
    @@st = Sprite.new(@@vt)
    @@st.bitmap = @@bt
  end
  
end

作者: 叶子    时间: 2008-7-20 05:36
先谢谢了>.<
其实我又笨又懒所以没想这个方法吧

def freeze
   return if @@freezed
   @@freezed = true
   @@st = Sprite.new(@@vt)
   @@st.bitmap = @@bt
end

不过这样好象是直接盖一张黑色的图片上去,跟原来的Graphics.freeze把画面定格有点出入吧

以下引用灼眼的夏娜于2008-7-19 14:50:08的发言:

~~ = = 叶子自己重写那两方法= =

我不知道freeze和transion原来的代码,重写也没办法达到那种效果{/gg}简单的透明度变化的渐变可以通过很多种途径实现,不过根据渐变图的渐变就不知道怎么做了
作者: 美兽    时间: 2008-7-20 07:27
好多年没进这个区了,哎,蛮伤感的,以前修改过,不过是通过扫描图片建立轨迹库的形式变化,不过现在应该有更好的方式,我呆会回家翻翻邮箱,实在找不到就只能谈谈方法了。
作者: 叶子    时间: 2008-7-20 07:43
嗯,麻烦美兽了
作者: hide秀    时间: 2008-7-20 08:06
我不知道freeze和transion原来的代码,重写也没办法达到那种效果简单的透明度变化的渐变可以通过很多种途径实现,不过根据渐变图的渐变就不知道怎么做了


这个脚本用渐变图有什么问题吗???渐变图要1024*768的哦~{/cy}
作者: 叶子    时间: 2008-7-20 09:10
你给出的脚本应该是实现黑屏过度,或者是盖上一张图片再渐隐的效果吧?
不过我想要的是原来那种画面定格渐变过度到下一画面的效果o.o 虽然可以用截图等的方法,但我还是想看看有没有更简单的
作者: 阁中人    时间: 2008-7-21 17:48
疑难问题终于要解决了吗- -

我在用本来就有透明的PNG在冒充渐变效果呢- -
作者: 蓝色‰寒心梦    时间: 2008-7-22 02:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: tonyfox    时间: 2008-9-14 01:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: tonyfox    时间: 2008-9-14 01:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: 美兽    时间: 2008-9-14 03:49
有个API可以冻结画面,但保持程序运行,测试成功.

有个API重绘部分画面,测试出现错误,当年只做到这里,之后在下因为那件事不玩RM了,抱歉,今天才想起还拖欠叶子一个回复......
作者: 冰城飞狐    时间: 2008-9-14 06:19
那个……还有个问题……
怎么实现800*600窗口的全屏啊?
默认全屏是这样的:

  1. $keybd = Win32API.new 'user32.dll', 'keybd_event', ['i', 'i', 'l', 'l'], 'v'
  2. $keybd.call 0xA4, 0, 0, 0
  3. $keybd.call 13, 0, 0, 0
  4. $keybd.call 13, 0, 2, 0
  5. $keybd.call 0xA4, 0, 2, 0
复制代码

作者: 阁中人    时间: 2008-9-14 18:05
以下引用冰城飞狐于2008-9-13 22:19:33的发言:

那个……还有个问题……
怎么实现800*600窗口的全屏啊?
默认全屏是这样的:

   本帖相关代码如下:
$keybd = Win32API.new 'user32.dll', 'keybd_event', ['i', 'i', 'l', 'l'], 'v'
$keybd.call 0xA4, 0, 0, 0
$keybd.call 13, 0, 0, 0
$keybd.call 13, 0, 2, 0
$keybd.call 0xA4, 0, 2, 0



[本贴由作者于 2008-9-13 22:21:29 最后编辑]

这几行脚本不是用来全屏的…………RMXP有默认按下ALT+ENTER就全屏的功能,这几行脚本只是用脚本来模拟键盘按键而已……
作者: 龙轩    时间: 2008-9-15 23:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: 冰城飞狐    时间: 2008-9-15 23:24
那个……汗……
Graphics库究竟是怎么改的啊?
作者: BB崽    时间: 2009-6-12 08:00
minji发言的

AdjustWindowRectEx

不是乱写的

AdjustWindowRectEx 是API函数 该函数依据所需客户矩形大小,计算需要的窗口矩形的大小

望版主 加上他的分~




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