Search code examples
pythonpygamespritekill

i want to kill my sprite. how to kill it?


    import pygame as pygame , sys,time
    
    pygame.init()
    size = (700,500)
    window_game = pygame.display.set_mode(size)
    
    _run_ = True
    
        
    
    white = (255,255,255) 
    mouse_pos = pygame.mouse.get_pos()
      
    
    
    class mySprite(pygame.sprite.Sprite):
        def __init__ (self,cord_x,cord_y,picture,colorkey):
            super().__init__()
            self.image = pygame.Surface([0,0])
            self.image = pygame.image.load(picture)
            self.image.set_colorkey(colorkey)
            self.rect = self.image.get_rect()
            self.rect.center = [cord_x,cord_y] 
            self.kill()
            
    
    placeSP_group = pygame.sprite.Group()
    Clock = pygame.time.Clock()
    FPS = 500
    while _run_:
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.QUIT
                sys.exit()
        mouse_pos = pygame.mouse.get_pos()
        placeSP = [mySprite(mouse_pos[0],mouse_pos[1],'sp_1.png',white)]
        pygame.display.flip()
        placeSP_group.draw(window_game)
        placeSP_group.add(placeSP[:])
        Clock.tick(FPS)

now i want that my sprite get's killed and get the new mouse position and window_game.fill('black') dosen't work is there any thing you can do to fix it pls tell me... what i wan't is every time my mouse moves i wan't kill the last sprite and create the other one with the current sprite pos.


Solution

  • You use kill() in wrong moment.

    kill() works when Sprite is inside Group but you first create Sprite which try to use kill() and later you add this sprite to Group.

    You should first create Sprite, next add to Group and later run kill() for first Sprite in Group

    placeSP_group.sprites()[0].kill()
    

    but normal Group doesn't have to keep sprites in order and better use

    placeSP_group = pygame.sprite.OrderedUpdates()
    

    Full working code. It display 5 sprites which follow mouse.

    import pygame
    import sys
    
    # --- constants ---  # PEP8: `UPPER_CASE_NAMES` for constants
    
    WHITE = (255, 255, 255)   # PE8: space after `,`
    SIZE = (700, 500)
    FPS = 50  # there is no need to use `500` because Python can't run so fast,
               # and monitors runs with 60Hz (eventually 120Hz) which can display 60 FPS (120 FPS)
    
    # --- classes ---  # PEP8: `CamelCaseNames` for classes
    
    class MySprite(pygame.sprite.Sprite):
        
        def __init__(self, x, y, picture, colorkey):
            super().__init__()
            
            # you need one of them
            
            # load image
            #self.image = pygame.image.load(picture)
            
            # OR
    
            # create surface        
            self.image = pygame.Surface((10, 10))
            self.image.fill((255, 0, 0))
            
            # ----
            
            self.rect = self.image.get_rect()
            self.rect.center = (x, y)
    
            self.image.set_colorkey(colorkey)
    
    # --- main ---
    
    pygame.init()
    window_game = pygame.display.set_mode(SIZE)
    
    #placeSP_group = pygame.sprite.Group()
    placeSP_group = pygame.sprite.OrderedUpdates()  # Group which keep order
    
    sprite1 = MySprite(0, 0, 'sp_1.png', WHITE)
    sprite2 = MySprite(0, 0, 'sp_1.png', WHITE)
    sprite3 = MySprite(0, 0, 'sp_1.png', WHITE)
    sprite4 = MySprite(0, 0, 'sp_1.png', WHITE)
    sprite5 = MySprite(0, 0, 'sp_1.png', WHITE)
    placeSP_group.add([sprite1, sprite2, sprite3, sprite4, sprite5])
    
    clock = pygame.time.Clock()   # PEP8: `lower_case_names` for variables
    
    running = True
    
    while running:
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                #running = False
                pygame.quit()
                exit()
                
        # create new Sprite
        x, y = pygame.mouse.get_pos()
        new_sprite = MySprite(x, y, 'sp_1.png', WHITE)
        
        # add new Sprite at the end of OrderedUpdates()
        placeSP_group.add([new_sprite])
        
        # remove Sprite at the beginning of OrderedUpdates()
        placeSP_group.sprites()[0].kill()  
    
        # ---
    
        pygame.display.flip()
        
        window_game.fill('black') 
        placeSP_group.draw(window_game)
        
        clock.tick(FPS)