如何修复pygame事件循环的缓慢?

时间:2018-05-01 01:48:03

标签: python-3.x pygame

我正在为游戏创建一个按钮类,我正在使用pygame事件循环来检测鼠标点击(特别是当鼠标被释放时)(我听说使用pygame.mousemget_pressed()[0]的方法更好)。但是,事件循环似乎很慢,没有响应并且在单击时执行按钮功能。我想这可能是因为我在课堂上创建事件循环的方式有关,但我不确定。以下是我的代码示例:

class Button:
    """A Button class, built for all kinds of purposes"""
    def __init__(self, window, rect, message, off_color, on_color, message_color, message_font_size):
        pass # just a bunch of variables that use the parameters given

    def in_button(self):  
        mouse_pos = pygame.mouse.get_pos()
        if pygame.Rect(self.rect).collidepoint(mouse_pos):
            return True

    def clicked(self):
        if self.in_button():

            pygame.event.pump() 
            for e in pygame.event.get():
                if e.type == pygame.MOUSEBUTTONUP:
                    return True
# I proceed to create 5 instances using this class.

我在代码中删除了一些不必要的方法信息。如果您还需要更多,请帮助我。

1 个答案:

答案 0 :(得分:1)

您必须以不同的方式实现clicked方法,因为应用程序中应该只有一个事件循环,而不是每个按钮实例中都有一个。 pygame.event.get()清空事件队列,因此每帧调用多次会导致问题。

我建议将事件传递给按钮。在这个(非常简单的)示例中,我将pygame.MOUSEBUTTONDOWN事件传递给clicked方法,然后检查事件的event.pos(鼠标位置)是否与rect冲突。如果它返回True,我会在主函数的事件循环中执行某些操作。

import pygame as pg


class Button:

    def __init__(self, pos):
        self.image = pg.Surface((100, 40))
        self.image.fill(pg.Color('dodgerblue1'))
        self.rect = self.image.get_rect(center=pos)

    def clicked(self, event):
        """Check if the user clicked the button."""
        # pygame.MOUSE* events have an `event.pos` attribute, the mouse
        # position. You can use `pygame.mouse.get_pos()` as well.
        return self.rect.collidepoint(event.pos)


def main():
    screen = pg.display.set_mode((640, 480))
    clock = pg.time.Clock()
    button = Button((100, 60))
    number = 0

    done = False

    while not done:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True
            elif event.type == pg.MOUSEBUTTONDOWN:
                # Pass the MOUSEBUTTONDOWN event to the buttons.
                if button.clicked(event):
                    number += 1  # Do something.
                    print('clicked', number)

        screen.fill((30, 30, 30))
        screen.blit(button.image, button.rect)

        pg.display.flip()
        clock.tick(60)


if __name__ == '__main__':
    pg.init()
    main()
    pg.quit()

如果你想要一个包含多个图像的按钮,你可以使用与按钮类here (the first addendum)类似的东西,或者为pygame搜索更复杂的Button类。