Я пытаюсь сделать относительно простую анимацию, требующую вращения эллипса на вращающемся фоне. Мне пришлось прибегнуть к небольшому обману, чтобы заставить pygame.transform.rotate
хорошо играть с поверхностями, которые я пытаюсь повернуть. А именно, я сделал эту функцию, которая повторно центрирует новый прямоугольник, полученный из функции вращения pygame:
def recenter(orig_rect, rotated_surf):
oldcenter = orig_rect.center
rotRect = rotated_surf.get_rect()
rotRect.center = oldcenter
screen.blit(rotated_surf, rotRect)
Функционирование не требует пояснений. Я понимаю, что исходная (не повернутая) поверхность остается на дисплее, но это не проблема. Не беспокойся об этом.
Вышеупомянутая функция используется функциями вращения (фон и эллипс) как таковые:
# width, height, screen are globals
def rotate_background(surf, speed, t0):
new_angle = ((pygame.time.get_ticks() - t0) * (speed / 1000)) % 360
w, h = surf.get_size()
blittedRect = screen.blit(surf, (width / 2 - w / 2, height / 2 - h / 2))
recenter(blittedRect, pygame.transform.rotate(surf, new_angle))
return surf
def rotate_ellipse(surf, coords, speed, t0):
new_angle = ((pygame.time.get_ticks() - t0) * (speed / 1000)) % 360
if new_angle > 90:
new_angle = 90 # limit rotation
w, h = surf.get_size()
x, y = coords
blittedRect = screen.blit(surf, (width / 2 - w / 2 + x, height / 2 - h / 2 + y))
recenter(blittedRect, pygame.transform.rotate(surf, new_angle))
Эти функции поворота вызываются по одной для каждого кадра.
Вот упрощенная версия моего основного игрового цикла. Обратите внимание, что это не фактический производственный код, но он служит иллюстрацией того, как вышеупомянутые элементы (которые взяты непосредственно из базы кода) связаны между собой:
ellipse = create_ellipse() # returns a surf
background = create_background() # returns a surf
while True:
rotate_background()
rotate_ellipse()
pygame.display.flip()
Несколько слов о переменных background
и ellipse
выше. Обе переменные содержат pygame.Surface
экземпляр, на котором нарисованы объекты. Я не буду вдаваться в подробности о background
, поскольку он работает нормально. В create_ellipse
эллипс был нарисован на поверхности ellipse
с помощью pygame.draw.ellipse
желтого цвета. До этого назывался ellipse.fill(GREEN)
. Цветовой ключ для ellipse
также был установлен на GREEN
, чтобы обеспечить прозрачность всей поверхности кроме места, где был нарисован желтый эллипс.
Проблема: я не вижу эллипса
Я закомментировал ellipse.set_colorkey
, чтобы убедиться, что эллипс отображен правильно. Это. Я вижу, как появляется зеленый прямоугольник, размер которого меняется при повороте эллипса. Это привело меня к выводу, что действительно нарисован эллипс, поскольку его можно вращать.
Что дает? Я могу предоставить полный код, если он может быть полезен. Всего около 200 строк, но я надеюсь, что моего объяснения вам хватит, ребята. Я подумал, что надо начинать локально и работать дальше =)
Большое спасибо заранее!