2012-06-12 9 views
11

Мне было интересно, как написать код, который обнаружит щелчок мышью по спрайту. Например:Pygame mouse click detection

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

ответ

6

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.

+0

Как бы я применяю, что нажав на спрайт, хотя? –

+0

@EliasBenevedes Я отредактировал свой ответ с идеальными столкновениями пикселей. – jakebird451

21

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

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

+3

Также обратите внимание, что положение мыши также доступно в самом событии в 'event.pos' –

3

Я искал тот же ответ на этот вопрос и после долгих голову чешет это ответ, который я придумал:

#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 
Смежные вопросы