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

Каков канонический способ заставить ваши спрайты реагировать на щелчки мыши в 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. Это разумный способ уведомить все мои спрайты о щелчке?

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


person Eli Bendersky    schedule 19.12.2008    source источник


Ответы (1)


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

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

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

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

person Zoomulator    schedule 25.12.2008
comment
Спасибо. Что касается части event.button == 1, нет ли константы вместо этой явной 1 в PyGame? - person Eli Bendersky; 26.12.2008
comment
Я не думаю, что в этом есть необходимость. 1 всегда левая кнопка, 2 средняя и 3 правая. 3 подходит даже для мышей с двумя кнопками. - person Zoomulator; 28.12.2008