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

Project1

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

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

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3841
在线时间
1966 小时
注册时间
2013-1-3
帖子
9536
跳转到指定楼层
1
发表于 2023-4-24 09:42:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

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

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Font
  3. #------------------------------------------------------------------------------
  4. #  自动读取游戏字体。
  5. #==============================================================================
  6.   font_file = "/Fonts/GameFont.TTF"
  7.   font_name = "GameFont"
  8.   unless Font.exist?(font_name)
  9.     GetCurrentDirectory = Win32API.new('kernel32', 'GetCurrentDirectoryW', 'lp', 'l')
  10.     MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'llplpl', 'l')
  11.     len = GetCurrentDirectory.call(0, "")
  12.     buf = "\0" * (len - 1) * 2
  13.     GetCurrentDirectory.call(len, buf)
  14.     len = MultiByteToWideChar.call(0xFDE9, 0, font_file, -1, 0, 0)
  15.     fa = "\0" * len * 2
  16.     MultiByteToWideChar.call(0xFDE9, 0, font_file, -1, fa, len)
  17.     path = buf + fa
  18.     Win32API.new('gdi32', 'AddFontResourceW', 'p', 'l').call(path)
  19.   end
  20.   Font.default_name = font_name
《宿愿·寻剑篇》正式版已经发布!快去看看!点击进入论坛发布贴

Lv3.寻梦者

梦石
0
星屑
4476
在线时间
380 小时
注册时间
2012-11-8
帖子
272
2
发表于 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 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-28 04:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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