Pygame Font.render()裁剪大写字母与急性重音,波浪号或旋律

时间:2012-04-15 19:11:24

标签: python fonts rendering pygame diacritics

我正在尝试重新创建我的小python / pygame项目以包含多种语言,我遇到的一个问题是,由于某种原因,重音,渐变等从顶部裁剪,所以只有1或它们的2个像素是可见的。这适用于ie中的大多数“重音”大写字母。法语,波兰语,西班牙语,德语等 这在python 2.7.2和python 3.2中都会发生,使用默认的pygame字体。

尝试呈现以下字符串: 'ÀÂÉÈÊËÎÏÔÙÛÜŸ'

导致渲染图像如下: French letters

我想,我正在使用标准渲染/ blitting技术:

    # -*- coding: utf-8 -*-
    #...
    value = 'ÀÂÉÈÊËÎÏÔÙÛÜŸ'
    if sys.version_info < (3, 0):
        try:
            val = unicode(value, "utf-8")
        except UnicodeDecodeError:
            val = value
        text = font.render("%s" % (val), 1, font_color)
    else:
        val = value
        text = font.render("%s" % (val), 1, font_color)
    self.image.blit(text, (300,300))
    #...
之前有人遇到过这个问题吗?任何变通方法?或者只是pygame.font.render创建了太小的表面以容纳顶部所需的额外空间?也许某种方式设置行高,但我没有找到任何地方......

1 个答案:

答案 0 :(得分:2)

尝试指定字体而不是您正在使用的字体(您使用的是默认字体吗?) - 这很可能是字体中的问题。 - 对我来说,我在我的系统中尝试过所有字体。

对于完整游戏,一个理想的解决方案是将字体文件与项目一起分发 - 因为Pygame打开了给出“.ttf”文件名的字体。

对于使用系统字体,您必须链接调用pygame.font.get_fonts() - 获取字体名称,以pygame.font.match_font实际获取给定字体名称的字体文件的路径,最后是pygame .font.Font传递该路径和一个point-size来获得一个可用的字体对象(使用render方法)

>>> pygame.font.get_fonts()
[u'lohitbengali', u'liberationserif', u'dejavuserif', u'wenquanyimicroheimono', u'dejavulgcsans', u'arplumingcn', u'msam10', u'jomolhari', u'esint10', u'cmr10', u'arplumingtwmbe', u'dejavusans', u'lohitgujarati', u'lohitpunjabi', u'arplumingtw', u'arpluminghk', u'dejavusansmono', u'lohitassamese', u'lohitkannada', u'wenquanyimicrohei', u'khmeros', u'waree', u'lohittamil', u'wasy10', u'padauk', u'lohitdevanagari', u'paktypenaqsh', u'abyssinicasil', u'meera', u'eufm10', u'cmex10', u'khmerossystem', u'lklug', u'lohitoriya', u'msbm10', u'liberationsans', u'rsfs10', u'opensymbol', u'cmsy10', u'lohittelugu', u'paktypetehreer', u'cmmi10', u'liberationmono', u'khmeroscontent']

>>> f2 = pygame.font.match_font(u'paktypetehreer')
>>> f2
u'/usr/share/fonts/paktype-tehreer/PakType_Tehreer.ttf'
>>> font = pygame.font.Font(f2, 60)
>>> f = font.render(u"maçã, joão", 1, (255,255,255))
>>> scr.blit(f, (200,100))
相关问题