Ich habe mich gefragt, wie man Code schreibt, der den Mausklick auf ein Sprite erkennen würde. Zum Beispiel:10 Pygame Mausklickerkennung
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
Ich habe mich gefragt, wie man Code schreibt, der den Mausklick auf ein Sprite erkennen würde. Zum Beispiel:10 Pygame Mausklickerkennung
if #Function that checks for mouse clicked on Sprite:
print ("You have opened a chest!")
The pygame documentation for mouse events is here. Sie können entweder die Methode pygame.mouse.get_pressed
in Zusammenarbeit mit der pygame.mouse.get_pos
(falls erforderlich) verwenden. Verwenden Sie das Mausklick-Event jedoch über eine Main Event-Schleife. Der Grund, warum die Ereignisschleife besser ist, ist auf "kurze Klicks" zurückzuführen. Sie können diese auf normalen Computern nicht bemerken, aber Computer, die Tap-Klicks auf Trackpads verwenden, haben zu kurze Klickzeiten. Durch die Verwendung von Mausereignissen wird dies verhindert.
EDIT: auszuführen Pixel perfekt Kollisionen verwenden pygame.sprite.collide_rect()
auf their docs for sprites gefunden.
Ich nehme an, Ihr Spiel hat eine Hauptschleife, und alle Ihre Sprites sind in einer Liste namens sprites
.
Erhalten Sie in Ihrer Hauptschleife alle Ereignisse und überprüfen Sie das Ereignis MOUSEBUTTONDOWN
oder .
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...
Also im Grunde müssen Sie für jede Iteration der Hauptschleife für einen Klick auf ein Sprite selbst überprüfen. Sie möchten mouse.get_pos() und rect.collidepoint() verwenden.
Pygame bietet keine ereignisgesteuerte Programmierung, wie z. cocos2d tut.
Ein anderer Weg wäre, die Position des Mauszeigers und den Status der gedrückten Tasten zu überprüfen, aber dieser Ansatz hat einige Probleme.
if pygame.mouse.get_pressed()[0] and mysprite.rect.collidepoint(pygame.mouse.get_pos()):
print ("You have opened a chest!")
Du musst eine Art Flagge einführen, wenn Sie diesen Fall behandelt, da sonst dieser Code drucken „Du eine Truhe geöffnet haben!“ jede Iteration der Hauptschleife.
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]
Natürlich können Sie Sprite
Unterklasse und ein Verfahren is_clicked
wie folgt aufgerufen hinzu:
class MySprite(Sprite):
...
def is_clicked(self):
return pygame.mouse.get_pressed()[0] and self.rect.collidepoint(pygame.mouse.get_pos())
Also, es ist besser, den ersten Ansatz IMHO zu verwenden.
Beachten Sie auch, dass die Position der Maus auch im Ereignis selbst unter 'event.pos' verfügbar ist –
Ich war für die gleiche Antwort auf diese Frage und nach viel Kopf suchend, dieses Kratzen ist die Antwort kam ich mit:
#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
Wie würde ich dann Anwendung, wenn auf ein Sprite zu klicken? –
@EliasBenevedes Ich habe meine Antwort mit pixelgenauen Kollisionen bearbeitet. – jakebird451