Python Forum
how can i solve this videogame error?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
how can i solve this videogame error?
#1
THIS IS THE ERROR I AM GETTING:

Traceback (most recent call last):
File "C:\Users\usuario\Documents\abscorp\232\232.py", line 132, in <module>
newdrop()
File "C:\Users\usuario\Documents\abscorp\232\232.py", line 44, in newdrop
d = Drop1()
TypeError: 'Group' object is not callable


THIS IS MY CODE:


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():
    Drop1 = pygame.sprite.Group()
    d = Drop1()
    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
            

##    def shoot(self):
##    now = pygame.time.get_ticks()
##    if (now - self.last_shot > self.shoot_delay):
##        self.last_shot = now
##        bullet = Bullet(self.rect.centerx, self.rect.top)
##        all_sprites.add(bullet)
##        bullets.add(bullet)
##        shoot_sound.play()

##shoot_sound = pygame.mixer.Sound('pew.wav')
##expl_sounds = []
##for snd in ['expl3.wav', 'expl6.wav']:
##    expl_sounds.append(pygame.mixer.Sound(snd))
##pygame.mixer.music.load('bckgrnd_1.wav')
##pygame.mixer.music.set_volume(0.4)



all_sprites = pygame.sprite.Group()
drop = pygame.sprite.Sprite()
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
    clock.tick(FPS)
    #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.spritecollide(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 floor
    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()
Reply
#2
Please put your code in Python code tags, and error in error tags. Make sure formatting/indentation is preserved. You can find help here:
https://python-forum.io/misc.php?action=help&hid=25
Reply
#3
group is a container that holds objects. There is no reason to call its object, but call its objects methods .
Quote:
def newdrop():
    Drop1 = pygame.sprite.Group()
    d = Drop1()
    all_sprites.add(d)
    drop.add(d)

You would do something like this

# This is a list of 'sprites.' Each block in the program is
# added to this list.
# The list is managed by a class called 'Group.'
block_list = pygame.sprite.Group()
 
# This is a list of every sprite.
# All blocks and the player block as well.
all_sprites_list = pygame.sprite.Group()

...

for i in range(50):
    # This represents a block
    block = Block(BLACK, 20, 15)
 
    # Set a random location for the block
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(screen_height)
 
    # Add the block to the list of objects
    block_list.add(block)
    all_sprites_list.add(block)

...

player = Block(RED, 20, 15)
all_sprites_list.add(player)
full example here
http://programarcadegames.com/index.php?...to_sprites
Recommended Tutorials:
Reply
#4
So, now the runs like magic, but a drop of water should appear falling from the top of the screen randomly several times, but it doesnt happen, can anyone help me???

if you need the image files give me your email i will send them to you.

I apprecieate your help


Big Grin
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020