如何在pygame中旋转图像?

2024-10-01 11:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个简单的太空游戏,想让我的飞船(xwingImg)自由移动。当a,d和s键按下时,我需要飞船旋转。我以为这会起作用:pg.变换.旋转(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()

Tags: andkeyrectimageeventifdisplaycounter
1条回答
网友
1楼 · 发布于 2024-10-01 11:31:08

pygame.transform.rotate()返回带有旋转对象的新曲面。您没有使用返回的曲面。你不想反复旋转图像,因为rotate需要填充返回的曲面,使其适合矩形。在

rotate(Surface, angle) -> Surface

Unfiltered counterclockwise rotation. The angle argument represents degrees and can be any floating point value. Negative angle amounts will rotate clockwise.

Unless rotating by 90 degree increments, the image will be padded larger to hold the new size. If the image has pixel alphas, the padded area will be transparent. Otherwise pygame will pick a color that matches the Surface colorkey or the topleft pixel value.

我只需要跟踪你的图像应该旋转的角度,然后当检测到旋转事件时改变这个角度。然后在绘图步骤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)

相关问题 更多 >