首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改实时消息中的字体

更改实时消息中的字体
EN

Stack Overflow用户
提问于 2013-09-27 21:15:30
回答 1查看 360关注 0票数 0

我正在做一个游戏,当你输掉的时候,它基本上意味着游戏结束,但是我想改变字体,我不知道怎么做,这是我关注的代码的一部分:

代码语言:javascript
复制
def end_game(self):
        """ End the game. """
        end_message = games.Message(value = "You didn't eat the pie, game over!",
                                    size = 70,
                                    color = color.red,
                                    x = games.screen.width/2,
                                    y = games.screen.height/2,
                                    lifetime = 7 * games.screen.fps,
                                    after_death = games.screen.quit)
        games.screen.add(end_message)

我想要的是基本上改变字体,比如说卡利布里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-28 03:29:38

简短回答

你不能这么做。

稍长的答案

LiveWires被设计为一种开始学习编程的方法。在尝试这样做的时候,它将试图为你简化事情。首先,像LiveWires这样的库是有用的:它为您做了很多工作,让您集中精力学习代码(并做一个有趣的游戏!)

然而,在某种程度上,这样一个复杂的系统会做一些您可能不希望它做的事情。在我们的例子中,LiveWires使所有文本都使用“默认”字体,并且它似乎没有给出任何改变它的方法。

甚至更长的答案

我可以通过查看LiveWires框架本身的源代码(它也是用Python编写的)来确定这一点。您使用的LiveWires Message类是从LiveWires Text类继承的。您可以自己查看Text类代码;它应该位于名为"games.py“的文件中的”livewire“目录中。下面我将展示"Text“类的一些代码:

代码语言:javascript
复制
class Text(Object, ColourMixin):
    """
    A class for representing text on the screen.

    The reference point of a Text object is the centre of its
    bounding box.
    """

    def __init__(self, screen, x, y, text, size, colour, static=0):

        self.init_text (screen, x, y, text, size, colour, static)

    def init_text (self, screen, x, y, text, size, colour, static=0):
        """
        Arguments:

        screen -- the screen the object is on.
        x -- x-coordinate of centre of bounding box.
        y -- y-coordinate of centre of bounding box.
        text -- the text to display.
        size -- nominal height of the text, in pixels.
        colour -- the colour the text should be.
        """
        if not _have_font:
            raise GameError, "We don't have pygame.font, so can't create text objects"
        self._size = size
        self._colour = colour
        self._text = text
        self._font = pygame.font.Font(None, self._size)
        self._a = 0
        surface = self._create_surface()
        Object.__init__(self, screen, x, y, surface, x_offset=self._x_offset,
                        y_offset=self._y_offset, static=static)
        self.move_to(x,y)

    # There are more methods...

具体来说,我在看__init__方法的这一部分.

代码语言:javascript
复制
self._font = pygame.font.Font(None, self._size)
self._a = 0
surface = self._create_surface()

基本上,LiveWires中的每个文本项都是使用一个pygame.font.Font对象构建的(does是LiveWires用来实际完成许多事情的实用工具)。LiveWires使用特定的方式创建字体对象(使用None作为第一个参数)来查找要使用的“默认”字体。您可以通过以下操作来确定它作为默认字体使用的是什么。

代码语言:javascript
复制
import pygame
print pygame.font.get_default_font()

让字体在不同的计算机上很好地工作可能会很棘手,因此,让所有文本都使用“默认”字体是LiveWires源代码作者采取的一种合理方法。

您应该注意到,_font属性以下划线开头,这是Python中的一种惯例,它基本上是说“不要玩这个!”换句话说,创建消息对象然后尝试.

代码语言:javascript
复制
# Don't do this!
end_message._font = pygame.font.Font('/path/to/my/font/file', size)

虽然这会将消息类中的字体对象替换为不同的字体,但是如果您多读一些代码,您就会意识到文本已经以原始(默认)字体呈现到了表面上;更改字体对象的时间太晚了。

也许有个解决办法。

您可以尝试的一件事是修改LiveWires代码。您可以用.替换我上面显示的文本类中的行..。

代码语言:javascript
复制
self._font = pygame.font.Font("/path/to/my/font/file", self._size)

它将加载与字体文件不同的字体。记住,这会改变游戏中所有文本的字体,因为所有文本都使用相同的文本类。

如果您计划更改LiveWires源代码,请确保您手头有一份原始代码的副本,以防出错并导致LiveWires源代码本身中断。

在此解决方案的基础上

如果您能够完成前面的操作,那么也许您可以进一步修改文本类,以允许您指定字体文件名。这意味着您需要更改文本构造函数( __init__方法)以及init_text方法。此外,调用这些方法的任何其他类(例如,init_text是从LiveWires中的Message.init_message函数调用的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19060181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档