How do I stop my character from shrinking when I change self.surf with a keybind?

Viewed 29

i am trying to make the game switch players/sprite from the keybinds "left" and "right". However when i do, the sprite shrinks (keeping its hitbox) can anyone help?


class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__() 
        img_player = pygame.image.load("../graphics/left_player.png")
        self.image = pygame.transform.scale(img_player,(50, 50))
        self.surf = self.image
        self.rect = self.surf.get_rect()
   
        self.pos = vec((10, 360))
        self.vel = vec(0,0)
        self.acc = vec(0,0)
        self.jumping = False
        self.score = 10
 
    def move(self):
        self.acc = vec(0,0.5)
    
        pressed_keys = pygame.key.get_pressed()
                
        if pressed_keys[K_LEFT]:
            self.acc.x = -ACC
        if pressed_keys[K_RIGHT]:
            self.acc.x = ACC
                 
        self.acc.x += self.vel.x * FRIC
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
         
        if self.pos.x > WIDTH:
            self.pos.x = 0
        if self.pos.x < 0:
            self.pos.x = WIDTH
             
        self.rect.midbottom = self.pos
 
    def jump(self): 
        hits = pygame.sprite.spritecollide(self, platforms, False)
        if hits and not self.jumping:
           self.jumping = True
           self.vel.y = -15 + game_upgrade_jump
           pygame.mixer.Sound.play(jump_sound)
 
    def cancel_jump(self):
        if self.jumping:
            if self.vel.y < -3:
                self.vel.y = -3
 
    def update(self):
        hits = pygame.sprite.spritecollide(self ,platforms, False)
        if self.vel.y > 0:        
            if hits:
                if self.pos.y < hits[0].rect.bottom:
                    if hits[0].point == True:   
                        hits[0].point = False   
                        self.score += (1 + game_upgrade_points)     
                        print('score changed: ', self.score)
                    self.pos.y = hits[0].rect.top +1
                    self.vel.y = 0
                    self.jumping = False
1 Answers

Create 2 images, one for the left side and one for the right side in the constructor of the class. An image can be flipped with pygame.display.flip. Select the correct image depending on the direction of movement in the move method:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__() 
        img_player = pygame.image.load("../graphics/left_player.png")
        self.right_image = pygame.transform.scale(img_player, (50, 50))
        self.left_image = pygame.transform.flip(self.right_image, True, False) 
        slef.image = self.right_image
        self.rect = self.image.get_rect()
        
        self.pos = vec((10, 360))
        self.vel = vec(0,0)
        self.acc = vec(0,0)
        self.jumping = False
        self.score = 10
 
    def move(self):
        self.acc = vec(0,0.5)
    
        pressed_keys = pygame.key.get_pressed()
        if pressed_keys[K_LEFT]:
            self.acc.x = -ACC
            slef.image = self.left_image
        if pressed_keys[K_RIGHT]:
            self.acc.x = ACC
            slef.image = self.right_image

        # [...]
Related