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

Project1

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

[已经解决] 怎么让游戏的字体指定放在游戏目录下的font?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4890
在线时间
915 小时
注册时间
2015-7-1
帖子
362
跳转到指定楼层
1
发表于 2017-11-24 10:36:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
是这样的,我用了别的字体,然后想在游戏目录下创个font文件夹放字体文件,然后指定这个文件夹的字体文件作为游戏字体,

这样就算缺字体的话,玩家也不用特地把游戏目录下的字体拉出来,放到windows的Fonts文件夹下了,
像这样,

请问能实现吗?

【四季】已上架steam!欢迎大家来玩!

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

2
发表于 2017-11-24 13:49:00 | 只看该作者
当然啦
首先在脚本 Main 前面插入
RUBY 代码复制
  1. # 加载字体 修改第二行为字体文件名
  2. path=Dir.pwd+"/Font/晨光熹微.ttf"
  3. MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
  4. len=MultiByteToWideChar.call(0xFDE9,0,path,-1,0,0)
  5. path2="\0"*len*4
  6. MultiByteToWideChar.call(0xFDE9,0,path,-1,path2,len)
  7. Win32API.new('gdi32','AddFontResourceW','p','l').call(path2)

记得按说明修改字体文件名字

然后把 Main 的第11行
Font.default_name = (["黑体"])
的黑体改成你的字体名字
就可以了
注意字体的文件名和字体名不一样

有问题请提

点评

game.exe打开后没有的字体的情况下再打开工程的测试看一下又有了.  发表于 2017-11-24 16:24
嗯 得知了 马上修正 我大概有猜测了  发表于 2017-11-24 16:24
还有一种情况是添加字体后,用game.exe打开也是没有显示的  发表于 2017-11-24 16:21
我刚刚测试了各种情况,发现刚添加新字体的时候,在工程打开时没有显示文字,然后再打开一次又有了  发表于 2017-11-24 16:21
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39701
在线时间
7486 小时
注册时间
2009-7-6
帖子
13483

开拓者贵宾

3
发表于 2017-11-24 14:35:27 | 只看该作者
SixRC 发表于 2017-11-24 13:49
当然啦
首先在脚本 Main 前面插入
# 加载字体 修改第二行为字体文件名

我觉得可能这样不行,曾经有人研究过这个问题,好像必须在
RGSSInitialize前加载字体文件才行。

点评

第一次的确不会刷新 但不是在 RGSSInitialize 大概是在 RGSSMain 里面确定了字体资源  发表于 2017-11-24 16:57
我测试过了 可以的  发表于 2017-11-24 16:17

评分

参与人数 1星屑 +20 收起 理由
RyanBern + 20 醋瞎的讨论

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 1 反对 0

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

4
发表于 2017-11-24 16:15:44 手机端发表。 | 只看该作者
我的做法是调用addfont的api之后,重启game.exe

点评

加密档案在第一次RGSS载入的时候就会进行处理 把资源提取到内存等 然后之重载RGSS就不需要再次对加密档案进行处理了吧 所以开心的可以不要额外处理  发表于 2017-11-24 21:49
加油(๑•̀ㅂ•́)و✧  发表于 2017-11-24 16:50
额 是否需要重启exe我倒是没注意 我有猜测了  发表于 2017-11-24 16:21

评分

参与人数 1星屑 +20 收起 理由
RyanBern + 20 们都会 api

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

5
发表于 2017-11-24 19:42:57 | 只看该作者
本帖最后由 SixRC 于 2018-2-24 15:51 编辑

完成了
老样子 Main 前插入 最好插在最前面 改一下脚本里的字体等信息 Main里改字体就可以了
update 2018.2.24
更新了窗口句柄获取的方式 从内存RGSS储存的地方拿
避免取错句柄的bug 不过还是要重载 没想到好办法 修炼不够
RUBY 代码复制
  1. # 请自行修改第 2、3、4 行 以及 Main 中的字体名字
  2. font_file="/Font/美玉体.ttf"
  3. font_name="美玉体"
  4. dll_name="RGSS103J"
  5. unless Font.exist?(font_name)
  6.   DLL=Win32API.new('kernel32','GetModuleHandle','p','l').call(dll_name)
  7.   code = [139,68,36,4,139,128,196,182,18,0,139,64,8,194,16,0].pack('C*')
  8.   hwnd = Win32API.new('user32.dll','CallWindowProc','pllll','l').call(code,DLL,0,0,0)
  9.   Win32API.new('kernel32','WriteProcessMemory','llpll','l').call(-1,DLL+0xAC25,"\x90"*5,5,0)
  10.   RGSSGameMain=Win32API.new(dll_name,'RGSSGameMain','lpp','l')
  11.   path=Dir.pwd+font_file
  12.   MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
  13.   len=MultiByteToWideChar.call(0xFDE9,0,path,-1,0,0)
  14.   path2="\0"*len*4
  15.   MultiByteToWideChar.call(0xFDE9,0,path,-1,path2,len)
  16.   Win32API.new('gdi32','AddFontResourceW','p','l').call(path2)
  17.   RGSSGameMain.call(hwnd,"Data/Scripts.rxdata","")
  18. end

然后一些闲话
确实 AddFontResource 后不能直接读取字体 得下一次运行 exe 才行
是因为 RGSS 在开始的时候载入了字体列表 (EnumFontFamiliesEx)
这个东西不会在之后刷新 他觉得有就是有没有就是没有除非重载 RGSS
那就重载 RGSS 嘛!
不过直接重载的话 会多一个控制线程
一个副作用就是 10s hangup 变成了 5s 因为两个控制线程一起计数
所以重载前把创建线程的函数 nop 掉
大概 就没什么问题了?
而重载的时候 RGSSGameMain 的一个参数是加密档案地址
不过因为第一次载入的时候进行了处理 所以重载的时候直接传入空字符就可以

RMVA  @Lemax   
虽然载入字体资源后 Font.exist?(xxx) 总是显示 false
但实际上显示的时候是正确载入的 所以单纯载入即可
倒是 1.9 版本的 ruby 的 Dir.pwd 的编码很.. 不能直接转成 utf-8 转了也不正确..
代码
因为我下的是日文版..我不清楚有什么细节不同
可能要在 Main 里面修改默认字体
RUBY 代码复制
  1. # 请自行修改 2、3 行
  2. font_file="/Font/美玉体.ttf"
  3. font_name="美玉体"
  4. unless Font.exist?(font_name)
  5.   GetCurrentDirectory=Win32API.new('kernel32','GetCurrentDirectoryW','lp','l')
  6.   MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
  7.   len=GetCurrentDirectory.call(0,"")
  8.   buf="\0"*(len-1)*2
  9.   GetCurrentDirectory.call(len,buf)
  10.   len=MultiByteToWideChar.call(0xFDE9,0,font_file,-1,0,0)
  11.   fa="\0"*len*2
  12.   MultiByteToWideChar.call(0xFDE9,0,font_file,-1,fa,len)
  13.   path=buf+fa
  14.   Win32API.new('gdi32','AddFontResourceW','p','l').call(path)
  15. end
  16. Font.default_name=font_name





点评

请问能否适用于VA?  发表于 2017-11-24 23:19
好的~有作用就好~谢谢~  发表于 2017-11-24 21:46
加了判定 假如读取到了字体就不会再次加载了  发表于 2017-11-24 21:45
不啊 你重启一次电脑试试 .. 是因为字体每次重启只需要加载一次就可以的关系  发表于 2017-11-24 21:45
如果只是单单注释掉font_file的话,一切正常,然后我想说font_file难道加不加都没有关系的吗?  发表于 2017-11-24 21:44

评分

参与人数 2星屑 +90 +1 收起 理由
RyanBern + 90 认可答案
L7-wind + 1 认可答案

查看全部评分

回复 支持 3 反对 0

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

6
发表于 2017-11-28 16:29:57 手机端发表。 | 只看该作者
SixRC 发表于 2017-11-24 19:42
完成了
老样子 Main 前插入 最好插在最前面 改一下脚本里的字体等信息 Main里改字体就可以了
# 请自行修改 ...

感觉,在rgssmain调用后,再运行一遍移除字体的操作更合适?

点评

而且重载RGSS才运行游戏毕竟不是正常打开 不清楚别的副作用 能不重载就尽量不重载吧 我是这样想的  发表于 2017-11-28 17:29
我想不用吧 一是系统里面多一个字体资源没副作用(有吗..不知道)而且关机后会自动清除 二是关机前非第一次运行检测到字体存在就不用再加载了  发表于 2017-11-28 17:27
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

7
发表于 2019-4-9 23:01:17 | 只看该作者
以前的坑 我填一填
之前不知道怎么不重载RGSS加载字体
现在可以了 其实也 蛮好做的 就是我懒
我好像每次一犯懒就说积累不够...(还是真是积累不够???)

言归正传
RGSS 在开始的时候调用了 EnumFontFamiliesEx (我那时候大概是看这个函数解释一大堆就 怕了怕了)
然后它储存了所有字体名字和一些信息
只要依样再调用一次这个函数就行了
过程就是一堆查api 找关键地址



好了好了就这样

评分

参与人数 1+1 收起 理由
L7-wind + 1 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-30 12:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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