Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали

Как показывает практика, движение — это жизнь! Поэтому сегодня мы вдохнем жизнь в сотворенный посредством Pygame объект и научим его двигаться без учета сигналов с клавиатуры! Для начала мы рассмотрим движение объекта в Pygame по прямой вдоль оси X, затем развернем объект и зададим ему движение вдоль оси Y, и в заключение — оформим диагональное перемещение объекта. Однако сначала предлагаю взглянуть на исходный код.

Исходные данные

Давайте взглянем на исходный код: у нас имеется экран csreen шириной 500px и высотой 300px, а также изображение мыши «mouse.png», расположенное на экране по заданным координатам: mouseX = 0, mouseY = 200:

import pygame

# Инициализируем pygame
pygame.init()

# Создаем экран
screen = pygame.display.set_mode((500, 300))

# Загружаем изображение мыши
mouse = pygame.image.load('mouse.png')

# Задаем начальные координаты
mouseX = 0
mouseY = 200

# Пока игровое поле открыто
while True:
    # Заливаем экран зеленым цветом
    screen.fill((70, 131, 94))
    # Определяем время задержки
    pygame.time.delay(30)

    # проверяем события pygame
    for event in pygame.event.get():
        # если активно событие QUIT
        if event.type == pygame.QUIT:
            # деактивируем pygame
            pygame.quit()
            # завершаем программу
            exit()

    # выводим мышку на экран
    screen.blit(mouse, (mouseX, mouseY))
    # обновляем экран
    pygame.display.update()

При запуске кода мы увидим в левом нижнем углу экрана притаившуюся мышку с повернутой вправо мордочкой:

движение объекта в Pygame
Вывод изображения на экран

Что будем делать?

Необходимо научить мышку двигаться непрерывно:

  • по горизонтали вдоль оси Х
  • по вертикали вдоль оси Y
  • по диагонали из левого нижнего угла в правый верхний угол

Общий принцип непрерывного движения в Pygame на примере движения вдоль оси X

В настоящий момент для вывода изображения мышки на экран мы используем цикл while (while True: ..) . То есть пока открыто игровое поле, мы осуществляем вывод изображения на экран в цикле по заданным координатам через каждые 30 мс (что определено строкой pygame.time.delay(30)).

В одной секунде содержится 1000 миллисекунд

Так как под движением в Pygame подразумевается перемещение объекта на заданную позицию через определенный промежуток времени, то для смещения мыши на 5px каждые 30 мс, нужно в цикле while увеличивать значение координаты X на 5px. Для этого добавим в исходный код всего 2 строчки: строку с определением переменной скорости speed, в которой будем хранить заданное смещение 5px расположим перед циклом while; а строку, задающее смещение изображение: mouseX += speed расположим в теле цикла while. В итоге получим зеленую поляну с мышкой, бегущей по горизонтальной прямой:

Код непрерывного движения объекта в Pygame по горизонтали:

import pygame
pygame.init()
screen = pygame.display.set_mode((500, 300))

mouse = pygame.image.load('mouse.png')
mouseX = 0
mouseY = 200

# Скорость движения объекта
speed = 5

while True:
    screen.fill((70, 131, 94))
    pygame.time.delay(30)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
    
    # Изменяем значение координаты X
    mouseX += speed

    screen.blit(mouse, (mouseX, mouseY))
    pygame.display.update()

Непрерывное движение объекта в Pygame вдоль оси Y

Для наглядности, сдвинем начальную позицию мышки ближе к центру, переопределив переменные стартовой позиции, как mouseX=200 и mouseY=200.

В соответствии с описанным выше принципом, зададим объекту движение по горизонтали, только изменять будем координату mouseY. В связи с тем, что точка с нулевыми координатами в Pygame располагается в верхнем левом углу поля, то при движении объекта вверх, значение координаты Y будет уменьшаться на заданное в переменной speed значение: Y -= speed. Однако, прежде чем мы добавим эту строчку в цикл while, предлагаю развернуть нашу мышку мордочкой вправо(т.е. на 90 градусов) с помощью функции pygame.transform.rotate(mouse, 90):

Код непрерывного движения объекта в Pygame по вертикали

import pygame
pygame.init()
screen = pygame.display.set_mode((500, 300))

mouse = pygame.image.load('mouse.png')
mouse = pygame.transform.rotate(mouse, 90)

# Определяем стартовую позицию объекта
mouseX = 200
mouseY = 200
# Задаем скорость движения объекта
speed = 5

while True:
    screen.fill((70, 131, 94))
    pygame.time.delay(30)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    # Изменяем значение координаты Y
    mouseY -= speed

    screen.blit(mouse, (mouseX, mouseY))
    pygame.display.update()

Полученный результат:

Непрерывное движение объекта по диагонали в Pygame

При движении объекта по диагонали происходит одновременное смещение как по оси X, так и по оси Y, поэтому добавим в цикл while строки с изменением значений этих координат. Так как мы планируем движение мыши из левого нижнего угла в правый верхний угол прямоугольного экрана, то:

1. Сначала повернем мышь так, чтобы ее мордочка смотрела по направлению движения. Для этого используем функцию pygame.transform.rotate(mouse, 30).

2. Затем подкорректируем стартовую позицию объекта, чтобы повернутое изображение «выезжало» точно из левого нижнего угла: moveX=-13, moveY=218.

3. После этого, в цикле while зададим смещение по оси Х на величину speed: mouseX += speed. Кроме того, определим смещение по оси Y: так как размер игровой сцены 500×300, то при движении к правому верхнему углу поля, смещение мыши по оси Y должно быть меньше горизонтального смещения примерно в 300/500 или в 3/5 раз. Таким образом, определим смещение по Y, как: mouseY -= 3/5*speed.

Посмотрим, как будет выглядеть код после внесенных в него изменений:

Код непрерывного движения объекта в Pygame по диагонали

import pygame
pygame.init()
screen = pygame.display.set_mode((500, 300))
mouse = pygame.image.load('mouse.png')

# Повернем объект на 30 градусов
mouse = pygame.transform.rotate(mouse, 30)

# Зададим стартовую позицию мыши
mouseX = -13
mouseY = 218

# Скорость движения объекта
speed = 5

while True:
    screen.fill((70, 131, 94))
    pygame.time.delay(30)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

    # Изменяем значение координаты Y
    mouseY -= speed * 3/5
    mouseX += speed

    screen.blit(mouse, (mouseX, mouseY))
    pygame.display.update()

А теперь посмотрим на получившийся результат:

У нас появился Telegram-канал для изучающих Python! Подписывайтесь по ссылке: «Кодим на Python! Вместе «питонить» веселее! 😉

Добавить комментарий