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

Project1

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

[有事请教] 为什么我把Geam.ini里的标题改了名称之后窗口缩放就会失效?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1765
在线时间
103 小时
注册时间
2021-6-20
帖子
31
跳转到指定楼层
1
发表于 2024-2-13 14:15:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 zkq970413 于 2024-2-13 14:25 编辑

如题,我把一些游戏的Geam.ini文件用笔记本打开把日文编码字符换成了中文编码字符,保存之后窗口缩放就失效了,没更改之前打开是1280*960的窗口大小,但更改了之后就是默认的640*480的大小了,从脚本来看好像是编码的原因?但我试过改成GB2312和UTF-8,但都没用,是什么原因呢?还是我没改到位?System目录下还有个wndsz文件,但打开后就几个字符,然后这个Geam.ini文件和以往的不同,也会保存如音量之类的设置,而其他游戏却很少见这种情况,这是什么原因呢?






脚本代码如下:
RUBY 代码复制
  1. #******************************************************************************
  2. #
  3. #    * エセフルスクリーン
  4. #
  5. #  --------------------------------------------------------------------------
  6. #    バージョン :  1.0.2
  7. #    対      応 :  RPGツクールVX : RGSS2
  8. #    制  作  者 :  CACAO
  9. #    配  布  元 : [url]http://cacaosoft.webcrow.jp/[/url]
  10. #  --------------------------------------------------------------------------
  11. #   == 概    要 ==
  12. #
  13. #   : ウィンドウのサイズを変更する機能を追加します。
  14. #
  15. #  --------------------------------------------------------------------------
  16. #   == 使用方法 ==
  17. #
  18. #    ★ WLIB::SetGameWindowSize(width, height)
  19. #     ウィンドウを中央に移動し、指定されたサイズに変更します。
  20. #     引数が負数、もしくはデスクトップより大きい場合はフルサイズで表示されます。
  21. #     処理が失敗すると false を返します。
  22. #
  23. #
  24. #******************************************************************************
  25.  
  26.  
  27. #==============================================================================
  28. # ◆ ユーザー設定
  29. #==============================================================================
  30. module WND_SIZE
  31.   #--------------------------------------------------------------------------
  32.   # ◇ サイズ変更キー
  33.   #--------------------------------------------------------------------------
  34.   #     nil .. サイズ変更を行わない
  35.   #--------------------------------------------------------------------------
  36.   INPUT_KEY = :F5
  37.   #--------------------------------------------------------------------------
  38.   # ◇ サイズリスト
  39.   #--------------------------------------------------------------------------
  40.   #     [ [横幅, 縦幅], ... ] のような二次元配列で設定します。
  41.   #     幅を 0 にするとデスクトップサイズになります。
  42.   #--------------------------------------------------------------------------
  43.   SIZE_LIST = [ [640,480], [1280,960], [0,0]  ]
  44.   #--------------------------------------------------------------------------
  45.   # ◇ セーブファイル
  46.   #--------------------------------------------------------------------------
  47.   #   ウィンドウサイズの状況を保存するファイル名を設定します。
  48.   #   nil にすると、サイズを保存しません。
  49.   #--------------------------------------------------------------------------
  50.   FILE_SAVE = "System/wndsz"
  51.   #--------------------------------------------------------------------------
  52.   # ◇ 構成設定ファイル
  53.   #--------------------------------------------------------------------------
  54.   #   セクション名 [Window] キー WIDTH=横幅  HEIGHT=縦幅 を読み込みます。
  55.   #   nil にすると、サイズを保存しません。
  56.   #--------------------------------------------------------------------------
  57.   FILE_INI = nil
  58. end
  59.  
  60.  
  61. #/////////////////////////////////////////////////////////////////////////////#
  62. #                                                                             #
  63. #                下記のスクリプトを変更する必要はありません。                 #
  64. #                                                                             #
  65. #/////////////////////////////////////////////////////////////////////////////#
  66.  
  67.  
  68. module WLIB
  69.   #--------------------------------------------------------------------------
  70.   # ● 定数
  71.   #--------------------------------------------------------------------------
  72.   # SystemMetrics
  73.   SM_CYCAPTION  = 0x04                    # タイトルバーの高さ
  74.   SM_CXDLGFRAME = 0x07                    # 枠の幅
  75.   SM_CYDLGFRAME = 0x08                    # 枠の高さ
  76.   # SetWindowPos
  77.   SWP_NOSIZE     = 0x01                   # サイズ変更なし
  78.   SWP_NOMOVE     = 0x02                   # 位置変更なし
  79.   SWP_NOZORDER   = 0x04                   # 並び変更なし
  80.   #--------------------------------------------------------------------------
  81.   # ● Win32API
  82.   #--------------------------------------------------------------------------
  83.   @@FindWindow =
  84.     Win32API.new('user32', 'FindWindow', 'pp', 'l')
  85.   @@GetDesktopWindow =
  86.     Win32API.new('user32', 'GetDesktopWindow', 'v', 'l')
  87.   @@SetWindowPos =
  88.     Win32API.new('user32', 'SetWindowPos', 'lliiiii', 'i')
  89.   @@GetClientRect =
  90.     Win32API.new('user32', 'GetClientRect', 'lp', 'i')
  91.   @@GetWindowRect =
  92.     Win32API.new('user32', 'GetWindowRect', 'lp', 'i')
  93.   @@GetWindowLong =
  94.     Win32API.new('user32', 'GetWindowLong', 'li', 'l')
  95.   @@GetSystemMetrics =
  96.     Win32API.new('user32', 'GetSystemMetrics', 'i', 'i')
  97.   @@SystemParametersInfo =
  98.     Win32API.new('user32', 'SystemParametersInfo', 'iipi', 'i')
  99.   #--------------------------------------------------------------------------
  100.   # ● ウィンドウの情報
  101.   #--------------------------------------------------------------------------
  102.   GAME_TITLE  = load_data("Data/System.rvdata2").game_title.encode('SHIFT_JIS')
  103.   GAME_HANDLE = @@FindWindow.call("RGSS Player", GAME_TITLE)
  104.   # GAME_HANDLE = Win32API.new('user32', 'GetForegroundWindow', 'v', 'l').call
  105.   GAME_STYLE   = @@GetWindowLong.call(GAME_HANDLE, -16)
  106.   GAME_EXSTYLE = @@GetWindowLong.call(GAME_HANDLE, -20)
  107.   HDSK = @@GetDesktopWindow.call
  108.  
  109. module_function
  110.   #--------------------------------------------------------------------------
  111.   # ● GetWindowRect
  112.   #--------------------------------------------------------------------------
  113.   def GetWindowRect(hwnd)
  114.     r = [0,0,0,0].pack('l4')
  115.     if @@GetWindowRect.call(hwnd, r) != 0
  116.       result = Rect.new(*r.unpack('l4'))
  117.       result.width -= result.x
  118.       result.height -= result.y
  119.     else
  120.       result = nil
  121.     end
  122.     return result
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● GetClientRect
  126.   #--------------------------------------------------------------------------
  127.   def GetClientRect(hwnd)
  128.     r = [0,0,0,0].pack('l4')
  129.     if @@GetClientRect.call(hwnd, r) != 0
  130.       result = Rect.new(*r.unpack('l4'))
  131.     else
  132.       result = nil
  133.     end
  134.     return result
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # ● GetSystemMetrics
  138.   #--------------------------------------------------------------------------
  139.   def GetSystemMetrics(index)
  140.     @@GetSystemMetrics.call(index)
  141.   end
  142.   #--------------------------------------------------------------------------
  143.   # ● SetWindowPos
  144.   #--------------------------------------------------------------------------
  145.   def SetWindowPos(hwnd, x, y, width, height, z, flag)
  146.     @@SetWindowPos.call(hwnd, z, x, y, width, height, flag) != 0
  147.   end
  148.  
  149.   #--------------------------------------------------------------------------
  150.   # ● ウィンドウのサイズを取得
  151.   #--------------------------------------------------------------------------
  152.   def GetGameWindowRect
  153.     GetWindowRect(GAME_HANDLE)
  154.   end
  155.   #--------------------------------------------------------------------------
  156.   # ● ウィンドウのクライアントサイズを取得
  157.   #--------------------------------------------------------------------------
  158.   def GetGameClientRect
  159.     GetClientRect(GAME_HANDLE)
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● デスクトップのサイズを取得
  163.   #--------------------------------------------------------------------------
  164.   def GetDesktopRect
  165.     r = [0,0,0,0].pack('l4')
  166.     if @@SystemParametersInfo.call(0x30, 0, r, 0) != 0
  167.       result = Rect.new(*r.unpack('l4'))
  168.       result.width -= result.x
  169.       result.height -= result.y
  170.     else
  171.       result = nil
  172.     end
  173.     return result
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # ● ウィンドウのフレームサイズを取得
  177.   #--------------------------------------------------------------------------
  178.   def GetFrameSize
  179.     return [
  180.       GetSystemMetrics(SM_CYCAPTION),   # タイトルバー
  181.       GetSystemMetrics(SM_CXDLGFRAME),  # 左右フレーム
  182.       GetSystemMetrics(SM_CYDLGFRAME)   # 上下フレーム
  183.     ]
  184.   end
  185.   #--------------------------------------------------------------------------
  186.   # ● ウィンドウの位置を変更
  187.   #--------------------------------------------------------------------------
  188.   def MoveGameWindow(x, y)
  189.     SetWindowPos(GAME_HANDLE, x, y, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER)
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   # ● ウィンドウの位置を中央へ
  193.   #--------------------------------------------------------------------------
  194.   def MoveGameWindowCenter
  195.     dr = GetDesktopRect()
  196.     wr = GetGameWindowRect()
  197.     x = (dr.width - wr.width) / 2
  198.     y = (dr.height - wr.height) / 2
  199.     SetWindowPos(GAME_HANDLE, x, y, 0, 0, 0, SWP_NOSIZE|SWP_NOZORDER)
  200.   end
  201.   #--------------------------------------------------------------------------
  202.   # ● ウィンドウのサイズを変更
  203.   #--------------------------------------------------------------------------
  204.   def SetGameWindowSize(width, height)
  205.     # 各領域の取得
  206.     dr = GetDesktopRect()         # Rect デスクトップ
  207.     wr = GetGameWindowRect()      # Rect ウィンドウ
  208.     cr = GetGameClientRect()      # Rect クライアント
  209.     return false unless dr && wr && cr
  210.     # フレームサイズの取得
  211.     frame = GetFrameSize()
  212.     ft = frame[0] + frame[2]      # タイトルバーの縦幅
  213.     fl = frame[1]                 # 左フレームの横幅
  214.     fs = frame[1] * 2             # 左右フレームの横幅
  215.     fb = frame[2]                 # 下フレームの縦幅
  216.     if width <= 0 || height <= 0 || width >= dr.width || height >= dr.height
  217.       w = dr.width + fs
  218.       h = dr.height + ft + fb
  219.       SetWindowPos(GAME_HANDLE, -fl, -ft, w, h, 0, SWP_NOZORDER)
  220.     else
  221.       w = width + fs
  222.       h = height + ft + fb
  223.       SetWindowPos(GAME_HANDLE, 0, 0, w, h, 0, SWP_NOMOVE|SWP_NOZORDER)
  224.       MoveGameWindowCenter()
  225.     end
  226.   end
  227. end
  228.  
  229. class Scene_Base
  230.   #--------------------------------------------------------------------------
  231.   # ●
  232.   #--------------------------------------------------------------------------
  233.   @@screen_mode = 0
  234.   #--------------------------------------------------------------------------
  235.   # ●
  236.   #--------------------------------------------------------------------------
  237.   def self.screen_mode=(index)
  238.     @@screen_mode = index % WND_SIZE::SIZE_LIST.size
  239.   end
  240.   #--------------------------------------------------------------------------
  241.   # ●
  242.   #--------------------------------------------------------------------------
  243.   def self.screen_mode
  244.     @@screen_mode
  245.   end
  246.   #--------------------------------------------------------------------------
  247.   # ○ フレーム更新
  248.   #--------------------------------------------------------------------------
  249.   alias _cao_update_wndsize update
  250.   def update
  251.     _cao_update_wndsize
  252.     if Input.trigger?(WND_SIZE::INPUT_KEY) && WLIB::GAME_HANDLE != 0
  253.       Scene_Base.screen_mode += 1
  254.       if WLIB::SetGameWindowSize(*WND_SIZE::SIZE_LIST[@@screen_mode])
  255.         if WND_SIZE::FILE_SAVE
  256.           save_data(Scene_Base.screen_mode, WND_SIZE::FILE_SAVE)
  257.         end
  258.       else
  259.         Sound.play_buzzer
  260.       end
  261.     end
  262.   end
  263. end
  264.  
  265. module WND_SIZE
  266.   #--------------------------------------------------------------------------
  267.   # ● 大きいサイズを除去
  268.   #--------------------------------------------------------------------------
  269.   def self.remove_large_window
  270.     dr = WLIB::GetDesktopRect()
  271.     WND_SIZE::SIZE_LIST.reject! do |wsz|
  272.       wsz.size != 2 || dr.width < wsz[0] || dr.height < wsz[1]
  273.     end
  274.     if WND_SIZE::SIZE_LIST.empty?
  275.       WND_SIZE::SIZE_LIST << [Graphics.width, Graphics.height]
  276.     end
  277.   end
  278.   #--------------------------------------------------------------------------
  279.   # ● 初期サイズの設定
  280.   #--------------------------------------------------------------------------
  281.   def self.init_window_size
  282.     if WND_SIZE::FILE_SAVE && File.file?(WND_SIZE::FILE_SAVE)
  283.       # 前回のサイズを復元
  284.       Scene_Base.screen_mode = load_data(WND_SIZE::FILE_SAVE)
  285.       WLIB::SetGameWindowSize(*WND_SIZE::SIZE_LIST[Scene_Base.screen_mode])
  286.     elsif WND_SIZE::FILE_INI
  287.       # 構成設定からサイズを読み込む (サイズを記録していない場合のみ)
  288.       width = IniFile.read(WND_SIZE::FILE_INI, "Window", "WIDTH", "")
  289.       height = IniFile.read(WND_SIZE::FILE_INI, "Window", "HEIGHT", "")
  290.       if width != "" && height != ""
  291.         WLIB::SetGameWindowSize(width.to_i, height.to_i)
  292.       end
  293.     end
  294.   end
  295. end
  296.  
  297. WND_SIZE.remove_large_window
  298. WND_SIZE.init_window_size

Lv3.寻梦者

梦石
0
星屑
1765
在线时间
103 小时
注册时间
2021-6-20
帖子
31
2
 楼主| 发表于 2024-4-23 09:06:39 | 只看该作者
有没有大佬告知如何解决。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
80
在线时间
4 小时
注册时间
2024-4-9
帖子
7
3
发表于 2024-4-24 00:55:38 | 只看该作者
这家社团的前作也是有这样的问题,改成纯英文字符标题就不会有影响
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1765
在线时间
103 小时
注册时间
2021-6-20
帖子
31
4
 楼主| 发表于 2024-4-24 19:47:23 | 只看该作者
cv工程师1191 发表于 2024-4-24 00:55
这家社团的前作也是有这样的问题,改成纯英文字符标题就不会有影响

不止这家社团的游戏有这样的问题吧?我在其它一些社团的游戏也遇到过,英文或者说英文字母或许是世界通用的字符编码了。。。我就是想打开正常显示的名字,不想转码打开咋就这么难呢。。。从提示和代码上来看应该是字符编码的原因,可能是这个插件开发者的源码只支持日本的SHIFT_JIS编码,而英文字母属于是通用的了,所以没啥问题,但如果改成其它国家的字符编码的话就不行了。。。不知道该怎么解决,怕是要从源代码上开刀。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-22 00:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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