Мне было интересно, как написать код, который обнаружит щелчок мышью по спрайту. Например:Pygame mouse click detection
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
Мне было интересно, как написать код, который обнаружит щелчок мышью по спрайту. Например:Pygame mouse click detection
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
The pygame documentation for mouse events is here. Вы можете использовать метод pygame.mouse.get_pressed
в сотрудничестве с pygame.mouse.get_pos
(при необходимости). Но, пожалуйста, используйте событие щелчка мыши через цикл основного события. Причина, по которой цикл событий лучше, вызвана «короткими щелчками». Вы можете не заметить их на обычных машинах, но компьютеры, использующие щелчки на трекпадах, имеют чрезмерно небольшие периоды щелчка. Использование событий мыши предотвратит это.
EDIT: Для выполнения пиксельных совершенные столкновения используют pygame.sprite.collide_rect()
найдены на their docs for sprites.
Я предполагаю, что ваша игра имеет основной цикл, и все ваши спрайты находятся в списке под названием sprites
.
В вашем основном цикле получить все события и проверить событие MOUSEBUTTONDOWN
или MOUSEBUTTONUP
.
while ... # your main loop
# get all events
ev = pygame.event.get()
# proceed events
for event in ev:
# handle MOUSEBUTTONUP
if event.type == pygame.MOUSEBUTTONUP:
pos = pygame.mouse.get_pos()
# get a list of all sprites that are under the mouse cursor
clicked_sprites = [s for s in sprites if s.rect.collidepoint(pos)]
# do something with the clicked sprites...
Таким образом, в основном вы должны проверить на клик на спрайт на каждой итерации mainloop. Вы хотите использовать mouse.get_pos() и rect.collidepoint().
Pygame не предлагает программирование, управляемое событиями, например. cocos2d.
Другой способ - проверить положение курсора мыши и состояние нажатых кнопок, но этот подход имеет некоторые проблемы.
if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()):
print ("You have opened a chest!")
Вам придется ввести какой-то флаг, если обрабатывается этот случай, так как в противном случае этот код будет печатать «Вы открыли сундук!» каждая итерация основной петли.
handled = False
while ... // your loop
if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()) and not handled:
print ("You have opened a chest!")
handled = pygame.mouse.get_pressed()[0]
Конечно, вы можете создать подкласс Sprite
и добавить метод, называемый is_clicked
так:
class MySprite(Sprite):
...
def is_clicked(self):
return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos())
Таким образом, лучше использовать первый подход ИМХО.
Также обратите внимание, что положение мыши также доступно в самом событии в 'event.pos' –
Я искал тот же ответ на этот вопрос и после долгих голову чешет это ответ, который я придумал:
#Python 3.4.3 with Pygame
import pygame
pygame.init()
pygame.display.set_caption('Crash!')
window = pygame.display.set_mode((300, 300))
running = True
# Draw Once
Rectplace = pygame.draw.rect(window, (255, 0, 0),(100, 100, 100, 100))
pygame.display.update()
# Main Loop
while running:
# Mouse position and button clicking.
pos = pygame.mouse.get_pos()
pressed1, pressed2, pressed3 = pygame.mouse.get_pressed()
# Check if the rect collided with the mouse pos
# and if the left mouse button was pressed.
if Rectplace.collidepoint(pos) and pressed1:
print("You have opened a chest!")
# Quit pygame.
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
Как бы я применяю, что нажав на спрайт, хотя? –
@EliasBenevedes Я отредактировал свой ответ с идеальными столкновениями пикселей. – jakebird451