7. Анимация

На данном этапе мы уже готовы создать анимацию.
Никакого движения объектов на экране монитора нет. Просто от кадра к кадру изменяются цвета пикселей экрана.

Например:
1) пиксель с координатами (10, 10) светится синим цветом,
2) синим загорается пиксель (11, 11), в то время как (10, 10) становится таким же как фон.
3)синим загорается пиксель (12, 12), в то время как (11, 11) становится таким же как фон
4) так далее.

При этом человеку будет казаться, что синяя точка движется по экрану по диагонали.

Суть алгоритма в следующем. Берем фигуру. Рисуем ее на поверхности. Обновляем главное окно, человек видит картинку. Стираем фигуру. Рисуем ее с небольшим смещением от первоначальной позиции. Снова обновляем окно и так далее.

Как "стереть" старую фигуру? Для этого используется метод fill() объекта Surface. В качестве аргумента передается цвет, т. е. фон можно сделать любым, а не только черным, который задан по-умолчанию.

Ниже в качестве примера приводится код анимации круга. Объект появляется с левой стороны, доходит до правой, исчезает за ней. После этого снова появляется слева.
Вывод событий

import sys

from config_file.color import BLUE, RED1, WHITE
from config_file.config import FPS, HEIGHT, WIDTH
from pygame import QUIT, Surface, display, draw, event, init, time

# здесь происходит инициация,
# создание объектов
init()
window = display.set_mode((HEIGHT, WIDTH))
display.set_caption("Моя игра")
clock = time.Clock()


r = 30
x = HEIGHT//2
y = WIDTH//2
# Заливка фона
background = Surface(window.get_size())
background = background.convert()
background.fill(WHITE)
# если надо до цикла отобразить
# какие-то объекты, обновляем экран
window.blit(background, (0, 0))
display.flip()

# главный цикл
while True:
    # задержка
    clock.tick(FPS)

    # цикл обработки событий
    for player_event in event.get():
        if player_event.type == QUIT:
            sys.exit()
    # --------
    # изменение объектов
    # --------
    window.fill(WHITE)
    draw.circle(window, RED1, (x, y), r)
    # обновление экрана
    display.flip()

    if x >= WIDTH + r:
        # перемещаем его за левую
        x = 0 + r
    else:  # Если еще нет,на следующей итерации цикла
           # круг отобразится немного правее
        x += 2
Задачи
Квадрат двигается справа налево

Два квадрата двигаются в противоположных направлениях:

Два квадрата двигаются в противоположных направлениях и отталкиваются от стенок синего квадрата: