2017-12-20 6 views
-4

Ich versuche, ein Spiel in Python mit PyGame zu machen, aber ich erhalte diese Zurückverfolgungs:Wie PC Spielfehler zu lösen ist Wasserspiel?

Traceback (most recent call last): 
    File "C:\Users\usuario\Documents\abscorp\232\232.py", line 150, in 
<module> 
    hits = pygame.sprite.groupcollide(drop, player, True, True) 
    File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1536, in 
groupcollide 
    c = SC(s, groupb, dokillb, collided) 
    File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1500, in 
spritecollide 
    for s in group.sprites(): 
AttributeError: 'Player' object has no attribute 'sprites' 

Es gibt bestimmten Wassertropfen, die zufällig aus den Rohren fallen sollte, aber IDLE hält mir eine Fehlermeldung zu geben. Ich glaube, der Teil, der den Fehler erzeugt, ist der folgende: "pygame.sprite.groupcollide".

Der vollständige Code ist unten beigefügt.

import pygame 
import time 
import sys 
import random 


WIDTH = 800 
HEIGHT = 600 
FPS = 360 

WHITE = (255, 255, 255) 
BLACK = (0, 0, 0) 
GRAY = (168, 169, 173) 

font_name = pygame.font.match_font('arial') 
pygame.init() 
pygame.mixer.init() 
screen=pygame.display.set_mode((WIDTH, HEIGHT)) 
pygame.display.set_caption("where is the drop!") 
clock = pygame.time.Clock() 

#Load all game graphics and sounds 
background = pygame.image.load("bckgrnd_3.png").convert() 
background_rect = background.get_rect() 
boy_1_img = pygame.image.load("boy_1_img.png").convert() 
drop_img = pygame.image.load("drop_img.png").convert() 
explosion_anim = {} 
explosion_anim['lg'] = [] 
explosion_anim['sm'] = [] 


for i in range(3): 
    filename = 'exp_{}.png'.format(i) 
    img = pygame.image.load(filename).convert() 
    img.set_colorkey(GRAY) 
    img_lg = pygame.transform.scale(img, (75, 75)) 
    explosion_anim['lg'].append(img_lg) 
    img_sm = pygame.transform.scale(img, (32, 32)) 
    explosion_anim['sm'].append(img_sm) 

def newdrop(): 
    d = Drop() 
    all_sprites.add(d) 
    drop.add(d) 

class Drop(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.transform.scale(drop_img, (50, 38)) 
     self.image.set_colorkey(BLACK) 
     self.rect = self.image.get_rect() 
     self.radius = int(self.rect.width * .85/ 2) 
     #pygame.draw.circle(self.image, RED, self.rect.center, self.radius) 
     self.rect.x = random.randrange(WIDTH - self.rect.width) 
     self.rect.y = random.randrange(-100, -40) 
     self.speedy = random.randrange(1, 2) 
     self.speedx = random.randrange(-1, 1) 

    def update(self): 
     self.rect.x += self.speedx 
     self.rect.y += self.speedy 
     if self.rect.top > HEIGHT + 10: 
      self.rect.x = random.randrange(WIDTH - self.rect.width) 
      self.rect.y = random.randrange(-100, -40) 
      self.speedy = random.randrange(1, 2) 

    class Player(pygame.sprite.Sprite): 
    #sprite for the Player 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.transform.scale(boy_1_img, (50, 38)) 
     self.image.set_colorkey(WHITE) 
     self.rect = self.image.get_rect() 
     self.radius = 25 
     #pygame.draw.circle(self.image, RED, self.rect.center, self.radius) 
     self.rect.center = (WIDTH/1.5, HEIGHT/1.5) 
     self.shield = 100 
     self.shoot_delay = 250 
     self.last_shot = pygame.time.get_ticks() 

    def update(self): 
     self.speedx = 0 
     self.speedy = 0 
     keystate = pygame.key.get_pressed() 
     if keystate[pygame.K_LEFT]: 
     self.speedx = -2 
     if keystate[pygame.K_RIGHT]: 
      self.speedx = 2 
      if keystate[pygame.K_UP]: 
      self.speedy = -2 
      if keystate[pygame.K_DOWN]: 
      self.speedy = 2 
     if keystate[pygame.K_SPACE]: 
      self.throw() 
      self.rect.x += self.speedx 
      self.rect.y += self.speedy 
      if self.rect.right > WIDTH: 
      self.rect.right = WIDTH 
     if self.rect.left < 0: 
      self.rect.left = 0 
      if self.rect.top > HEIGHT: 
      self.rect.top = HEIGHT 
     if self.rect.bottom < 0: 
      self.rect.bottom = 0 



all_sprites = pygame.sprite.Group() 
drop = pygame.sprite.Group() 
player=Player() 
all_sprites.add(player) 
for i in range(8): 
    newdrop() 

##pygame.mixer.music.play(loops=-1) 

# Game Loop 
score = 0 
running= True 
while running: 
    #keep loop running at the right speed 
    #Process input (events) 
    for event in pygame.event.get(): 
    #check for closing window 
     if event.type == pygame.QUIT: 
      running= False 

    #Update 
    all_sprites.update() 

    #check to see if a drop hits bucket 
    hits = pygame.sprite.groupcollide(drop, player, True, True) 
    for hit in hits: 
     score += 1 
     ##random.choice(expl_sounds).play() 
     expl = Explosion(hit.rect.center, 'lg') 
     all_sprites.add(expl) 
     newdrop() 


    #check to see if a drop hits big bucket 
    hits = pygame.sprite.spritecollide(bucket, drop, True, 
    pygame.sprite.collide_circle) 
    for hit in hits: 
     newdrop() 
     player.shield -= 10 
     expl = Explosion(hit.rect.center, 'sm') 
     all_sprites.add(expl) 
     if player.shield <= 0: 
      running = False 
     #print (player.shield) 

    #Draw/render 
    screen.fill(BLACK) 
    screen.blit(background, (0, 0)) 
    all_sprites.draw(screen) 
    draw_text(screen, str(score), 18, WIDTH/2, 10) 
    draw_shield_bar(screen, 5, 5, player.shield) 
    #*after* drawing everything, flip the display 
    pygame.display.flip() 

pygame.quit() 
+3

Schrei mich nicht an. : P – cHao

+2

Bitte stoppen Sie SCHREIEN. Text in ALL CAPS ist schwer zu lesen und zu verstehen, und es ist extrem nervig. Ihre Umschalttaste funktioniert eindeutig, da Sie in Ihrem Code Kleinbuchstaben haben. Diese Shift-Tasten befinden sich auf beiden Seiten der Tastatur, sodass sie leicht zu erreichen sind, sodass Sie sie zum Lesen von Text verwenden können. Bitte benutze sie jetzt und bearbeite deinen Beitrag, um ihn richtig zu stellen. Während Sie diese Änderung vornehmen, können Sie die angezeigte Fehlermeldung einfügen, damit diese Informationen ebenfalls verfügbar sind. Sie bitten um ** kostenlose Hilfe **, um Ihr Problem ** zu lösen. Geben Sie die Details an und fragen Sie höflich. –

+0

Ich weiß nicht, ob dies Auswirkungen hat, aber Sie sollten Ihre Player-Klasse deaktivieren. Wie oben gezeigt, liest Python Player() wie in Drop() enthalten. –

Antwort

3

Fehlermeldung zeigt, dass es hat Problem mit groupcollide so es überprüft in documentation.

groupcollide (Gruppe 1, Gruppe 2, dokill1, dokill2, kollidierte = None) -> Sprite_dict

alle Sprites finden, die zwischen zwei Gruppen kollidieren.

Dokumentation zeigt, dass es zwei Gruppen benötigt - es bedeutet pygame.sprite.Group
aber Sie player verwenden, die pygame.sprite.Sprite

ist Um zu überprüfen Kollision zwischen Sprite und Group Sie