0

When ever I run my code I just see the one cement block sprite falling from the top of my pygame window. Thats exactly what I want except I want an infinite amount of cement blocks falling from the top of my pygame window. I already have it set to where the cement blocks spawn at a random x-coordinate but I like I said when I run my code only one cement block appears instead of a bunch. How can I fix this???? My code to spawn in infinite cement blocks is in my Debris class and my function is called spawn_multi.

my code:

import random
import pygame

pygame.init()

#screen settings
WIDTH = 1000
HEIGHT = 400

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("AutoPilot")
screen.fill((255, 255, 255))

#fps
FPS = 120
clock = pygame.time.Clock()

#load images
bg = pygame.image.load('background/street.png').convert_alpha() # background
bullets = pygame.image.load('car/bullet.png').convert_alpha()
debris_img = pygame.image.load('debris/cement.png')

#define game variables
shoot = False

#player class
class Player(pygame.sprite.Sprite):
    def __init__(self, scale, speed):
        pygame.sprite.Sprite.__init__(self)

        self.bullet = pygame.image.load('car/bullet.png').convert_alpha()
        self.bullet_list = []
        self.speed = speed
        #self.x = x
        #self.y = y
        self.moving = True
        self.frame = 0
        self.flip = False
        self.direction = 0

        #load car
        self.images = []
        img = pygame.image.load('car/car.png').convert_alpha()
        img = pygame.transform.scale(img, (int(img.get_width()) * scale, (int(img.get_height()) * scale)))
        self.images.append(img)
        self.image = self.images[0]
        self.rect = self.image.get_rect()
        self.update_time = pygame.time.get_ticks()
        self.movingLeft = False
        self.movingRight = False
        self.rect.x = 465
        self.rect.y = 325

    #draw car to screen
    def draw(self):
        screen.blit(self.image, (self.rect.centerx, self.rect.centery))

    #move car
    def move(self):
        #reset the movement variables
        dx = 0
        dy = 0

        #moving variables
        if self.movingLeft and self.rect.x > 33:
            dx -= self.speed
            self.flip = True
            self.direction = -1
        if self.movingRight and self.rect.x < 900:
            dx += self.speed
            self.flip = False
            self.direction = 1

        #update rectangle position
        self.rect.x += dx
        self.rect.y += dy

    #shoot
    def shoot(self):
        bullet = Bullet(self.rect.centerx + 18, self.rect.y + 30, self.direction)
        bullet_group.add(bullet)

    #check collision
    def collision(self, debris_group):
        for debris in debris_group:
            if pygame.sprite.spritecollide(debris, bullet_group, True):
                debris.health -= 1
                if debris.health <= 0:
                    debris.kill()

#bullet class
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, direction):
        pygame.sprite.Sprite.__init__(self)

        self.speed = 5
        self.image = bullets
        self.rect = self.image.get_rect()
        self.rect.center = (x,y)
        self.direction = direction

    def update(self):
        self.rect.centery -= self.speed
        #check if bullet has gone off screen
        if self.rect.centery < 1:
            self.kill()

#debris class
class Debris(pygame.sprite.Sprite):
    def __init__(self,scale,speed):
        pygame.sprite.Sprite.__init__(self)

        self.scale = scale
        self.x = random.randrange(100,800)
        self.y = 15
        self.speed = speed
        self.vy = 0
        self.on_ground = True
        self.move = True
        self.health = 4
        self.max_health = self.health
        self.alive = True
        self.velocity = 1
        self.moving_down = True

        #load debris
        self.image = debris_img
        self.rect = self.image.get_rect()
        self.rect.center = (self.x,self.y)

    #make debris fall down
    def falldown(self):
        self.rect.centery += self.velocity
        if self.moving_down and self.rect.y > 350:
            self.kill()

    #spawn multiple cement blocks
    def spawn_multi(self):
        cement_list = []
        new_cement = Debris(1,5)
        cement_list.append(new_cement)

######################CAR/DEBRIS##########################

player = Player(1,5)
debris = Debris(1, 5)

##########################################################

#groups
bullet_group = pygame.sprite.Group()
debris_group = pygame.sprite.Group()

debris_group.add(debris)

#game runs here
run = True
while run:

    #draw street
    screen.blit(bg, [0, 0])

    #update groups
    bullet_group.update()
    bullet_group.draw(screen)

    debris_group.update()
    debris_group.draw(screen)
    debris.falldown()
    debris.spawn_multi()

    #draw car
    player.draw()
    player.move()
    player.collision(debris_group)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        #check if key is down
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                run = False
            if event.key == pygame.K_a:
                player.movingLeft = True
            if event.key == pygame.K_d:
                player.movingRight = True
            if event.key == pygame.K_SPACE:
                player.shoot()
                shoot = True

        #check if key is up
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_a:
                player.movingLeft = False
            if event.key == pygame.K_d:
                player.movingRight = False

    #update the display
    pygame.display.update()
    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
J.R. BEATS
  • 93
  • 6

1 Answers1

0

Instead of doing something like

debris.spawn_multi()

which creates a new Debris object and add it to a list but doesn't do anything else with it after, you should add it to the debris_group:

debris_group.add(Debris(2, 5))

with this you only call the falldown method of debris (your first created Debris object).
to change this you need to replace

debris.falldown()

with

for d in debris_group:
    d.falldown()

please note:
you are creating a new Debris object every frame. This can be a lot.
to change this you can do something like:

if random.randrange(5) == 0:
    debris_group.add(Debris(2, 5))

instead of

debris_group.add(Debris(2, 5))
Kesslwovv
  • 639
  • 4
  • 17