Mi chiedevo come scrivere codice che rilevi il clic del mouse su uno sprite. Ad esempio:Rilevazione clic del mouse Pygame
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
Mi chiedevo come scrivere codice che rilevi il clic del mouse su uno sprite. Ad esempio:Rilevazione clic del mouse Pygame
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
The pygame documentation for mouse events is here. È possibile utilizzare il metodo pygame.mouse.get_pressed
in collaborazione con lo pygame.mouse.get_pos
(se necessario). Ma si prega di utilizzare l'evento clic del mouse tramite un ciclo di eventi principale. Il motivo per cui il ciclo degli eventi è migliore è dovuto ai "clic brevi". Potresti non accorgertene su macchine normali, ma i computer che utilizzano tap-click su trackpad hanno periodi di clic eccessivamente piccoli. L'uso degli eventi del mouse impedirà questo.
EDIT: Per eseguire pixel collisioni perfetti utilizzano pygame.sprite.collide_rect()
trovato su their docs for sprites.
Presumo che il gioco abbia un ciclo principale e tutti gli sprite si trovino in un elenco chiamato sprites
.
Nel tuo ciclo principale, ottieni tutti gli eventi e verifica l'evento MOUSEBUTTONDOWN
o MOUSEBUTTONUP
.
Quindi, in pratica, è necessario verificare un clic su uno sprite da soli ogni iterazione del mainloop. Ti consigliamo di utilizzare mouse.get_pos() e rect.collidepoint().
Pygame non offre programmazione guidata da eventi, come ad es. cocos2d fa.
Un altro modo sarebbe controllare la posizione del cursore del mouse e lo stato dei pulsanti premuti, ma questo approccio presenta alcuni problemi.
if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()):
print ("You have opened a chest!")
Dovrete introdurre una sorta di bandiera, se si ha gestito questo caso, dal momento che altrimenti questo codice stamperà "è stato aperto un petto!" ogni iterazione del ciclo principale.
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]
Naturalmente è possibile creare una sottoclasse Sprite
e aggiungere un metodo chiamato is_clicked
come questo:
class MySprite(Sprite):
...
def is_clicked(self):
return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos())
Quindi, è meglio utilizzare il primo approccio IMHO.
Si noti inoltre che la posizione del mouse è disponibile anche nell'evento stesso sotto 'event.pos' –
che stavo cercando la stessa risposta a questa domanda e dopo molte grattarsi la testa questa è la risposta mi è venuta:
#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
Come potrei applicare tale a fare clic su uno sprite però? –
@EliasBenevedes Ho modificato la mia risposta con collisioni perfette di pixel. – jakebird451