Код неправильно обрабатывает события, поэтому он вращается только во время движения мыши.
Два изображения постоянно появляются, потому что они перерисовываются в основном цикле. Код рисует их в окне, затем копирует окно, поворачивает его и, наконец, перерисовывает его со смещением вправо. Таким образом, он дублирует то, что уже есть на экране, поэтому вы видите объекты в 4 раза больше.
Формулировка вашего вопроса мне не ясна на 100%, но я думаю, вы просто хотите увидеть изображение этих вращающихся объектов. Итак, первое, что нужно сделать, это создать поверхность за пределами экрана, содержащую эти изображения, и использовать ее для поворота и рисования на реальном экране:
screen = pygame.display.set_mode((400, 400), pygame.RESIZABLE)
pic = pygame.image.load("emitter_128.png")
pic2 = pygame.image.load("big_alien.png")
# Make the original surface to rotate
original_surface = pygame.Surface( ( screen.get_rect().width, screen.get_rect().height ) )
original_surface.fill( (0, 0, 0))
original_surface.blit( pic, (30, 20))
original_surface.blit( pic2, (22, 40))
Затем в основной части кода поверните original_surface
и нарисуйте его на экране.
# This creates a copy and blitz it. So there's 4, when there should be 2.
# The 2 that are not rotating should not be on the screen.
screen.fill( ( 0, 0, 50 ) )
if ( rotating ):
angle += 1
rotated_surface = pygame.transform.rotate( original_surface, angle )
rotated_surface_rect = rotated_surface.get_rect()
rotated_surface_rect.center = screen_centre
screen.blit( rotated_surface, rotated_surface_rect )
Когда квадратные растровые изображения поворачиваются, размер изменяется, поскольку результат (скажем, ромбовидная форма с углом вверх) по-прежнему должен помещаться внутри квадратного растрового изображения. Если вы просто продолжаете рисовать с одной и той же координатой, вращение выглядит шатким.
Один из способов исправить это — нарисовать повернутое растровое изображение вокруг его центра, сохраняя эту центральную точку в одном и том же месте на экране. Это приводит к тому, что растровое изображение кажется вращающимся вокруг себя (вокруг его центроида). Для этого нам нужно переместить центр растрового изображения в желаемую координату экрана. Вот почему нам нужно иметь дело с rotated_surface
Rect.
ПРИМЕЧАНИЕ. Ужасная комбинация цветов мигающего фона была выбрана, чтобы проиллюстрировать, какая часть является повернутым растровым изображением, а какая — экраном за ним.
Приносим извинения за низкую частоту кадров анимированного .GIF. Это довольно гладко на экране.
![вращающаяся вещь](https://i.stack.imgur.com/B0b2V.gif)
Код ссылки:
import pygame
pygame.init()
SURFACE = pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.RESIZABLE
screen = pygame.display.set_mode((400, 400), SURFACE )
pic1 = pygame.image.load("emitter_128.png")
pic2 = pygame.image.load("big_alien.png")
# Make the original surface to rotate
original_surface = pygame.Surface( ( screen.get_rect().width, screen.get_rect().height ) )
original_surface.fill( (0, 0, 0))
original_surface.blit( pic1, (30, 20))
original_surface.blit( pic2, (22, 40))
# We need to centre the image so the rotation looks smooth
screen_centre = ( screen.get_rect().width//2, screen.get_rect().height//2 )
angle = 1
rotating = True # used to pause rotation
running = True # used to exit
while running:
# Handle user-input
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
running = False # exit
elif ( event.type == pygame.KEYDOWN ):
rotating = not rotating # pause rotation on any key
elif ( event.type == pygame.VIDEORESIZE ):
screen = pygame.display.set_mode(event.dict['size'], SURFACE )
screen_centre = ( screen.get_rect().width//2, screen.get_rect().height//2 )
# This creates a copy and blitz it. So there's 4, when there should be 2.
# The 2 that are not rotating should not be on the screen.
# screen.fill( ( 0, 0, 50 ) ) - use for horrible background
screen.fill( ( 0, 0, 0 ) )
if ( rotating ):
angle += 1
rotated_surface = pygame.transform.rotate( original_surface, angle )
rotated_surface_rect = rotated_surface.get_rect()
rotated_surface_rect.center = screen_centre
# finally draw the rotated bitmap to the screen
screen.blit( rotated_surface, rotated_surface_rect )
# Update the window
pygame.display.flip()
pygame.display.quit()
person
Kingsley
schedule
02.07.2020