Search code examples
pythonpygamepygame-surfacepygame-clock

Why is my platform game in PyGame suddenly so slow?


So I have a platform game I made in PyGame that all works, so I am now trying to make it a bit more colourful. So the code that I changed used to be:

 def draw(self, screen):
     """ Draw everything on this level. """

     # Draw the background
     screen.fill(BLUE)

and I changed it to:

def draw(self, screen):
    """ Draw everything on this level. """

    # Image from http://freepik
    background_image = pygame.image.load("pink background.jpg").convert()

    # Draw the background
    screen.blit(background_image, [0, 0])

to get the pink background to be the background :) Now this is the only thing I changed in the code but everything now moves much slower e.g. the player that is being controlled by the user and the moving platform. There are two levels and I didn't change the code for the second levels background and the player still moves fine there :)

I did think I might of changed the line:

# Limit to 60 frames per second
clock.tick(60)

by accident, but it is still exactly the same.

I hope someone can help :) and thank you in advance :)

The error occurs somewhere in this code: `

def main():

    pygame.init()

    # Set the height and width of the screen
    size = [SCREEN_WIDTH, SCREEN_HEIGHT]
    screen = pygame.display.set_mode(size)

    pygame.display.set_caption('Platformer with moving platforms')

    # Create the player
    player = Player()

    # Create all the levels
    level_list = []
    level_list.append(Level_01(player))

    # Set the current level
    current_level_no = 0
    current_level = level_list[current_level_no]

    active_sprite_list = pygame.sprite.Group()
    player.level = current_level

    player.rect.x = 200
    player.rect.y = SCREEN_HEIGHT - player.rect.height - 30
    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()

    # -------- Main Program Loop --------
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player.go_left()
                if event.key == pygame.K_RIGHT:
                    player.go_right()
                if event.key == pygame.K_UP:
                    player.jump()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT and player.change_x < 0:
                    player.stop()
                if event.key == pygame.K_RIGHT and player.change_x > 0:
                    player.stop()

        # Update the player.
        active_sprite_list.update()

        # Update items in the level
        current_level.update()

        # If the player gets near the right side, shift the world left (-x)
        if player.rect.right >= 500:
            diff = player.rect.right - 500
            player.rect.right = 500
            current_level.shift_world(-diff)

        # If the player gets near the left side, shift the world right (+x)
        if player.rect.left <= 120:
            diff = 120 - player.rect.left
            player.rect.left = 120
            current_level.shift_world(diff)

        # If the player touches the floor they die.
        if player.rect.y == SCREEN_HEIGHT - player.rect.height:
            done = True

        # If the player gets to the end of the level, go to the next level
        current_position = player.rect.x + current_level.world_shift
        if current_position < current_level.level_limit:

            all_lines = []
            list_of_files = os.listdir()
            if username1 in list_of_files:
                file1 = open(username1, "r")
                for line in file1:
                    all_lines.append(line)

            all_lines[2] = str(1)

            with open(username1, 'w') as filehandle:
                for listitem in all_lines:
                    filehandle.write(str(listitem))

            done = True

        # ALL CODE TO DRAW SHOULD GO BELOW THIS COMMENT

        current_level.draw(screen)
        active_sprite_list.draw(screen)

        # Select the font to use, size, bold, italics

        # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT

        # Limit to 60 frames per second
        clock.tick(60)

        # Go ahead and update the screen with what we've drawn.
        pygame.display.flip()

    # Be IDLE friendly. If you forget this line, the program will 'hang'
    # on exit.
    pygame.quit()

if __name__ == "__main__":
    main()

`


Solution

  • Do not load the image in your main loop. Define (load) it outside of the loop and then use it via variable. This is your problem, because it loads the image (in this case FPS = 60) times per second from your disk.