Просто обработайте событие 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()
.
Если честно, просто используйте прозрачный фон, и все будет ОК.
Все.