2017-02-26 5 views
1

Ich habe ein Problem mit Pygame.Keine entfernten Sprites anzeigen, Pygame

Ich mache ein kleines Spiel und wenn ich sterbe, möchte ich Gegner Sprites löschen und sie später neu laden, wenn ich respawn.

Ich lösche sie erfolgreich aus ihrer Gruppe, aber sie immer noch auf dem Bildschirm, wenn ich respawn. Aber der Zusammenstoß funktioniert nicht mehr. Ich möchte die alten vom Bildschirm entfernen.

Hier ist ein minimal-Code für das Beispiel:

from pygame import * 
import random 
import sys 
import pygame 

WIDTH = 600 
HEIGHT = 750 
FPS = 60 

SPEEDX = 5 
SPEEDY = 3 

# define colors 
BLACK = (0, 0, 0) 
RED = (255, 0, 0) 
GREEN = (0, 255, 0) 

# initialize pygame and create window 
pygame.init() 
screen = pygame.display.set_mode((WIDTH, HEIGHT)) 
clock = pygame.time.Clock() 

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((40, 40)) 
     self.image.fill(GREEN) 
     self.rect = self.image.get_rect() 
     self.rect.centerx = WIDTH/2 
     self.rect.y = HEIGHT 

    def update(self): 
     self.SPEEDX = 0 
     self.SPEEDY = 1 
     keystate = pygame.key.get_pressed() 

     #Move right 
     if keystate[pygame.K_d]: 
      self.SPEEDX = SPEEDX 
     #Move left 
     if keystate[pygame.K_a]: 
      self.SPEEDX = - SPEEDX 
     #Make the runner run 
     if keystate[pygame.K_w]: 
      self.SPEEDY = - SPEEDY 
     #Close the game 
     if keystate[pygame.K_LCTRL] and keystate[pygame.K_z]: 
      sys.exit() 

     #Make the character moving 
     self.rect.x += self.SPEEDX 
     self.rect.y -= self.SPEEDY 

     #Do not cross screen border 
     #Left side 
     if self.rect.left < 0: 
      self.rect.left = 0 
     #Right side 
     if self.rect.right > WIDTH: 
      self.rect.right = WIDTH 
     #Bottom side 
     if self.rect.bottom > HEIGHT: 
      self.rect.bottom = HEIGHT 
     #Top side 
     if self.rect.top < 0 : 
      self.rect.top = 0 

     # if player reaches top 1/4 of screen 
     if self.rect.top <= HEIGHT/4: 
      self.rect.centerx = WIDTH/2 
      self.rect.y = HEIGHT 

class Enemy(pygame.sprite.Sprite): 
     def __init__(self): 
      pygame.sprite.Sprite.__init__(self) 
      self.image = pygame.Surface((30, 40)) 
      self.image.fill(RED) 
      self.rect = self.image.get_rect() 
      self.rect.x = random.randrange(WIDTH - self.rect.width) 
      self.rect.y = random.randrange(-100, -40) 
      self.speedy = random.randrange(1, 8) 
      self.speedx = random.randrange(-3, 3) 

     def update(self): 
      self.rect.x += self.speedx 
      self.rect.y += self.speedy 
      if self.rect.top > HEIGHT + 10 or self.rect.left < -25 or self.rect.right > WIDTH + 20: 
       self.rect.x = random.randrange(WIDTH - self.rect.width) 
       self.rect.y = random.randrange(-100, -40) 
       self.speedy = random.randrange(1, 8) 

def Death(): 
    player.rect.centerx = WIDTH/2 
    player.rect.y = HEIGHT 
    all_enemies.remove(all_enemies) 

player = Player() 
enemy = Enemy() 

all_sprites = pygame.sprite.Group() 
all_enemies = pygame.sprite.Group() 
all_sprites.add(player) 

for i in range(10): 
    enemies = Enemy() 
    all_sprites.add(enemies) 
    all_enemies.add(enemies) 

# Game loop 
running = True 
while running: 
    clock.tick(FPS) 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

    if sprite.spritecollide(player, all_enemies, False): 
     Death() 

    # Update 
    all_sprites.update() 

    # Draw/render 
    screen.fill(BLACK) 
    all_sprites.draw(screen) 
    pygame.display.flip() 

pygame.quit() 
+0

Sind Sie sicher, dass das Ihr Code in dem Link ist, und es funktioniert? Denn für mich läuft es gar nicht – abccd

+0

Bitte entfernen Sie diesen Link und posten Sie hier ein [mcve] (http://stackoverflow.com/help/mcve). – skrx

+0

Ja Entschuldigung, ich vergesse, Ihnen zu sagen, dass Sie die Leiste einmal drücken müssen, um das Spiel zu starten. Ich werde nur für das Beispiel einen neuen Code erstellen. –

Antwort

1

Sie den Sprites aus all_enemies entfernen, aber nicht aus all_sprites. Sie müssen, um sie manuell entfernen aus allen Gruppen, die sie in sind, die in zwei Arten erfolgen kann:

  1. durch die Sprite-Gruppe iterieren und rufen kill() auf jedem Sprite.

Sie können keine Gruppe ändern, während sie über sie iterieren, so dass Sie sprites() rufen müssen, um eine Liste aller Sprites zu bekommen und darüber iterieren.

for sprite in all_enemies.sprites(): 
    sprite.kill() 
  1. sie aus jeder Liste entfernen getrennt.

Verwenden Sie einfach remove() für alle Sprite-Gruppen.

all_sprites.remove(all_enemies) 
all_enemies.empty() # The same as all_enemies.remove(all_enemies) 
+0

Wenn ich etwas mache wie: 'if sprite.spritecollide (player, all_enemies, True):' Es wird nur Sprite töten, die ich getroffen habe, habe ich recht? –

+0

Ja, mein Schlechter. Die Antwort wurde aktualisiert –

+0

Es funktioniert, vielen Dank für Ihre Zeit! –