2016-06-15 5 views
1

Geschichte: Leistung nicht verstehen, was mit meinem Code falsch ist, zum ersten Mal eine Klasse verwenden, um eine Figur zu erstellen.Pygame: malen eine Klasse Polygon aus einem anderen Modul

Ich habe ein Modul, in dem die Polygon-Klasse in den folgenden Code hat:

import pygame 

class Polygon: 
    def __init__(self,): 
     self.list_puntos = [(200, 30), (250, 80), (225, 130), (175, 130),(150 ,80)] 
     self.image = pygame.Surface((32, 36)) 
     self.image.fill((255, 255, 255)) 
def draw(self): 
    self.pygame.draw.polygon(self.image, (255, 0, 255), self.list_puntos) 

def cursors(self): 
    pass 

Ich habe einen Kernel mit dem folgenden Code:

import sys 
import pygame 
from Objects import Polygon 



call_polygon = Polygon 






class Kernel: 
    def __init__(self): 
     pygame.init() 

     self.screen_size = (800, 600) 
     self.bg_color = (120, 120, 250) 
     self.fps = 60 
     self.screen = pygame.display.set_mode(self.screen_size) 
     self.clock = pygame.time.Clock() 



    def handle_input(self): 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
    def update(self): 
     capition = "Music Art - FPS: {:.2f}".format(self.clock.get_fps()) 
     pygame.display.set_caption(capition) 

    def render(self): 
     self.screen.fill(self.bg_color) 



    def main_loop(self): 

     while True: 
      self.handle_input() 
      self.update() 
      self.render() 
      call_polygon.draw() 
    """TypeError: unbound method draw() must be called with Polygon instance as first argument (got nothing instead)""" 



      pygame.display.flip() 
      self.clock.tick(self.fps) 



    if __name__ == '__main__': 
      Module_game = Kernel() 
      Module_game.main_loop() 

Antwort

1

Klassen definieren nur eine "Vorlage" für einen bestimmten Objekttyp. Um ein Objekt (oder eine "Instanz") dieses Typs tatsächlich zu erstellen, muss die Klasse aufgerufen werden und alle Daten übergeben werden, die benötigt werden, um ihre Definition als Argumente zu vervollständigen. Wenn Sie die Daten nicht in die Klasse selbst fest codieren, können Sie mehr als eine Instanz der Klasse erstellen, und jede kann verschiedene Attribute haben, je nachdem, welche Werte - wie Farbe, Form, Position usw. - bei der Erstellung angegeben werden.

In diesem Sinne würde ich Ihren Code wie folgt ändern. Es hat immer noch nur ein Polygon, aber es könnte einfach mehr hinzugefügt werden, indem einfach Polygon() mehrmals aufgerufen wird und die zurückgegebenen Instanzen gespeichert werden, so dass ihre draw() Methode bei Bedarf aufgerufen werden kann.

Datei Objects.py:

import pygame 

class Polygon: 
    def __init__(self, *puntos): 
     self.puntos = puntos 

    def draw(self, surface): 
     """ Draw the shape on the surface. """ 
     pygame.draw.polygon(surface, (255, 0, 255), self.puntos) 

    def cursors(self): 
     pass 

Hauptspielmodul-Datei:

from Objects import Polygon 
import pygame 
import sys 

class Kernel: 
    def __init__(self): 
     pygame.init() 
     self.screen_size = (800, 600) 
     self.bg_color = (120, 120, 250) 
     self.fps = 60 
     self.screen = pygame.display.set_mode(self.screen_size) 
     self.clock = pygame.time.Clock() 
     self.polygon = Polygon((200, 30), (250, 80), (225, 130), (175, 130), 
           (150 ,80)) # define shape here, not in class 

    def handle_input(self): 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       sys.exit() 

    def update(self): 
     capition = "Music Art - FPS: {:.2f}".format(self.clock.get_fps()) 
     pygame.display.set_caption(capition) 

    def render(self): 
     self.screen.fill(self.bg_color) 

    def main_loop(self): 
     while True: 
      self.handle_input() 
      self.update() 
      self.render() 
      self.polygon.draw(self.screen) 
      pygame.display.flip() 
      self.clock.tick(self.fps) 

if __name__ == '__main__': 
    module_game = Kernel() 
    module_game.main_loop() 
+0

Thank Männer! Jetzt sehe ich den Fehler. –

0

Sie benötigen Um eine Instanz der Klasse Polygon zu erstellen, versuchen Sie nicht nur Methoden direkt in der Klasse aufzurufen:

poly = Polygon() # call the class to create an instance; put this in your setup code 

poly.draw() # put this in your main loop