Your main game loop is incorrect, which is causing your Pygame application to malfunction. Here's a breakdown of the issues:
Incorrect Blitting Order:
In your code, you attempt to blit the background at the position of an object and then move the object before blitting it at its new position. This is unnecessary. The background should be drawn once at the beginning of each frame, and objects should be blitted on top of it without erasing the previous position.
Here's a corrected version of your main application loop:
while True: # Handle events for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # Update objects (based on input and frames) keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: screen.blit(background, objects[0].pos, objects[0].pos) objects[0].move_left() screen.blit(objects[0].image, objects[0].pos) # Blit object at new position if keys[pygame.K_RIGHT]: screen.blit(background, objects[0].pos, objects[0].pos) objects[0].move_right() screen.blit(objects[0].image, objects[0].pos) # Blit object at new position if keys[pygame.K_UP]: screen.blit(background, objects[0].pos, objects[0].pos) objects[0].move_up() screen.blit(objects[0].image, objects[0].pos) # Blit object at new position if keys[pygame.K_DOWN]: screen.blit(background, objects[0].pos, objects[0].pos) objects[0].move_down() screen.blit(objects[0].image, objects[0].pos) # Blit object at new position for num in range(num_objects - 1): objects[num + 1].rand_move() # Draw background screen.blit(background, (0, 0)) # Draw scene for o in objects: screen.blit(o.image, o.pos) # Update display pygame.display.update() pygame.time.delay(100)
The above is the detailed content of Why is my Pygame game loop inefficient and causing incorrect blitting?. For more information, please follow other related articles on the PHP Chinese website!