Как я могу повернуть свое изображение в Pygame?
Я делаю простую космическую игру и хочу, чтобы мой корабль (xwingImg) двигался свободно. Мне нужно, чтобы корабль вращался при нажатии клавиш a,d и s. Я думал, что это будет работать: pg.transform.rotate(xwingImg, 90), но, похоже, ничего не изменится.
import sys
import random
import pygame as pg
pg.init()
screen = pg.display.set_mode((1280, 800))
display_width = 1280
display_height= 800
black= (0,0,0)
white= (255,255,255)
red = (255,0,0)
blue_violet = (138,43,226)
xwingImg = pg.image.load('X-Wing.bmp').convert()
tieImg= pg.image.load('tiefighter.png').convert()
space=pg.image.load('space.jpg').convert()
BG_image = pg.image.load('space.jpg').convert()
def main():
clock = pg.time.Clock()
# Surfaces/images have a `get_rect` method which
# returns a rect with the dimensions of the image.
player_rect = xwingImg.get_rect()
player_rect.center = ( 640,400 )
change_x = 0
change_y = 0
enemies = []
spawn_counter = 30
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
if event.type == pg.KEYDOWN:
if event.key == pg.K_d:
pg.transform.rotate(xwingImg, 90)
change_x = 5
if event.key == pg.K_w:
change_y = -5
if event.key == pg.K_s:
change_y= 5
if event.key == pg.K_a:
change_x = -5
if event.type == pg.KEYUP:
if event.key == pg.K_d and change_x > 0:
change_x = 0
if event.key == pg.K_a and change_x < 0:
change_x = 0
if event.key == pg.K_w and change_y<0:
change_y=0
if event.key == pg.K_s and change_y>0:
change_y=0
# Spawn enemies if counter <= 0 then reset it.
spawn_counter -= 1
if spawn_counter <= 0:
# Append an enemy rect. You can pass the position directly as an argument.
enemies.append(tieImg.get_rect(topleft=(random.randrange(1280), -800 )))
spawn_counter = 30
# Update player_rect and enemies.
player_rect.x += change_x
player_rect.y += change_y
for enemy_rect in enemies:
enemy_rect.y += 5
# Collision detection with pygame.Rect.colliderect.
if player_rect.colliderect(enemy_rect):
print('Collision!')
# Draw everything.
screen.blit(BG_image, (0,0))
for enemy_rect in enemies:
screen.blit(tieImg, enemy_rect)
screen.blit(xwingImg, player_rect)
if player_rect.x >display_width:
player_rect.x = 0
if player_rect.x < 0:
player_rect.x= 1280
if player_rect.y>display_height:
player_rect.y = 0
if player_rect.y < 0:
player_rect.y= 800
pg.display.flip()
clock.tick(40)
if __name__ == '__main__':
main()
pg.quit()
sys.exit()
1 ответ
pygame.transform.rotate() возвращает новую поверхность с повернутым объектом. Вы не используете возвращенную поверхность. Вы не хотите продолжать вращать изображение несколько раз, так как поворот должен дополнить возвращаемую поверхность, чтобы она поместилась в прямоугольнике.
поворот (поверхность, угол) -> поверхность
Нефильтрованное вращение против часовой стрелки. Аргумент угла представляет градусы и может быть любым значением с плавающей точкой. Отрицательные значения угла будут вращаться по часовой стрелке.
Если изображение не будет поворачиваться на 90 градусов, изображение будет дополнено большим, чтобы сохранить новый размер. Если изображение имеет пиксельные альфа-области, область дополнения будет прозрачной. В противном случае pygame выберет цвет, соответствующий цветовой клавише Surface или значению пикселя верхнего слоя.
Я бы просто отслеживал угол поворота вашего изображения, а затем, когда обнаруживается событие поворота, измените этот угол. Тогда на вашем этапе розыгрыша blit
повернуть изображение на этот угол.
player_image = pg.transform.rotate(xwingImg, angle)
player_rect = player_image.get_rect()
player_rect.center = player_pos
screen.blit(player_image, player_rect)