7. Анимация

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

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

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

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

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

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

# здесь определяются константы,
# классы и функции
WHITE = (255, 255, 255)
WIN_WIDTH = 400
WIN_HEIGHT = 100
ORANGE = (255, 150, 100)
FPS = 60

# радиус будущего круга
r = 30
# координаты круга
# скрываем за левой границей
x = 0 - r
# выравнивание по центру по вертикали
y = WIN_HEIGHT // 2

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

# если надо до цикла отобразить
# какие-то объекты, обновляем экран
#display.update()

# главный цикл
while True:
    # задержка
    clock.tick(FPS)
    # цикл обработки событий
    for i in event.get():
        if i.type == QUIT:
            sys.exit()
    # --------
    # изменение объектов
    # заливаем фон
    window.fill(WHITE)
    # рисуем круг
    draw.circle(window, ORANGE,(x, y), r)
    # --------
    # обновление экрана
    display.update()
    # Если круг полностью скрылся за правой границей,
    if x >= WIN_WIDTH + r:
        # перемещаем его за левую
        x = 0 - r
    else:  # Если еще нет,на следующей итерации цикла
           # круг отобразится немного правее
        x += 2
Задачи
Квадрат двигается справа налево

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

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