Как мне реагировать на щелчки мышью по спрайтам в PyGame? - PullRequest
5 голосов
/ 19 декабря 2008

Каков канонический способ заставить ваши спрайты реагировать на щелчки мыши в PyGame?

Вот что-то простое в цикле событий:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        exit_game()
    [...]
    elif (  event.type == pygame.MOUSEBUTTONDOWN and
            pygame.mouse.get_pressed()[0]):
        for sprite in sprites:
            sprite.mouse_click(pygame.mouse.get_pos())

Некоторые вопросы по этому поводу:

  1. Это лучший способ реагировать на щелчки мышью?
  2. Что, если мышь остается нажатой на спрайте в течение некоторого времени? Как сделать из него одно событие?
  3. Это разумный способ уведомить всех моих спрайтов о клике?

Заранее спасибо

1 Ответ

10 голосов
/ 26 декабря 2008

Я обычно даю своим кликабельным объектам функцию щелчка, как в вашем примере. Я поместил все эти объекты в список для упрощения итераций при вызове функций щелчка.

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

import pygame
from pygame.locals import * #This lets you use pygame's constants directly.

for event in pygame.event.get():
    if event.type == MOUSEBUTTONDOWN:  #Better to seperate to a new if statement aswell, since there's more buttons that can be clicked and makes for cleaner code.
        if event.button == 1:
            for object in clickableObjectsList:
                object.clickCheck(event.pos)

Я бы сказал, что это рекомендуемый способ сделать это. Клик регистрируется только один раз, поэтому он не скажет вашему спрайту, если пользователь «перетаскивает» кнопку. Это может быть легко сделано с логическим значением, которое установлено в true с событием MOUSEBUTTONDOWN, и false в MOUSEBUTTONUP Имеются «перетаскиваемые» объекты, повторяемые для активации их функций ... и т. Д.

Однако, если вы не хотите использовать обработчик событий, вы можете разрешить функции обновления проверять ввод с помощью:

pygame.mouse.get_pos() 
pygame.mouse.get_pressed().

Это плохая идея для больших проектов, так как это может привести к трудностям поиска ошибок. Лучше просто хранить события в одном месте. Меньшие игры, такие как простые аркадные игры, могут иметь больше смысла, используя стиль зондирования.

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