How to move the player across a one background image?

The player’s movement depends on the size of the map. The x and y attributes of the “player” store the position on the map and are limited to the size of the map (map_size). The player is always drawn in the center of the screen, except it is near the boarders of the map:

class Player():
    def __init__(self, x, y):
        self.Image = pygame.image.load("myAvatar.png").convert()
        self.x = 200
        self.y = 200
  
    def handle_keys(self, map_size):
        key = pygame.key.get_pressed()
        self.x += (key[K_RIGHT] - key[K_LEFT]) * 500 * time_passed
        self.y += (key[K_DOWN] - key[K_UP]) * 500 * time_passed
        self.x = max(0, min(map_size[0]-20, self.x))
        self.y = max(0, min(map_size[1]-20, self.y))
    
    def draw(self, game_window, map_size):
        window_size = game_window.get_size()
        center = window_size[0] // 2, window_size[0] // 2
        
        pos = [self.x, self.y]
        for i in range(2):
            if center[i] < pos[i] <= map_size[i]-center[i]:
                pos[i] = center[i]
            elif pos[i] > map_size[i] - center[i]: 
                pos[i] = window_size[i] - map_size[i] + pos[i]
        game_window.blit(self.Image, (int(pos[0]), int(pos[1])))

The player’s position on the map is centered in the window:

class Map():
    def __init__(self):
        self.Image = pygame.image.load("test2.png").convert()

    def draw(self, game_window):
        window_size = game_window.get_size()
        map_size = self.Image.get_size()
        x = max(0, min(map_size[0] - window_size[0], player.x - 200))
        y = max(0, min(map_size[1] - window_size[1], player.y - 200))
        game_window.blit(self.Image, (-x, -y))

Application loop:

leave = False
while not leave:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            leave = True

    player.handle_keys(map.Image.get_size())

    game_window.fill((0,0,0))
    map.draw(game_window)
    #enemy.draw(game_window)
    player.draw(game_window, map.Image.get_size())
    
    pygame.display.update()
    pygame.display.flip()
    time_passed = clock.tick() / 1000

pygame.quit()

Leave a Comment