Search code examples
pythonpygametransformsprite

How can I flip loaded image sprites? Pygame


I want to flip these sprites so that they're facing left. That way I can use the sprite images for my player running left when I press K_LEFT. Currently have it where if you press the right arrow your player moves right and animates.

            self.sprites = []
            self.sprites.append(py.image.load('I1.png'))
            self.sprites.append(py.image.load('R0.png'))
            self.sprites.append(py.image.load('R1.png'))
            self.sprites.append(py.image.load('R2.png'))
            self.sprites.append(py.image.load('R3.png'))
            self.sprites.append(py.image.load('R4.png'))
            self.sprites.append(py.image.load('R5.png'))
            self.current_sprite = 0
            self.image = self.sprites[self.current_sprite]
            self.rect = self.image.get_rect()
            self.rect.center = (x, y)
            self.hit_rect = PLAYER_RECT_HIT
            self.hit_rect.center = self.rect.center
            self.pos = vec(x, y)
            self.vel = vec(0, 0)
            self.acc = vec(0, 0)
            self.is_animating = False

def get_keys(self):
    self.acc = vec(0, PLAYER_GRAVITY)
    keys = py.key.get_pressed()
    if keys[py.K_RIGHT]:
        self.acc.x += PLAYER_ACC
        self.animate()
    if keys[py.K_LEFT]:
        self.acc.x -= PLAYER_ACC

def animate(self):
    self.is_animating = True

def update(self):
    self.get_keys()

    if self.is_animating:
        self.current_sprite += 0.2
        if self.current_sprite >= len(self.sprites):
            self.current_sprite = 0
            self.is_animating = False
    self.image = self.sprites[int(self.current_sprite)]

    self.pos += self.vel
    self.hit_rect.centerx = self.pos.x
    wall_collision(self, self.game.walls, 'x')
    self.hit_rect.centery = self.pos.y
    wall_collision(self, self.game.walls, 'y')
    self.rect.center = self.hit_rect.center

    # Apply Friction
    self.acc.x += self.vel.x * PLAYER_FRICTION
    # Equation of motion
    self.vel += self.acc
    self.pos += self.vel + 0.5 * self.acc

Solution

  • I would try pygame.transform.flip()

    https://www.pygame.org/docs/ref/transform.html#pygame.transform.flip

    When you blit to screen you could check if 'left key' was pressed and transform.flip

    'flip(Surface, xbool, ybool) -> Surface'

    eg.

    if key == 'left':
        self.screen.blit(pygame.transform.flip(self.image, False, True), self.rect)
    

    example code:

    import pygame
    import pygame.sprite
    import sys
    
    
    class WalkingSprite(pygame.sprite.Sprite):
        """ A class to manage an animated sprite. """
    
        def __init__(self):
            super(WalkingSprite, self).__init__()
            self.direction = True
    
            self.images = []
            for number in range(1, 11):
                self.images.append(pygame.image.load(f'images/walking_sprite{number}.png'))
    
            self.index = 0
            self.image = self.images[self.index]
            self.rect = self.image.get_rect()
            self.rect.x, self.rect.y = 300, 200
    
        def update(self):
            self.index += 1
            if self.index >= len(self.images):
                self.index = 0
    
            if self.direction:
                self.image = self.images[self.index]
            else:
                self.image = pygame.transform.flip(self.images[self.index], True, False)
    
    
    BG_COLOR = pygame.Color('white')
    pygame.init()
    screen = pygame.display.set_mode((800, 600))
    walking_sprite = WalkingSprite()
    sprite_group = pygame.sprite.Group(walking_sprite)
    
    clock = pygame.time.Clock()
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
    
                if event.key == pygame.K_LEFT:
                    walking_sprite.direction = False
    
                if event.key == pygame.K_RIGHT:
                    walking_sprite.direction = True
    
            if event.type == pygame.QUIT:
                sys.exit()
    
        sprite_group.update()
        screen.fill(BG_COLOR)
        sprite_group.draw(screen)
        pygame.display.update()
        clock.tick(15)