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

StackOverflow https://stackoverflow.com/questions/380420

  •  22-08-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top