查看: 2014|回复: 2

[已经解决] 【字体读取】读取字体文件需要重启游戏才能生效怎么办

[复制链接]
梦石
0
星屑
3905
在线时间
1972 小时
注册时间
2013-1-3
回帖
9146
发表于 2023-4-24 09:42:31 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 紫英晓狼1130 于 2023-4-24 10:13 编辑

自动读取字体文件需要重启游戏才能生效怎么办?
插入了以下的自动读取文件夹内字体的脚本(见代码段)
但是每次重启电脑之后,就需要游戏重启之后才能正常显示字体……
其他的没什么问题,但每次关机之后都要玩家重启游戏很麻烦……
有两个思路:
①改代码:把这段代码改好,改成不用重启……
②自动重启:游戏程序开始时,再打开一个Game.exe,相当于自动重启游戏

根据2楼脚本,已经可以直接读取字体文件,无需重启
目前来看没什么问题,后续会用更多系统以及机器测试!

[pre lang="ruby"]#==============================================================================
# ■ Font
#------------------------------------------------------------------------------
#  自动读取游戏字体。
#==============================================================================
  font_file = "/Fonts/GameFont.TTF"
  font_name = "GameFont"
  unless Font.exist?(font_name)
    GetCurrentDirectory = Win32API.new('kernel32', 'GetCurrentDirectoryW', 'lp', 'l')
    MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'llplpl', 'l')
    len = GetCurrentDirectory.call(0, "")
    buf = "\0" * (len - 1) * 2
    GetCurrentDirectory.call(len, buf)
    len = MultiByteToWideChar.call(0xFDE9, 0, font_file, -1, 0, 0)
    fa = "\0" * len * 2
    MultiByteToWideChar.call(0xFDE9, 0, font_file, -1, fa, len)
    path = buf + fa
    Win32API.new('gdi32', 'AddFontResourceW', 'p', 'l').call(path)
  end
  Font.default_name = font_name[/pre]
《宿愿·寻剑篇》正式版已经发布!快去看看!点击进入论坛发布贴
梦石
0
星屑
4756
在线时间
389 小时
注册时间
2012-11-8
回帖
235
发表于 2023-4-24 09:51:23 | 显示全部楼层
  1. font_file=["/Font/wqx-16.ttf","/Font/wqx-12.ttf"]
  2. font_test=["Font/wqx-16.ttf","Font/wqx-12.ttf"]
  3. font_name=["WQX16","WQX12"]
  4. dll_name="RGSS103J"
  5. for i in 0..1
  6.   # 字体未安装且存在字体文件则进行安装
  7.   if not Font.exist?(font_name[i]) and FileTest.exist?(font_test[i])
  8.     m2w = Win32API.new("kernel32","MultiByteToWideChar","llplpl","l")
  9.     w2m = Win32API.new("kernel32","WideCharToMultiByte","llplplll","l")
  10.     effe = Win32API.new("gdi32","EnumFontFamiliesExA","lplll","v")
  11.     wpm = Win32API.new("kernel32","WriteProcessMemory","lplll","l")
  12.     dll = Win32API.new("kernel32","GetModuleHandle","p","l").call(dll_name)
  13.     # add font resource
  14.     path = Dir.pwd + font_file[i]
  15.     len = m2w.call(0xFDE9, 0, path, -1, "", 0)
  16.     pp = "  " * len
  17.     m2w.call(0xFDE9, 0, path, -1, pp, len)
  18.     Win32API.new("gdi32","AddFontResourceW","p","v").call(pp)
  19.     # font name => ansi
  20.     len = m2w.call(0xFDE9, 0, font_name[i], -1, "", 0)
  21.     uname = "  " * len
  22.     m2w.call(0xFDE9, 0, font_name[i], -1, uname, len)
  23.     len = w2m.call(0, 0, uname, -1, "", 0, 0, 0)
  24.     aname = " " * len
  25.     w2m.call(0, 0, uname, -1, aname, len, 0, 0)
  26.     # get addr of the original lParam
  27.     tt = "    "
  28.     wpm.call(-1, tt, dll + 0x12B6C4, 4, 0)
  29.     wpm.call(-1, tt, tt.unpack("l")[0] + 0x150, 4, 0)
  30.     lp = tt.unpack("l")[0] + 4
  31.     # get dc
  32.     dc = Win32API.new("user32","GetDC","l","l").call(0)
  33.     # prepare logfont
  34.     logfont = [0,0,0,0,0,0,0,0,1,0,0,0,0].pack("l5C*") + aname
  35.     # call effe like RGSS did
  36.     effe.call(dc, logfont, dll + 0x13D60, lp, 0)
  37.     # done
  38.     Win32API.new("user32","ReleaseDC","ll","v").call(0, dc)
  39.   end
  40. end
复制代码

这是我之前抄的一段临时安装字体的脚本,作者应该时论坛内某位大佬。这个可以不用重启

点评

我稍微修改了一下 目前来看可以用 谢谢真有效率!  发表于 2023-4-24 10:11

评分

参与人数 1星屑 +100 赞 +1 收起 理由
RyanBern + 100 + 1 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部