Обнаружение щелчка мышью в Pygame

Мне было интересно, как написать код, который будет определять щелчок мыши на спрайте. Например:

if #Function that checks for mouse clicked on Sprite:
    print ("You have opened a chest!")

Ответы на вопрос(3)

Я предполагаю, что ваша игра имеет основной цикл, и все ваши спрайты находятся в списке под названием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...

Таким образом, в основном вы должны проверять клик на спрайте самостоятельно каждую итерацию основного цикла. Вы хотите использовать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!")

Вам придется ввести какой-то флаг, если вы обработали этот случай, так как в противном случае этот код напечатает"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())

Итак, лучше использовать первый подход ИМХО.

 22 мар. 2014 г., 20:29
Также обратите внимание, что положение мыши также доступно в самом событии под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

Документация Pygame для событий мыши здесь, Вы можете использоватьpygame.mouse.get_pressed метод в сотрудничестве сpygame.mouse.get_pos (если нужно). Но, пожалуйста, используйте событие щелчка мышью через основной цикл событий. Причина, по которой цикл обработки событий лучше, связана с «короткими щелчками». Вы можете не заметить их на обычных машинах, но компьютеры, которые используют щелчки на трекпадах, имеют слишком малые периоды щелчков. Использование событий мыши предотвратит это.

EDIT: Для выполнения идеальных столкновений пикселей используйтеpygame.sprite.collide_rect() найти наих документы для спрайтов.

 12 июн. 2012 г., 05:39
Как бы я применил это к нажатию на спрайт, хотя?
 12 июн. 2012 г., 05:56
@EliasBenevedes Я отредактировал свой ответ с идеальными столкновениями пикселей.

Ваш ответ на вопрос