I just made some changes, adding some images in the background and changing some of the pieces to build the map.
The code is here. The repository on github is here.
import pygame, sys, os from random import choice clock = pygame.time.Clock() from pygame.locals import * pygame.init() # initiates pygame pygame.display.set_caption('Pygame Platformer') WINDOW_SIZE = (600,800) screen = pygame.display.set_mode(WINDOW_SIZE,0,32) # initiate the window display = pygame.Surface((300, 400)) # display2 = pygame.Surface((300, 400)) moving_right = False moving_left = False vertical_momentum = 0 air_timer = 0 true_scroll = [0,0] def load_map(): d = [ "110011", "11010101" "010111", "011011", "010111", "110111", "000111", "111011", "010000" "110101", "011001", "000000", "000000", "000000", "11111111111111111111111111" "000000", "110100"] data = [choice(d)*2 for x in range(20)] game_map = [] for row in data: game_map.append(list(row)) return game_map global animation_frames animation_frames = {} def load_animation(path,frame_durations): global animation_frames animation_name = path.split('/')[-1]animation_frame_data = [] n = 0 for frame in frame_durations: animation_frame_id = animation_name + '_' + str(n) img_loc = path + '/' + animation_frame_id + '.png' # player_animations/idle/idle_0.png animation_image = pygame.image.load(img_loc).convert() animation_image.set_colorkey((255,255,255)) animation_frames[animation_frame_id] = animation_image.copy() for i in range(frame): animation_frame_data.append(animation_frame_id) n += 1 return animation_frame_data def change_action(action_var,frame,new_value): if action_var != new_value: action_var = new_value frame = 0 return action_var,frame animation_database = {} animation_database['run'] = load_animation('player_animations/run',[7,7]) animation_database['idle'] = load_animation('player_animations/idle',[7,7,40]) game_map = load_map() grass_img = pygame.image.load('grass.png') dirt_img = pygame.image.load('dirt.png') player_action = 'idle' player_frame = 0 player_flip = False player_rect = pygame.Rect(100,100,5,13) background_objects = [[0.25,[120,10,70,400]],[0.25,[280,30,40,400]],[0.5,[30,40,40,400]],[0.5,[130,90,100,400]],[0.5,[300,80,120,400]]] def collision_test(rect,tiles): hit_list = [] for tile in tiles: if rect.colliderect(tile): hit_list.append(tile) return hit_list def move(rect,movement,tiles): collision_types = {'top':False,'bottom':False,'right':False,'left':False} rect.x += movement[0] hit_list = collision_test(rect,tiles) for tile in hit_list: if movement[0] > 0: rect.right = tile.left collision_types['right'] = True elif movement[0] < 0: rect.left = tile.right collision_types['left'] = True rect.y += movement[1] hit_list = collision_test(rect,tiles) for tile in hit_list: if movement[1] > 0: rect.bottom = tile.top collision_types['bottom'] = True elif movement[1] < 0: rect.top = tile.bottom collision_types['top'] = True return rect, collision_types def show(dsp, srf, x, y): dsp.blit(srf, (x * 16 - scroll[0], y * 16 - scroll[1])) def tilerects(): tile_rects = [] y = 0 for layer in game_map: x = 0 for tile in layer: if tile == '1': show(display, dirt_img, x, y) # show(display2, tile_cover, x + 1, y) tile_rects.append(pygame.Rect(x * 16, y * 16,16,16)) x += 1 y += 1 return tile_rects # player_cover = pygame.Surface((5, 13)) # player_cover.fill((0, 0, 0)) # tile_cover = pygame.Surface((32, 32)) # tile_cover.fill((0, 0, 255)) # # THE LOOP # mount = pygame.image.load("mountains.png") sea = pygame.image.load("sea.png") while True: # game loop display.fill((146,244,255)) # clear screen by filling it with blue # screen.blit(pygame.transform.scale(display2, WINDOW_SIZE), (0,0)) true_scroll[0] += (player_rect.x-true_scroll[0]-152)/20 true_scroll[1] += (player_rect.y-true_scroll[1]-106)/20 scroll = true_scroll.copy() scroll[0] = int(scroll[0]) scroll[1] = int(scroll[1]) # --- parallax --- # pygame.draw.rect(display, (7, 80, 75), pygame.Rect(0, 120, 300, 400)) # --------- BACKGROUND -------- display.blit(mount, (0, 30)) display.blit(sea, (0, 150)) # for background_object in background_objects: # obj_rect = pygame.Rect( # background_object[1][0] - scroll[0] * background_object[0], # background_object[1][1] - scroll[1] * background_object[0], # background_object[1][2], # background_object[1][3]) # if background_object[0] == 0.5: # pygame.draw.rect(display, (14, 222, 150), obj_rect) # else: # pygame.draw.rect(display, (9, 91, 85), obj_rect) tile_rects = tilerects() player_movement = [0,0] if moving_right == True: player_movement[0] += 2 if moving_left == True: player_movement[0] -= 2 player_movement[1] += vertical_momentum vertical_momentum += 0.2 if vertical_momentum > 3: vertical_momentum = 3 if player_movement[0] == 0: player_action,player_frame = change_action(player_action,player_frame,'idle') if player_movement[0] > 0: player_flip = False player_action,player_frame = change_action(player_action,player_frame,'run') if player_movement[0] < 0: player_flip = True player_action,player_frame = change_action(player_action,player_frame,'run') player_rect, collisions = move(player_rect,player_movement,tile_rects) if collisions['bottom'] == True: air_timer = 0 vertical_momentum = 0 else: air_timer += 1 player_frame += 1 if player_frame >= len(animation_database[player_action]): player_frame = 0 player_img_id = animation_database[player_action][player_frame] player_img = animation_frames[player_img_id] # display the player not vertically # what has scroll... to do with the scroll # display.blit( # player_cover, # (player_rect.x - scroll[0], player_rect.y - scroll[1])) display.blit( pygame.transform.flip(player_img,player_flip, False), (player_rect.x - scroll[0], player_rect.y - scroll[1])) for event in pygame.event.get(): # event loop if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_SPACE: display.fill((0, 0, 0)) player_rect.x = 100 player_rect.y = 100 game_map = load_map() if event.key == K_RIGHT: moving_right = True if event.key == K_LEFT: moving_left = True if event.key == K_UP: if air_timer < 6: vertical_momentum = -5 if event.type == KEYUP: if event.key == K_RIGHT: moving_right = False if event.key == K_LEFT: moving_left = False screen.blit(pygame.transform.scale(display, WINDOW_SIZE), (0,0)) pygame.display.update() clock.tick(60)
This above is the output. the background is made of two images, this:
and this
Subscribe to the newsletter for updates
Tkinter templates
My youtube channel
Twitter: @pythonprogrammi - python_pygame