Как я могу узнать, зависает ли мышь / щелкает ли она по спрайту pygame (не в форме прямоугольника или круга) - PullRequest
0 голосов
/ 10 июля 2020

Итак, я делаю эту кнопку, и мне нужно выяснить две вещи

1 - Когда пользователь наводит на нее курсор?

2 - Когда пользователь нажимает на нее?

Как видите, эти кнопки имеют необычную форму

Пример кнопки

Я пробовал искать на форумах pygame , но там указано только, как узнать, сталкиваются ли два спрайта.

1 Ответ

2 голосов
/ 10 июля 2020

Просто обработайте событие MOUSEBUTTONDOWN и сравните event.pos с rect каждого из ваших спрайтов. Если произошло столкновение, это тот, на котором был сделан щелчок.

То же самое и с зависанием, за исключением того, что вам нужно захватывать позицию мыши в каждом кадре с помощью функции pygame.mouse.get_pos().

Если вы поместите все спрайты кнопок в SpriteGroup, это будет легко выполнить эти проверки.

Для спрайтов странной формы может помочь использование маски Sprite. Это дополнительная проверка (после того, как столкновение прямоугольников становится истинным) на уровне пикселей. Таким образом, хотя мышь могла выполнять какие-то действия в пределах прямоугольника спрайта, возможно, она действительно не находилась над видимой частью изображения спрайта.

К счастью, библиотека PyGame Sprite упрощает создание маски, и, если он определен, он будет автоматически использоваться как часть обнаружения столкновений.

class MaskedSprite( pygame.sprite.Sprite ):
    def __init__( self, image, x, y ):
        pygame.sprite.Sprite.__init__( self )
        self.image       = image.convert_alpha()
        self.mask        = pygame.mask.from_surface( self.image )  # <<-- HERE
        self.rect        = self.image.get_rect()
        self.rect.center = ( x, y )

Есть несколько простых правил создания маски. Если изображение имеет прозрачный фон, он будет использоваться для определения того, что является частью / не частью столкновения спрайтов.

В противном случае должна быть разница в цвете между фоном / передним планом 127 цветов единиц (по умолчанию). Это можно изменить с помощью параметра threshold на pygame.mask.from_surface().

Также есть функция pygame.mask.from_threshold().

Если честно, просто используйте прозрачный фон, и все будет ОК.

Все.

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