2017-05-19 2 views
1

ProblemKann nicht mehr als 1 Sprites angezeigt werden - PyGame

Mein Problem ist, dass ich ein Spiel haben, die 8 Hindernisse zu Beginn des Spiels erzeugt. Das Problem ist, dass wenn ich die Liste Hindernisse durchlaufe und die Sprites-Gruppe aktualisiere, es nur 1 Sprite erzeugt.

What I Want To Happen

Wenn das Spiel lädt, I 8 Quadrate wollen wahllos Geschwindigkeiten vom oberen Rand des Fensters fliegen nach unten, und an zufälligen Positionen beginnen.

Was Derzeit

Derzeit geschieht, wenn das Spiel wird geladen, nur ein Platz auf dem Bildschirm fällt.

Python-Code

OBSTICLES_AMOUNT = 8 

class Obstacle(pygame.sprite.Sprite): 
def __init__(self): 
    pygame.sprite.Sprite.__init__(self) 

    self.image = pygame.Surface((30, 30)) 
    self.image.fill(BLUE) 
    self.rect = self.image.get_rect() 
    self.rect.x = random.randrange(0, WIDTH - self.rect.width) 
    self.rect.y = random.randrange(-100, -40) 
    self.velY = 6 

def animate(self): 
    self.rect.y += self.velY 

class Game(pygame.sprite.Sprite): 
def __init__(self): 
    pygame.sprite.Sprite.__init__(self) 

    pygame.init() 
    pygame.mixer.init() 

    self.screen = pygame.display.set_mode((WIDTH, HEIGHT)) 
    pygame.display.set_caption(TITLE) 
    self.running = True 
    self.clock = pygame.time.Clock() 

    self.obstaclesList = [] 
    self.allSprites = pygame.sprite.Group() 
    self.obstacles = pygame.sprite.Group() 

def new(self): 
    # create a new game 

    # add obstacles to list 
    for i in range(OBSTICLES_AMOUNT): 
     self.obstacle = Obstacle() 
     self.obstaclesList.append(self.obstacle) 

    # make new sprite using list 
    for i in self.obstaclesList: 
     self.allSprites.add(i) 
     self.obstacles.add(i) 

    self.gameLoop() 

def gameLoop(self): 
    # main game loop 
    while self.running: 
     self.draw() 

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

    self.allSprites.draw(self.screen) 
    for sprites in self.obstaclesList: 
     sprites.update() 

    self.allSprites.update() 

Antwort

1

ist Ihr Code von

  • Zugabe fehlende Importe festen
  • Zugabe fehlende Konstanten
  • animate zu update in der Obstacle Klasse Umbenennung
  • Aufruf pygame.display.update nach
  • mit einem Clock zeichnen die Framerate
  • Hinzufügen von Ereignisbehandlung
  • Hinzufügen von Code zu erstellen eine Game Instanz

Einige weitere Verbesserungen zu begrenzen:

  • keine Notwendigkeit für obstaclesList wenn Sie bereits obstacles
  • haben
  • Sie Groups direkt an Sprite ‚s __init__ Funktion
  • eine Sprite entfernen, wenn es nicht mehr auf dem Bildschirm

Hier ist der Code passieren kann:

import pygame 
import random 

OBSTICLES_AMOUNT = 8 
WIDTH, HEIGHT = 800,600 
TITLE='some game of falling stuff' 
BLUE = pygame.color.THECOLORS['blue'] 
WHITE = pygame.color.THECOLORS['white'] 

class Obstacle(pygame.sprite.Sprite): 
    def __init__(self, *args): 
     pygame.sprite.Sprite.__init__(self, *args) 

     self.image = pygame.Surface((30, 30)) 
     self.image.fill(BLUE) 
     self.rect = self.image.get_rect() 
     self.rect.x = random.randrange(0, WIDTH - self.rect.width) 
     self.rect.y = random.randrange(-100, -40) 
     self.velY = 6 

    def update(self): 
     self.rect.y += self.velY 
     if self.rect.y > HEIGHT: 
      self.kill() 

class Game(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 

     pygame.init() 
     pygame.mixer.init() 
     self.clock = pygame.time.Clock() 
     self.screen = pygame.display.set_mode((WIDTH, HEIGHT)) 
     pygame.display.set_caption(TITLE) 
     self.running = True 
     self.clock = pygame.time.Clock() 

     self.allSprites = pygame.sprite.Group() 
     self.obstacles = pygame.sprite.Group() 

    def new(self): 
     # create a new game 

     # add obstacles to list 
     for i in range(OBSTICLES_AMOUNT): 
      Obstacle(self.allSprites, self.obstacles) 

     while self.running: 
      self.allSprites.update() 
      for e in pygame.event.get(): 
       if e.type == pygame.QUIT: 
        self.running = False 
      self.draw() 
      self.clock.tick(60) 

    def draw(self): 

     self.screen.fill(WHITE) 

     self.allSprites.draw(self.screen) 
     for sprites in self.obstacles: 
      sprites.update() 

     pygame.display.update() 

if __name__ == '__main__': 
    Game().new()