2016-07-20 25 views
0

Ich versuche, einen Menübildschirm für mein Spiel zu erstellen. Im Moment benutze ich Sprites für Buttons und alles funktioniert gut, und ich kann unendlich viele Buttons erstellen (momentan habe ich nur Start und Optionen), aber nur der erste Button, den ich anrufe erscheint auf dem Bildschirm. Ich denke, es hat etwas mit der While-Schleife in der Button-Klasse zu tun, aber ich bin mir nicht sicher, wie ich es beheben soll. Ich mache hier wahrscheinlich keinen Sinn. Wenn Sie mich brauchen, um etwas zu klären, werde ich es tun. Vielen Dank!Pygame - Menü Bildschirm Tasten funktionieren nicht richtig

import pygame 
import random 
import time 

pygame.init() 

#colours 
white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,155,0) 
blue = (50,50,155) 

display_width = 800 
display_height = 600 

gameDisplay = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption('Numeracy Ninjas') 

clock = pygame.time.Clock() 

img_button_start = pygame.image.load('Sprites/Buttons/button_start.png') 
img_button_options = pygame.image.load('Sprites/Buttons/button_options.png') 

gameDisplay.fill(white) 

class Button(pygame.sprite.Sprite): 
    def __init__(self, sprite, buttonX, buttonY): 
     super().__init__() 

     gameDisplay.blit(sprite, (buttonX, buttonY)) 

     pygame.display.update() 

     running = True 
     while (running): 
      for event in pygame.event.get(): 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        # Set the x, y postions of the mouse click 
        x, y = event.pos 
        print(x, y) 
        if x <= (150 + buttonX) and x >=(0 + buttonX) and y <= (75 + buttonY) and y >= (0 + buttonY): 
         print('clicked on button') 

def gameIntro():     
    button_start = Button(img_button_start, 27, 0) 
    button_options = Button(img_button_options, 27, 500) 

gameIntro() 

Antwort

0

Im Konstruktor Ihrer Button-Klasse haben Sie eine Endlosschleife. Dies bedeutet, dass Sie nie zu dem Code-Teil kommen, wo Sie Ihren zweiten Button machen.

def gameIntro():     
    button_start = Button(img_button_start, 27, 0) #stuck in infinite loop 
    print('This print statement is never reached') 
    button_options = Button(img_button_options, 27, 500) 

Statt dem, was wollen Sie tun, um zwei Tasten initialisieren, und hat dann eine Hauptspiel Schleife in Ihrer gameIntro() Methode, die für Ereignisse überprüft. Wenn ein mousebuttondown-Ereignis auftrat, möchten Sie das Ereignis (oder auch nur die Ereignisposition, wenn Sie nicht wissen, welche Maustaste geklickt wurde) an eine Funktion der Schaltfläche übergeben, die prüft, ob diese Instanz der Schaltfläche angeklickt wurde und dann die Eingabe (möglicherweise durch Zurückgeben von etwas, das Sie in der Hauptspielschleife behandeln).

Hinweis, dass ich nicht den folgenden Code ausführen, ich versuche nur, um Ihnen eine Vorstellung zu geben, wie es strukturiert sein soll:

class Button(pygame.sprite.Sprite): 
    def __init__(self, image, buttonX, buttonY): 
     super().__init__() 
     self.image = image 
     self.rect = image.getRect() 
     self.rect.x = buttonX 
     self.rect.y = buttonY 

    def wasClicked(event): 
     if self.rect.collidepoint(event.pos): 
      return True 

def gameIntro(): 
    #initialize buttons 
    buttons = pygame.sprite.Group() #make a group to make drawing easier 
    button_start = Button(img_button_start, 27, 0) 
    button_options = Button(img_button_options, 27, 500) 
    #draw buttons to display 
    buttons.draw(gameDisplay) 
    pygame.display.update() 

    #main game loop 
    running = True 
    while (running): 
     for event in pygame.event.get(): 
      if event.type == pygame.MOUSEBUTTONDOWN: 
       #check for every button whether it was clicked 
       for btn in buttons: 
        if btn.wasClicked(): 
         #do something appropriate 
      if event.type == pygame.QUIT: 
       pygame.quit() 
+0

Danke für das Feedback, vermuten ich es zu einem unendlichen zurückzuführen Schleife, aber ich habe versucht, mit Ihrem Code und sehen, wie es funktioniert, aber es sagte immer "erwartet einen Einzug Block". Ich bin neu in der Programmierung, also bin ich mir nicht sicher, ob das Setzen der Ereignisprüfungsmethode in der Hauptschleife wirklich funktionieren würde, weil ich Variablen innerhalb der Button-Klasse wie buttonX, buttonY usw. habe, die nur innerhalb der Klasse aufgerufen werden können. aber dann verwendest du self.rect.collidepoint also bin ich mir nicht sicher. Ich versuche einen Weg zu finden, um diese Schleifen zur gleichen Zeit laufen zu lassen, wenn das möglich ist, aber ich weiß es nicht. –