在pygame中将屏幕bliming到屏幕的正确顺序是什么?

时间:2011-07-22 20:18:54

标签: python pygame event-driven

我正在创建一个简单的MP3播放器,我的第一个任务是创建一个用户可以按下的简单按钮。我创建了一个名为Button的类来处理这种行为,并检测用户是否单击它然后更改颜色。我现在正在尝试使用按钮显示的默认文本和另一个字符串(pres_string),如果按下该按钮将显示该字符串。

唯一的问题是我的背景表面似乎在错误的地方,并且正在描绘我所做的任何改变。

这是我的代码:

http://pastebin.com/Nh3yy01X

正如您所看到的,我已经注释掉了我描述的行,并在主函数中使用基本变量进行了尝试,以测试出错的地方。

感谢您的帮助。

(随意更改问题的标题,我不确定最准确地描述我的问题)

2 个答案:

答案 0 :(得分:1)

每个循环清除表面

def draw(self):
    # clear screen."
    self.screen.fill( self.color_bg )

    # first draw background
    # Then buttons
    # then any extra top level text

    # update
    pygame.display.flip()

提示:对于颜色,您可以调用pygame.Color(),其中包含redgray20gray80这样的人物名称,具有良好的对比度,可用于bg和文本。 )

    from pygame import Color
    text = Color('gray20')

你的按钮,psuedocode。修复:将颜色移动为实例成员。

class Button(object):
    def __init__(self, text, rect=None):
        self.color_bg = Color("gray20")
        self.color_text = color("gray80")

        if rect is None: rect = Rect(0,0,1,1)
        self.rect = rect
        self._render()   
    def _render(self):
        # draw button and .render() font, cache to surface for later.    
        self.surface_cached = self.surface.copy()
        # render text

        #if size changes, save rect.size of cached surface , mantaining location
        self.rect.size = cache.get_rect.size
    def draw(self):
        # draw cached surface
        screen.blit( self.surface_cached, self.rect)

testClick使用Rect.collidepoint http://www.pygame.org/docs/ref/rect.html#Rect.collidepoint

答案 1 :(得分:0)

基于2D位图的计算机图形就像绘画或绘画 - 你把新墨水放在已经存在的东西之上。所以你的背景必须是你每次画的第一件事。