1

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()

1 Answer 1

1

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()
0

Not the answer you're looking for? Browse other questions tagged or ask your own question.