2016-08-08 104 views
2

Ich habe den Hauptcode für mein Spiel fertig und ich habe mit dem Erstellen eines Menübildschirms begonnen. Ich kann die Schaltflächen auf dem Bildschirm anzeigen, aber wenn ich irgendwo klicke, bekomme ich diese Error:Pygame Button getRect Collidepoint funktioniert nicht?

Wie kann ich über das beheben gehen? Wenn ich in dieser Frage nichts klar gemacht habe, sag es mir bitte, damit ich es klären kann. Vielen Dank!

Hier ist mein Code für die MENU-Seite:

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() 

#Fonts 

smallfont = pygame.font.SysFont("comicsansms", 25) 
medfont = pygame.font.SysFont("comicsansms", 50) 
largefont = pygame.font.SysFont("comicsansms", 75) 

#Sprites 

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) 
pygame.display.update() 


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

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

     pygame.display.update() 

     selfrect = image.get_rect() 

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

def gameIntro(): 
    buttons = pygame.sprite.Group() 
    button_start = Button(img_button_start, 27, 0) 
    button_options = Button(img_button_options, 27, 500) 
    buttons.add(button_start) 
    buttons.add(button_options) 

    print(buttons) 


    #main game loop 
    running = True 
    while running: 
     for event in pygame.event.get(): 
      if event.type == pygame.MOUSEBUTTONDOWN: 
       print(event.pos) 
       #check for every button whether it was clicked 
       for btn in buttons: 
        print('forbtninbuttons') 
        if btn.wasClicked(): 
         print('clicked!') 

      if event.type == pygame.QUIT: 
       pygame.quit() 
+0

In der Zukunft, stellen Sie sicher, den Fehler in der Frage zu schreiben, anstatt auf ein Bild des Fehlers zu verlinken. Die Verknüpfung mit Bildern reduziert die Suchfunktion und macht es für Benutzer mit Bildschirmleseprogrammen unmöglich, den Fehler zu hören. http://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or-errors –

Antwort

2

Sie keine Attribute für Sie Klasse deklariert haben, nur lokale Variablen. Versuchen Sie self.selfrect = image.get_rect() in Ihrem initializer tut und in Ihrer wasClicked(event) Methode tun:

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

Es ist in der Regel Konvention Ihres Rect-Variable zu nennen nur rect though.

+0

Danke für die Beantwortung. Ich bekomme immer noch im Grunde den gleichen Fehler, nur dieses Mal sagt es "NameError: Name 'self' ist nicht definiert" anstelle von "NameError: Name 'selfrect' ist nicht definiert" –

+0

Oh Entschuldigung, vergessen zu setzen * self * in der Methodenparameter. Jetzt sollte es funktionieren :) –

+0

Ich habe "self" in den Methodenparameter, aber jetzt bekomme ich diesen Fehler: "TypeError: wasClicked() fehlt 1 benötigt positional Argument: 'self'" –