Как я могу исправить медлительность моего цикла событий Pygame? - PullRequest
0 голосов
/ 01 мая 2018

Я создаю класс кнопок для игры и использую цикл событий 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 голосов
/ 01 мая 2018

Вы должны реализовать метод clicked по-другому, потому что в вашем приложении должен быть только один цикл обработки событий, а не один в каждом экземпляре кнопки. pygame.event.get() очищает очередь событий, поэтому вызов ее несколько раз за кадр вызовет проблемы.

Предлагаю передать события кнопкам. В этом (очень простом) примере я передаю события pygame.MOUSEBUTTONDOWN методу clicked, а затем проверяю, совпадает ли event.pos (позиция мыши) события с прямоугольником. Если он возвращает 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()

Если вам нужна кнопка с несколькими изображениями, вы можете использовать нечто подобное классу кнопок здесь (первое дополнение) или искать более сложные классы кнопок для пигмеев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...