def main(): """ Main Program """ pygame.init() background = Background('city.png', [0,0]) # Set the height and width of the screen and window title size = [Config.SCREEN_WIDTH, Config.SCREEN_HEIGHT] screen = pygame.display.set_mode(size) pygame.display.set_caption("Side-scrolling Platformer") # Create the player player = Player() # Create all the levels manager = LevelManager(player) player.register_manager(manager) active_sprite_list = pygame.sprite.Group() player.rect.x = Config.RIGHT_LIMIT - player.width # Start at right scroll border player.rect.y = Config.SCREEN_HEIGHT - player.rect.height # Start on ground active_sprite_list.add(player) # Loop until the user clicks the close button. done = False # Used to manage how fast the screen updates clock = pygame.time.Clock() # Current status of directional keys r_down = False l_down = False u_down = False # Used to prevent auto-bunnyhopping. Active while holding up jump_lock = False large_font = pygame.font.SysFont('comicsans', 30) over = False level_num = 0 """ Main program loop until user exits or game quits """ while not done: if level_num % 2 == 0 and manager.current_level_no % 2 == 1: background = Background('test.png', [0, 0]) level_num = 1 elif level_num % 2 == 1 and manager.current_level_no % 2 == 0: background = Background('city.png', [0, 0]) level_num = 0 if background.start < background.image.get_width() * -1: background.start = background.image.get_width() if background.end < background.image.get_width() * -1: background.end = background.image.get_width() manager.get_current_level().iterations += 1 score = large_font.render("grade: " + str(round((manager.get_current_level().speed / manager.get_current_level().iterations) / Config.SPEED_MAX * 100, 1)), 1, (255, 255, 255)) file_name = large_font.render(manager.get_current_level().file_name, 1, (255, 255, 255)) manager.get_current_level().speed += player.change_x skip = False for event in pygame.event.get(): if event.type == pygame.QUIT: done = True # Check for pressed keys if event.type == pygame.KEYDOWN: key = event.key if key == pygame.K_LEFT or key == pygame.K_a: l_down = True if key == pygame.K_RIGHT or key == pygame.K_d: r_down = True if key == pygame.K_UP or key == pygame.K_w or key == pygame.K_SPACE: u_down = True if key == pygame.K_q: manager.end_game() if key == pygame.K_s: skip = True if key == pygame.K_r: manager.reset_current_level() # Check for released keys if event.type == pygame.KEYUP: key = event.key if key == pygame.K_LEFT or key == pygame.K_a: l_down = False if key == pygame.K_RIGHT or key == pygame.K_d: r_down = False if key == pygame.K_UP or key == pygame.K_w or key == pygame.K_SPACE: u_down = False jump_lock = False # Jump if on the ground, reduce grav if airborne (or haven't released UP) if u_down: if jump_lock: player.float() else: player.jump() jump_lock = True if r_down and l_down: pass # Do nothing, but maintain speed elif r_down: player.acc_right() elif l_down: player.acc_left() else: player.stop_x() # Update the player. active_sprite_list.update(background) # Update items in the level manager.get_current_level().update() # If the player gets near the right side, shift the world left (-x) if player.rect.right >= Config.RIGHT_LIMIT: diff = player.rect.right - Config.RIGHT_LIMIT player.rect.right = Config.RIGHT_LIMIT manager.get_current_level().shift_world(-diff) # If the player gets near the left side, shift the world right (+x) if player.rect.left <= Config.LEFT_LIMIT: diff = Config.LEFT_LIMIT - player.rect.left player.rect.left = Config.LEFT_LIMIT manager.get_current_level().shift_world(diff) # If the player gets to the end of the level, go to the next level current_position = player.rect.x + manager.get_current_level().world_shift if skip or current_position < manager.get_current_level().level_limit: if not manager.advance_level(): over = True # ALL CODE TO DRAW SHOULD GO BELOW THIS COMMENT # Invoking background image # screen.fill([255, 255, 255]) # screen.blit(BackGround.image, BackGround.rect) screen.blit(background.image, (background.start, 0)) screen.blit(background.image, (background.end, 0)) if not over: manager.get_current_level().draw(screen) active_sprite_list.draw(screen) screen.blit(score, (Config.SCREEN_WIDTH / 2 - 2 * score.get_width() + Config.SCREEN_WIDTH / 2, 50)) screen.blit(file_name, (0.5*file_name.get_width(), 50)) else: end_game(manager, screen, large_font) pygame.display.update() # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT # Limit to 60 frames per second clock.tick(60) # Update the screen # stats screen should come here # speed_sum / iterations # Be IDLE friendly. If you forget this line, the program will 'hang' on exit. pygame.quit()