Menu
CoddyTech

Вращение вокруг центра

Часть раздела Спрайты и изображения путешествия по Pygame на Coddy. Урок 6 из 36.

Кораблю, который поворачивает, нужно повёрнутое изображение. pygame.transform.rotate(image, angle) возвращает новую Surface: изображение, повёрнутое на angle градусов против часовой стрелки. Отрицательный угол поворачивает его по часовой стрелке. Исходное изображение не меняется.

Поворачиваемый квадрат не помещается в квадрат того же размера, поэтому новая Surface больше: корабль, повёрнутый на 45 градусов, имеет размер 90 на 90 пикселей. Если вывести его в прежнем верхнем левом углу, его середина сместится вниз и вправо; при повороте корабль будет покачиваться по окну.

Вместо этого оставьте середину на прежнем месте. Запросите у повёрнутого изображения Rect, центрированный в той же точке:

rotated = pygame.transform.rotate(ship, angle)
rotated_rect = rotated.get_rect(center=(320, 240))
screen.blit(rotated, rotated_rect)

Каждый кадр поворачивайте исходный ship на весь angle. Направление корабля — это число в angle, и изображение создаётся на его основе.

challenge icon

Задание

Средне
  1. Перед циклом задайте angle = 0.
  2. При удерживании клавиши Left к angle каждый кадр прибавляется 3 (вращение против часовой стрелки); при удерживании Right от него отнимается 3.
  3. Каждый кадр поворачивайте ship на angle и рисуйте результат так, чтобы его центр находился в точке (320, 240).

Попробуйте сами

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("Turn the Ship")
clock = pygame.time.Clock()

ship = pygame.image.load("assets/images/ship.png").convert_alpha()
ship_rect = ship.get_rect(center=(320, 240))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((20, 22, 40))
    screen.blit(ship, ship_rect)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Все уроки раздела Спрайты и изображения

Потренируйтесь самостоятельно: Песочница Pygame