Как повернуть спрайт в сторону движения в pygame (transform.rotate)?
Делаю игру с машинкой/корабликом. Спрайт нарисован смотрящим вверх, а я хочу, чтобы он поворачивался в ту сторону, куда едет. Нашёл pygame.transform.rotate, но картинка после поворота дёргается и съезжает с места. Как сделать правильно?
2 ответа
pygame.transform.rotate(img, angle) поворачивает картинку на угол в градусах (против часовой). Главная ловушка: повёрнутая картинка получается другого размера (прямоугольник вокруг неё больше), поэтому если рисовать по старым координатам — спрайт «съезжает». Лечится через выравнивание по центру.
original = pygame.image.load("ship.png").convert_alpha() # один раз
# в цикле:
rotated = pygame.transform.rotate(original, angle)
# центрируем повёрнутую картинку в точке (cx, cy)
rect = rotated.get_rect(center=(cx, cy))
screen.blit(rotated, rect)
Два важных правила:
- Поворачивай всегда оригинал (
original), а не уже повёрнутую картинку — иначе при каждом кадре качество теряется и спрайт «плывёт». - Используй
get_rect(center=...), чтобы центр оставался на месте.
Дёрганье как раз от того, что без центрирования левый-верхний угол скачет при смене размера.
Если поворачиваешь часто на одни и те же углы (например только 0/90/180/270) — поверни картинки один раз заранее и сложи в список или словарь, а в цикле просто бери готовую. Поворот не бесплатный, незачем гонять его каждый кадр, если угол не меняется.