-4

I'm trying to make a game in Python using PyGame, but I receive this traceback:

  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'

There are certain drops of water that should fall from pipes randomly but IDLE keeps giving me an error message. I believe the part that produces the error is the following: "pygame.sprite.groupcollide".

The full code is attached below.

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()
Daniel R. Livingston
  • 1,227
  • 14
  • 36
Scorp Y
  • 51
  • 2
  • 6
  • 3
    Don't yell at me. :P – cHao Dec 20 '17 at 23:52
  • 2
    Please stop SHOUTING. Text in ALL CAPS is difficult to read and understand, and it's extremely annoying. Your Shift key clearly works, since you have lower case text in your code. Those Shift keys are on both sides of your keyboard to make them easy to reach so you can use them to make text readable. Please start using them now, and [edit] your post to ask properly. While you're making that edit, you can include the error message you're seeing so that we have that info available as well. You're asking for **free help** to solve **your problem**. Provide the details and ask politely. – Ken White Dec 21 '17 at 00:01
  • I don't know if this is affecting anything, but you should de-indent your Player class. As it is shown above, Python is reading Player() as contained within Drop(). – Daniel R. Livingston Dec 21 '17 at 00:11
  • error message shows in which line it has problem so check values and types of variables - ie. check `group` – furas Dec 21 '17 at 00:38

1 Answers1

3

Error message shows that it has problem with groupcollide so check it in documentation .

groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict

Find all sprites that collide between two groups.

Documentation shows that it needs two groups - it means pygame.sprite.Group
but you use player which is pygame.sprite.Sprite

To check collision between Sprite and Group you have

furas
  • 134,197
  • 12
  • 106
  • 148