Pygame 旋转给出奇怪的运动

问题描述 投票:0回答:1

我一直在尝试为我正在创建的受太空侵略者启发的游戏添加一个功能,在该游戏中我旋转一个向上发射子弹的玩家。播放器使用 w 和 d 键左右移动,但是当尝试使用 LEFT 和 RIGHT 键旋转它时,它会做这种奇怪的圆周运动然后以另一种方式弹回:

[View this gif to see the movement I mean

代码如下:

import pygame
import os

clock = pygame.time.Clock()

#standard variables for universal operation
WIDTH = 610
HEIGHT = 760
WIN = pygame.display.set_mode((WIDTH,HEIGHT))
FPS = 60

BORDER = pygame.Rect(0,720,WIDTH,4)

BLACK = (0,0,0)
WHITE = (255,255,255)
GREEN = (0,200,0) #slightly darker green

PLAYER_IMG = pygame.image.load(os.path.join('src', 'player.png'))
PLAYER_VEL = 5
PLAYER_WIDTH = 36
PLAYER_HEIGHT = 22
INIT_PLAYER_ANGLE = 0
ANGULAR_VEL = 5

BULLET_VEL = 7
MAX_BULLETS = 3
BULLET_WIDTH = 3
BULLET_HEIGHT = 8

def move_player(player, angle):

    #rotation
    keys_pressed = pygame.key.get_pressed()
    if keys_pressed[pygame.K_LEFT]:# and (angle >= -45):
        angle -= ANGULAR_VEL
    if keys_pressed[pygame.K_RIGHT]:# and (angle <= 45):
        angle += ANGULAR_VEL

    rotated = pygame.transform.rotate(PLAYER_IMG,angle)
    player = rotated.get_rect(center=player.center)
    #linear translation
    keys_pressed = pygame.key.get_pressed()
    if (player.x <= WIDTH - 37) and (keys_pressed[pygame.K_d]):
        player.x += PLAYER_VEL
    if (player.x >= 0) and (keys_pressed[pygame.K_a]):
        player.x -= PLAYER_VEL

    return player, angle

def fire_bullet(bullets, player):
    for bullet in bullets:
        bullet.y -= BULLET_VEL

def window(player,bullets,angle):
    WIN.fill(BLACK) #background
    pygame.draw.rect(WIN,GREEN,BORDER) #seperation between game and lower info block
    WIN.blit(PLAYER_IMG,(player.x,player.y)) #player
    for bullet in bullets:
        pygame.draw.rect(WIN,GREEN,bullet) #bullets
    pygame.display.update()

def main():
    player = pygame.Rect(WIDTH/2-PLAYER_WIDTH/2,685,PLAYER_WIDTH,PLAYER_HEIGHT)
    bullets = []
    angle = INIT_PLAYER_ANGLE

    running = True
    while running: #main game loop
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False #breaks loop if window is shut by user

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE:
                    bullet = pygame.Rect(player.x+PLAYER_WIDTH/2-BULLET_WIDTH/2,player.y+BULLET_HEIGHT,BULLET_WIDTH,BULLET_HEIGHT)
                    bullets.append(bullet)
                
        fire_bullet(bullets,player)
        player, angle = move_player(player,angle)
        window(player,bullets,angle)

    pygame.quit()

if __name__ == "__main__":
    main()
python pygame image-rotation
1个回答
0
投票

看起来你旋转了图像,但仍然将未旋转的图像传送到屏幕上。所以确保你的

window()
使用旋转的。还要将旋转后的图像从
move_player()
函数传递到
window()
中的
main()
,因为它是在那里创建的。最终更新
move_player()
以返回旋转的图像,这应该可以解决您的问题。


def move_player(player, angle):
    keys_pressed = pygame.key.get_pressed()
    if keys_pressed[pygame.K_LEFT]:# and (angle >= -45):
        angle -= ANGULAR_VEL
    if keys_pressed[pygame.K_RIGHT]:# and (angle <= 45):
        angle += ANGULAR_VEL

    rotated = pygame.transform.rotate(PLAYER_IMG,angle)
    player = rotated.get_rect(center=player.center)
    ...

    return player, angle, rotated

def window(player,bullets,angle,rotated_image):
    WIN.fill(BLACK)
    pygame.draw.rect(WIN,GREEN,BORDER) 
    WIN.blit(rotated_image,(player.x,player.y))
    for bullet in bullets:
        pygame.draw.rect(WIN,GREEN,bullet) 
    pygame.display.update()

def main():
    ...

    while running: #main game loop
        ...

        player, angle, rotated = move_player(player,angle)
        window(player,bullets,angle,rotated)

    pygame.quit()
© www.soinside.com 2019 - 2024. All rights reserved.