Home > OS >  How can I only remove sprites that have collided?
How can I only remove sprites that have collided?

Time:02-01

These are my classes and the part of the main loop that should create the sprites and then remove them when they collide. Right now both bullets and zombies are being removed with each mouse click, although mouse clicks should just add bullets to the group. Maybe someone has an idea on what I am doing wrong.

class PlayerBullet(pygame.sprite.Sprite):
    def __init__(self, x, y, mouse_x, mouse_y, ):
        pygame.sprite.Sprite.__init__(self, player_bullets)
        self.x = x
        self.y = y
        self.mouse_x = mouse_x
        self.mouse_y = mouse_y
        self.speed = 20
        self.angle = math.atan2(y-mouse_y, x-mouse_x)
        self.image = circle_image


        self.rect = self.image.get_rect()

    def update(self):
        self.x_vel = math.cos(self.angle) * self.speed
        self.y_vel = math.sin(self.angle) * self.speed
        self.x -= int(self.x_vel)
        self.y -= int(self.y_vel)


    def main(self, display):
        self.update()
        display.blit(self.image, (self.x-8, self.y-7))


class Zombie(pygame.sprite.Sprite):
    def __init__(self, x, y, speed):
        pygame.sprite.Sprite.__init__(self, list_zombies)
        self.x = x
        self.y = y
        self.speed = zombie_speed
        self.image = pygame.image.load("Zombie.png").convert()
        self.rect = self.image.get_rect()

    def update(self):
        self.y  = 1

    def main(self, display):
        self.update()

        display.blit(zombie_image_copy, (self.x, self.y))

main loop:

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

            pygame.display.quit()
            pygame.QUIT
            sys.exit()

        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                player_bullets.add(PlayerBullet(player.x, player.y, mouse_x, mouse_y))

if not list_zombies:
        max_zombie_count  = 1
        zombie_speed  = 0.5
        while zombie_count < max_zombie_count:
            spawnpoint_x = random.randint(50,1400)
            spawnpoint_y = 0

            list_zombies.add(Zombie(spawnpoint_x, spawnpoint_y, zombie_speed))
            zombie_count  = 1
            #zombie  = 1

    for bullet in player_bullets:
        bullet.main(display)


    for zombie in list_zombies:
        zombie.main(display)

    for zombie in list_zombies:
        for bullet in player_bullets:
            if pygame.sprite.collide_rect(bullet, zombie):
                bullet.kill()
                zombie.kill()

CodePudding user response:

pygame.Surface.get_rect.get_rect() returns a rectangle with the size of the Surface object, that always starts at (0, 0) since a Surface object has no position. A Surface is blit at a position on the screen.
Therefore all the rectangles have the same position (0, 0) and the collision test evaluates True for all objects. You have to update the position of the rectangle before the collision test:

for zombie in list_zombies:
     zombie.rect.topleft = (zombie.x, zombie.y)
​     for bullet in player_bullets:
         bullet.rect.topleft = (bullet.x, bullet.y)
         ​if pygame.sprite.collide_rect(bullet, zombie):
               ​bullet.kill()
               ​zombie.kill()
  •  Tags:  
  • Related