2016-06-30 10 views
0

Ich habe eine Funktion für meine Schaltfläche erstellt. Ich versuche, es einmal pro Klick durchlaufen zu lassen, also habe ich die Zeilen für Ereignis in pygame.event.get() und pygame.MOUSEBUTTONDOWN integriert, so dass es einen Klick registriert, einmal durchläuft und dann bis zum nächsten Klick stoppt. Aber jetzt funktioniert es überhaupt nicht. 1. Wie bekomme ich es zum laufen 2. Wie stelle ich sicher, dass es einmal pro Klick durchläuft und dann zurückgesetzt wird, um bis zum nächsten Klick durchlaufen. Bitte zeigen BeispielSchaltfläche nichts drucken

Hier ist der Code:

def Button(msg, x, y, w, h, ic, ac, action=None): 
    mouse = pygame.mouse.get_pos()  
     if x+w > mouse[0] > x and y+h > mouse[1] > y: 
      pygame.draw.rect(window, ac, (x, y, w, h)) 
      for event in pygame.event.get(): 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        pygame.draw.rect(window, lightgrey, (x, y, w, h)) 
        if action == "undo": 
         print("hey") 
        if action == "reset": 
         for row in range(6): 
          for column in range(7): 
           board[row][column] = 0   
        elif action == "quit": 
         pygame.quit() 
         quit() 
+0

Was funktioniert nicht? Gibt es Fehler? –

Antwort

0

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.

+0

Sie haben gerade meine wichtigste letzte Schulaufgabe gespeichert, danke. –