我在Pygame1.9.1的字体模块中发生了这个奇怪的事情,其中.get_linesize()
为字形高度(更不用说每行高度)渲染大于1的字体返回1.它只发生在.fon
字体。
为了控制,以下是两个示例,以及 工作的第三种字体。我从IDLE的shell运行这些,但同样的事情发生在适当的模块上。 无论如何,Pygame已经初始化了。
>>> testfont = pygame.font.Font("C:/Windows/Fonts/vga850.fon", 12)
>>> testfont.get_linesize() # This one returns 1. For 'Terminal Regular'
1
>>> otherfont = pygame.font.Font("C:/Windows/Fonts/vgafix.fon", 18)
>>> otherfont.get_linesize() # This also returns 1. For 'Fixedsys Regular'
1
>>> lastfont = pygame.font.Font("C:/Windows/Fonts/OCRAStd.otf", 24)
>>> lastfont.get_linesize() # This returns the correct value. For 'OCR A Std Regular'
29
>>> textsurf = testfont.render("This is a nightmare!", True, (0,0,0))
>>> textsurf.get_size()[1] # Let's get the height of this surface...
12
>>> othersurf = otherfont.render("An inescapable nightmare!", False, (0,0,0))
>>> othersurf.get_size()[1] # This one, too. Antialiasing makes no difference.
15
>>> lastsurf = lastfont.render("You're okay, OCRA.", True, (0,0,0))
>>> lastsurf.get_size()[1] # And finally, the control...
25
控件渲染的高度稍微短一些,因为get_linesize()
包含线之间的间隙,这是出于美学原因。
<Font>.size("sample string")[1]
正常工作,因此这是我对行高的权宜之计。
所有三种字体都能正确呈现。
与<Font>.get_linesize()
无法正确回复的字体的共同主题是,它们都共享扩展程序.fon
,因此简单的“解决方案”就是“不要使用{{1}使用 .fon 字体;请改用.get_linesize()
。“
然而,这有点不优雅,(更糟糕的是!)非常无聊,我更感兴趣知道导致这个问题的原因,如果有一种制作这些字体的方法尽可能与.size('sample')[1] + some_adjustment
合作。
我查看了Pygame的文档,无法找到与此问题有关的内容,并且许多网络搜索也没有结果。
答案 0 :(得分:0)
Pygame的Font
支持取决于SDL_ttf,freetype2依赖于pygame.freetype.Font。我怀疑在计算行高的值时存在一些问题,因为字体经过这些层(特别是SDL_ttf层,因为freetype2只读取字体数据)。
考虑使用a much richer而不是pygame.Font。 freetype模块跳过SDL_ttf层并直接使用freetype。那里有一组get_sized_height()字体选项。我会尝试{{3}}作为get_linesize()的替代。
如果仍然不起作用,很可能是在读取FON文件时出现freetype错误,或者可能FON文件本身没有正确设置值。