2017-04-09 6 views
1

Ich habe ein Problem, wobei das Aufrufen einer Variablen all_sprites als pygame.Group() keine Werte zurückgibt, und ich kann nicht herausfinden, warum.Problem beim Zeichnen in Pygame mit der Gruppe

class game: 

def __init__(self): 
    pg.init() 
    self.screen = pg.display.set_mode((screenwidth, screenheight)) 
    pg.display.set_caption("Gammee") 
    self.clock = pg.time.Clock() 



def run(self): 

    while True: 
     self.dt = self.clock.tick(FPS)/1000 
     self.events() 
     self.update() 
     self.draw() 

def new(self): 
    self.othersprites = pg.sprite.Group() 

def draw(self): 
    self.screen.fill(BGCOLOR) 

    self.othersprites.draw(self.screen) 

    pg.display.flip() 

def quit(self): 
    pg.quit() 
    sys.exit() 

def update(self): 
    self.othersprites.update() 

def events(self): 

    for event in pg.event.get(): 
     if event.type == pg.QUIT: 
      self.quit() 
g = game() 

while True: 
    g.new() 
    g.run() 

Dies ist der Code für das Spiel

class Player(pg.sprite.Sprite): 

def __init__(self, game, x, y): 

    self.groups = game.all_sprites 
    pg.sprite.Sprite.__init__(self, self.groups) 
    self.game = game 
    self.image = pg.Surface((30, 30), SRCALPHA) 
    self.image.fill(YELLOW) 
    self.rect = self.image.get_rect() 

    self.vx, self.vy = 0, 0 
    self.x = x 
    self.y = y 

def get_keys(self): 
    keys = pg.key.get_pressed() 
    if keys[pg.K_LEFT] or keys[pg.K_a]: 
     self.vx = -PLAYER_SPEED 
    if keys[pg.K_RIGHT] or keys[pg.K_d]: 
     self.vx = PLAYER_SPEED 
    if keys[pg.K_UP] or keys[pg.K_w]: 
     self.vy = -PLAYER_SPEED 
    if keys[pg.K_DOWN] or keys[pg.K_s]: 
     self.vy = PLAYER_SPEED 
    if len(keys) != 0: 
     self.vx *= 0.9 
     self.vy *= 0.9 

def update(self): 
    self.get_keys() 
    self.x += self.vx * self.game.dt 
    self.y += self.vy * self.game.dt 
    self.rect.x = self.x 
    self.rect.y = self.y 

jedoch nichts mit dem Geröll gezogen wird. Ich habe auch von

setzen getestet
for sprite in self.all_sprites: 
    print(sprite) 

, die auf dem Sprite Ausgabe info verwendet, aber jetzt tut nichts,

irgendwelche Ideen, was ich falsch mache?

+3

Haben Sie vielleicht vergessen, den 'Player' zu instanziieren? Der Code ist nicht ausreichend, um den Fehler zu finden. Bearbeiten Sie daher Ihre Frage und geben Sie ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) an. – skrx

+0

Danke für die Antwort, ich habe die Frage aktualisiert, um den vollständigen Spielecode einzubeziehen. Um den Player instanziieren zu können, muss ich irren, wenn ich anmaße, dass er automatisch instanziiert wird, wenn er der Gruppe hinzugefügt wird? –

Antwort

0

Sie müssen eine Instanz der in der new Methode der game Klasse erstellen. Außerdem heißt die Sprite-Gruppe othersprites in der Klasse game und all_sprites in der Klasse Player, aber die Namen müssen übereinstimmen.

class game: 

    def new(self): 
     self.othersprites = pg.sprite.Group() 
     # This is how you create an instance/object. 
     self.player = Player(self, 200, 300) 


class Player(pg.sprite.Sprite): 

    def __init__(self, game, x, y): 
     self.groups = game.othersprites 

ich denke, es wäre schöner und einfacher sein, die self.player Sprite self.othersprites in der neuen Methode hinzuzufügen, anstatt die ganze game Instanz an den Spieler übergeben.

class game: 

    def new(self): 
     self.othersprites = pg.sprite.Group() 
     self.player = Player(200, 300) 
     self.othersprites.add(self.player) 
+0

BTW, Klassen sollten obere + Camelcase Namen, z. 'class GameCharacter', und Kleinbuchstaben mit Unterstrichen (snake_case) ist für Funktionen/Methoden und Variablen, z.B. 'a_variable_name'. – skrx

Verwandte Themen