How to animate the position of an object or sprite in Pygame and move it towards predefined positions or along a defined path?

Question:

I learned how to print image in pygame, but I don’t know how to make a dynamic position(It can change the image position by itself). What did I miss? Here’s my attempt.

import pygame

screen_size = [360,600]
screen = pygame.display.set_mode(screen_size)
background = pygame.image.load("rocketship.png")
keep_alive = True
while keep_alive:
    planet_x = 140
    o = planet_x
    move_direction = 'right'
    if move_direction == 'right':
          while planet_x == 140 and planet_x < 300:
            planet_x = planet_x + 5
          if planet_x == 300:
            planet_x = planet_x - 5
            while planet_x == 0:
                if planet_x == 0:
               
    planet_x+=5
   
    screen.blit(background, [planet_x, 950])
   
    pygame.display.update()
Asked By: Dragon RB

||

Answers:

You don’t need nested loops to animate objects. You have one loop, the application loop. Use it! You need to redraw the entire scene in each frame. Change the position of the object slightly in each frame. Since the object is drawn at a different position in each frame, the object appears to move smoothly.
Define the path the object should move along by a list of points and move the object from one point to another.

Minimal example

import pygame

pygame.init()
window = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()

corner_points = [(100, 100), (300, 300), (300, 100), (100, 300)]
pos = corner_points[0]
speed = 2

def move(pos, speed, points):
    direction = pygame.math.Vector2(points[0]) - pos
    if direction.length() <= speed:
        pos = points[0]
        points.append(points[0])
        points.pop(0)
    else:
        direction.scale_to_length(speed)
        new_pos = pygame.math.Vector2(pos) + direction
        pos = (new_pos.x, new_pos.y) 
    return pos

image = pygame.image.load('bird.png').convert_alpha()

run = True
while run:
    clock.tick(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    pos = move(pos, speed, corner_points)
    image_rect = image.get_rect(center = pos)
           
    window.fill(0)
    pygame.draw.lines(window, "gray", True, corner_points) 
    window.blit(image, image_rect)
    pygame.display.update()

pygame.quit()
exit()
Answered By: Rabbid76
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.