This tutorial will add the flip mechanism to the GameSprite module to flip the game character along the y axis as well as includes the script to move the game character along the x axis in our main game module.
In order to flip the gaming character we need to use the below method
pygame.transform.flip(sub_surface, self.flip, False)
where sub_surface is the surface return by the
method which we have mentioned in our previous tutorial. Besides the sub_surface, the pygame.transform.flip method also takes in two other parameters, the first one is the xboolean uses to flip the surface along the y axis and the second one is the yboolean uses to flip the surface along the x axis, we will only use the xboolean in this example so the yboolean value is always set to False. By setting the xboolean to True or False we can flip the surface along the y axis which will make the game character facing left or right.
There is only one minor change to your original GameSprite module which is to add in another boolean parameter to it so you can use that boolean parameter to control the flipping x-direction.
import pygame class GameSprite(object): def __init__(self, image, rect, flip): self.image = image self.rect = rect self.flip = flip self.sprite = pygame.image.load(image).convert_alpha() def getImage(self): # this method will return a subsurface which represents a portion of the spritesheet self.sprite.set_clip(self.rect) # clip a portion of the sprite with the rectangle object sub_surface = self.sprite.subsurface(self.sprite.get_clip()) return pygame.transform.flip(sub_surface, self.flip, False)
In order to move our game character we need to get all the keys a user has pressed with this statement.
pressed_keys = pygame.key.get_pressed() # get all the keys from key-press events
Then we will see whether the left arrow key is within the pressed_keys list or not.
if pressed_keys[K_LEFT]: flip = True # if the user pressed the left arrow key then makes the object facing left v = Vector2D(-1., 0.) # move the object one unit to the left
Or else whether the right arrow key is within the pressed_keys list or not.
elif pressed_keys[K_RIGHT]: flip = False # if the user pressed the right arrow key then makes the object facing right v = Vector2D(1., 0.) # move the object one unit to the right
#!/usr/bin/env python import pygame from pygame.locals import * from sys import exit from vector2d import Vector2D from game_sorite import GameSprite robot_sprite_sheet = 'left.png' pygame.init() screen = pygame.display.set_mode((640, 480), 0, 32) pygame.display.set_caption("Pygame Demo") w, h = 64, 64 # width and height of the sprite sprite_counter = 0 # initialize the sprite_counter game_frame = 0 # initialize the game_frame counter flip = False clock = pygame.time.Clock() # initialize the clock object player_pos = Vector2D(320, 240) # initial position of the sprite player_speed = 70. # speed per second while True: for event in pygame.event.get(): if event.type == QUIT: exit() v = Vector2D(0., 0.) # reset the speed to zero on each pass pressed_keys = pygame.key.get_pressed() # get all the keys from key-press events if pressed_keys[K_LEFT]: flip = True # if the user pressed the left arrow key then makes the object facing left v = Vector2D(-1., 0.) # move the object one unit to the left elif pressed_keys[K_RIGHT]: flip = False # if the user pressed the right arrow key then makes the object facing right v = Vector2D(1., 0.) # move the object one unit to the right screen.fill((205, 200, 115)) rect = Rect((sprite_counter * 64, 0), (64, 64)) # the rectangle object used to clip the sprite area game_sprite = GameSprite(robot_sprite_sheet, rect, flip) game_sprite_surface = game_sprite.getImage() # get the sprite surface player_draw_pos = Vector2D(player_pos.x-w/2, player_pos.y-h/2) screen.blit(game_sprite_surface, player_draw_pos) #increase the sprite counter after x numbers of frame if(game_frame % 30 == 0): sprite_counter += 1 if(sprite_counter > 5): sprite_counter = 0 game_frame += 1 time_passed = clock.tick() time_passed_seconds = time_passed / 1000.0 player_pos+= v * player_speed * time_passed_seconds pygame.display.flip()
Now run the above module and press the left or right arrow key to see how the game character flip and move around.