2012-07-08 45 views
2

我发现了很多使用pygame及其字体库的教程,但它们都显示相同的确切内容。他们都告诉你如何在背景上写一些纯文本,这很好,但除此之外,我没有找到很多有用的信息。无法获取pygame字体在图像上呈现

随着我正在开发的项目,我有一些菜单按钮,我已经实现为精灵。当你将鼠标悬停在它们上面时,它们会改变颜色,而且所有的工作都很好。我想要做的就是在这些按钮上写下文字,但我很困惑如何做到这一点。从文档font.render的工作原理如下:

“这会创建一个新的Surface,其上显示指定的文本Pygame不提供直接在现有Surface上绘制文本的方法:相反,您必须使用Font.render - 绘制在新的Surface上创建文本的图像(Surface),然后将该图像粘贴到另一个Surface上。“

所以我试图把附在我的精灵上的图像直接粘贴到我的文本上。这似乎大多没有做任何事情:

resume = self.button_font.render(
     'Resume Game', 
     True, 
     constants.WHITE, 
     (23, 56, 245) # Main color of the button, tried without this as well 
    ) 
    self.resume_button.image.blit(
     resume, 
     self.resume_button.rect, 
    ) 

我知道代码运行,但你永远不会看到任何文字。如果我将文本直接粘贴到我的主屏幕表面,它只会覆盖我的简历按钮的顶部(取决于当然的顺序)。我究竟做错了什么?文档似乎表明这是处理它的正确方法,但我还没有找到其他人这样做。任何帮助将不胜感激。

回答

11

Did you call convert on your surface of your Sprite?如果不是,最好这样做。

在您的表面上有不同的像素格式会导致各种恼人的和难以理解的错误。


实施例:

import pygame 

pygame.init() 
screen = pygame.display.set_mode((400, 400)) 
image = pygame.image.load('1.png') 

sprite = pygame.sprite.Sprite() 
sprite.image = image 
sprite.rect = image.get_rect() 

font = pygame.font.SysFont('Sans', 50) 
text = font.render('This is a text', True, (255, 0, 0)) 

sprite.image.blit(text, sprite.rect) 

group = pygame.sprite.Group() 
group.add(sprite) 
group.draw(screen) 

pygame.display.flip() 

print 'bits per pixel:' 
print 'image', image.get_bitsize() 
print 'screen', screen.get_bitsize() 

这将导致以下缺陷:

without convert

输出:

bits per pixel 
image 8 
screen 32 

现在改线

image = pygame.image.load('1.png') 

image = pygame.image.load('1.png').convert() 

,一切都会好起来的:

with convert

输出:

bits per pixel 
image 32 
screen 32 
+2

+1(我可以做+2)用于将明确的代码和解释与结果配对。非常好。 – Argalatyr 2012-07-08 20:37:20