python - 在 pygame 中将表面传输到屏幕的正确顺序是什么?

标签 python pygame event-driven

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

唯一的问题是我的背景表面似乎位于错误的位置,并且正在覆盖我所做的任何更改。

这是我的代码:

http://pastebin.com/Nh3yy01X

正如您所看到的,我已经注释掉了我所描述的行,并在主函数中使用基本变量进行了尝试,只是为了测试出了什么问题。

感谢您的帮助。

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

最佳答案

每次循环清除表面

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()

提示:对于颜色,您可以使用诸如 red 之类的人类名称来调用 pygame.Color() (gray20gray80 有一个很好的效果对比,用于背景和文本。)

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

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

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

关于python - 在 pygame 中将表面传输到屏幕的正确顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795644/

相关文章:

python - pygame混音器点击声音

python - Sprite 出现得太快

python - 如何更快地实现贪心集覆盖?

python - 为新样式 ipython (v5) 提示添加颜色

python - 如何根据 Numpy 数组的内容替换其特定条目

ssl - 事件驱动 TLS 服务器

c - C 中带有套接字的事件驱动模型

python - PyCharm 无法识别我的 python 解释器和 PIP 包。也许路径问题?

python - 你如何启动 Pygame 窗口最大化?

multithreading - 为什么 Redis 是单线程的(事件驱动)