2012-06-12 106 views
11

Tôi đã tự hỏi làm thế nào để viết mã mà có thể phát hiện con chuột nhấp vào một sprite. Ví dụ:Phát hiện nhấp chuột của Pygame

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

Trả lời

6

The pygame documentation for mouse events is here. Bạn có thể sử dụng phương pháp pygame.mouse.get_pressed cộng tác với pygame.mouse.get_pos (nếu cần). Nhưng hãy sử dụng sự kiện nhấp chuột qua vòng lặp sự kiện chính. Lý do tại sao vòng lặp sự kiện tốt hơn là do "nhấp chuột ngắn". Bạn có thể không nhận thấy những điều này trên các máy thông thường, nhưng máy tính sử dụng nhấn đúp vào bàn di chuột có thời gian nhấp chuột quá nhỏ. Sử dụng các sự kiện chuột sẽ ngăn chặn điều này.

EDIT: Thực hiện điểm ảnh va chạm hoàn hảo sử dụng pygame.sprite.collide_rect() tìm thấy trên their docs for sprites.

+0

Làm thế nào tôi sẽ áp dụng đó để nhấp vào một sprite mặc dù? –

+0

@EliasBenevedes Tôi đã chỉnh sửa câu trả lời của mình với các va chạm hoàn hảo pixel. – jakebird451

21

Tôi cho rằng trò chơi của bạn có vòng lặp chính và tất cả các hình ảnh của bạn nằm trong danh sách được gọi là sprites.

Trong vòng lặp chính của bạn, nhận tất cả các sự kiện và kiểm tra sự kiện MOUSEBUTTONDOWN hoặc 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... 

Vì vậy, về cơ bản, bạn phải tự mình kiểm tra lần nhấp vào chính từng lần lặp của vòng lặp chính. Bạn sẽ muốn sử dụng mouse.get_pos()rect.collidepoint().

Pygame không cung cấp lập trình hướng sự kiện, ví dụ: cocos2d.

Một cách khác là kiểm tra vị trí của con trỏ chuột và trạng thái của các nút nhấn, nhưng cách tiếp cận này có một số vấn đề.

if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()): 
    print ("You have opened a chest!") 

Bạn sẽ phải giới thiệu một số loại cờ nếu bạn xử lý trường hợp này, vì nếu không mã này sẽ in "Bạn đã mở ngực!" mỗi lần lặp của vòng lặp chính.

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] 

Tất nhiên bạn có thể phân lớp Sprite và thêm một phương pháp gọi là is_clicked như thế này:

class MySprite(Sprite): 
    ... 

    def is_clicked(self): 
    return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos()) 

Vì vậy, nó là tốt hơn để sử dụng cách tiếp cận IMHO đầu tiên.

+3

Cũng lưu ý rằng vị trí của con chuột cũng có sẵn trong chính sự kiện trong 'event.pos' –

3

tôi đang tìm kiếm câu trả lời tương tự cho câu hỏi này và sau nhiều đầu gãi này là câu trả lời tôi đã đưa ra:

#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 
Các vấn đề liên quan