Sie wollen nicht die Ereigniswarteschlange innerhalb der Tastenfunktion zu überprüfen, sondern irgendwo im Hauptspiel Schleife und rufen Sie dann die Tastenfunktion, wenn ein Klick ist aufgetreten. Es sieht auch so aus, als ob die Button-Funktion, die Sie dort haben, sinnvoller als eine Button-Klasse mit verschiedenen Methoden implementiert werden könnte, zB onClick
.
Hier ist ein kleines Beispiel für einen Code mit einer Taste Klasse und zwei Tasten:
import pygame
from pygame.locals import *
# Screen size
SCREEN_HEIGHT = 350
SCREEN_WIDTH = 500
# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREY = (150, 150, 150)
RED = (255,0,0)
# our Button class
class Button(object):
def __init__(self, msg, x, y, w, h, col, action=None):
self.msg = msg
self.rect = pygame.Rect(x, y, w, h)
self.color = col
self.action = action # function that will be called on click
def draw(self, surface):
pygame.draw.rect(surface, self.color, self.rect)
def onClick(self, event):
# check whether the click was on the button
if self.rect.collidepoint(event.pos):
print("Button", self.msg, "clicked!")
# if an action has been set, do that action
if self.action:
self.action()
# initialisation
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
done = False
clock = pygame.time.Clock()
# list to keep track of our buttons
buttons = []
# define an undo function (will be passed to a button)
def undo():
print("I'm an undo function!")
# fill screen with background
screen.fill(WHITE)
# button with no function
btn1 = Button("btn1", 50, 50, 50, 50, GREY)
btn1.draw(screen)
buttons.append(btn1)
# button with an undo function
btn2 = Button("btn2", 150, 50, 50, 50, RED, undo)
btn2.draw(screen)
buttons.append(btn2)
pygame.display.update()
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
if event.type == MOUSEBUTTONDOWN: # mouse was clicked
# check for every button whether the mouse click was on the button
for button in buttons:
button.onClick(event)
# do whatever else needs doing
pygame.display.flip() #update display (currently not strictly necessary)
clock.tick(60) # ensures a maximum of 60 frames per second
pygame.quit()
Ein Button-Objekt ein Rechteck hat. Damit zeichnen wir die Schaltfläche (gefüllt mit der angegebenen Schaltflächenfarbe) und überprüfen, ob ein Mausklick stattgefunden hat, ob der Klick auf das Schaltflächenrechteck erfolgte, dh auf die Schaltfläche geklickt wurde. Die Nachricht wird derzeit nur verwendet, um einen Namen für die Schaltfläche auszugeben, wenn darauf geklickt wurde, Sie können sie jedoch verwenden, um Text auf der Schaltfläche zu rendern oder was Sie sonst noch benötigen.
Einem Button kann auch eine Funktion zugeordnet sein. Diese Funktion wird aufgerufen, wenn auf die Schaltfläche geklickt wird. Das Schöne an Python ist, dass Sie Funktionen als Argumente übergeben können, sodass Sie in der Button-Klasse nicht festlegen müssen, welche Aktionen ausgeführt werden sollen, wenn auf eine Schaltfläche geklickt wird. Stattdessen definieren Sie diese Funktion, wenn Sie eine neue Schaltfläche erstellen müssen. Dies macht Ihren Code sehr vielseitig. Sie könnten diesen Teil durch eine einfache Zeichenfolge ersetzen und dann statt self.action()
in onClick
Fällen Ihre if else
Fälle wie in Ihrem veröffentlichten Code-Snippet.
Dann initialisieren wir in unserer Hauptklasse pygame und machen dann zwei Knöpfe (einen grau ohne Funktion und einen rot mit einer rückgängig machenden Funktion). Um sie leichter verfolgen zu können, werfen wir sie in eine Liste, über die wir später weiterlesen können.
Jetzt überprüfen wir in unserer Hauptspielschleife die Ereigniswarteschlange auf Ereignisse, und wenn sie auftraten, behandeln wir sie. Wenn die Maus geklickt wurde, gehen wir alle Tasten in unserer Liste durch und rufen onClick
. Jeder Knopf prüft dann in ihrer onClick
Methode, ob der Mausklick innerhalb des Knopfrechtecks war, und wenn ja, tut die spezifizierte Funktion (und gibt eine debug Druckanweisung aus). Sie können die onClick
-Funktion ändern, was immer Sie tun müssen, wenn Sie auf eine Schaltfläche geklickt haben, z. B. die Farbe der Schaltfläche ändern.
Wenn Sie andere Ereignisse haben, die Sie in Ihrem Spiel verfolgen müssen, behandeln Sie sie auf die gleiche Weise mit der Hauptwarteschlange wie wir es getan haben. Machen Sie danach alles, was Sie sonst noch tun müssen, wie das Verschieben von Sprites oder das Neuzeichnen von Teilen des Bildschirms, die sich geändert haben.
Was funktioniert nicht? Gibt es Fehler? –