Как реагировать на щелчки мыши по спрайтам в 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())
Некоторые вопросы по этому поводу:
- Это лучший способ реагировать на щелчки мыши?
- Что, если мышь какое-то время будет нажата на спрайт?Как мне сделать из этого одно событие?
- Это разумный способ уведомить все мои спрайты о щелчке?
заранее спасибо
Решение
Обычно я даю своим интерактивным объектам функцию щелчка, как в вашем примере.Я поместил все эти объекты в список, чтобы упростить итерацию при вызове функций щелчка.
при проверке того, какую кнопку мыши вы нажимаете, используйте свойство кнопки события.
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().
Это плохая идея для крупных проектов, так как это может привести к труднообнаружимым ошибкам.Лучше просто хранить события в одном месте.Однако в небольших играх, таких как простые аркадные игры, использование зондирующего стиля может иметь больше смысла.