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!")
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!")
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.
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() và 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.
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' –
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
Làm thế nào tôi sẽ áp dụng đó để nhấp vào một sprite mặc dù? –
@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