无法使用 Pygame 在同一代码中旋转和移动精灵

Cannot rotate and move sprite within the same code using Pygame

我得到了制作自上而下射击游戏的作业,但每次我让我的精灵旋转时,运动线停止工作,每次我让精灵移动时,旋转线开始失败。我一生中从未使用过 Pygame 但我认为问题在于我对 self 命令缺乏理解。不要犹豫告诉我我错了多少,就像我说我以前没有接触过 Pygame 而且我只写了大约 5 个月的代码所以有可能有些行是多余的。

import pygame
import math

class Player(pygame.sprite.Sprite):

    def __init__(self,x,y):
        super().__init__()
        self.image = pygame.image.load("blue.png")
        self.movex = 0 # move along X
        self.movey = 0 # move along Y
        self.orig_img = self.image
        self.pos = pygame.math.Vector2(x,y)
        self.rect = self.image.get_rect(center=self.pos)
        self.vel = pygame.math.Vector2(0, 0)

    def update(self):
        self.rect.x = self.rect.x + self.movex
        self.rect.y = self.rect.y + self.movey
        self.rotate()
        self.pos += self.vel
        self.rect.center = self.pos

    def move(self,x,y):
        #https://opensource.com/article/17/12/game-python-moving-player - movement source
        self.movex += x
        self.movey += y

    def rotate(self):
        rel_x, rel_y = pygame.mouse.get_pos() - self.pos
        angle = -math.degrees(math.atan2(rel_y, rel_x))
        self.image = pygame.transform.rotozoom(self.orig_img, angle, 1)
        self.rect = self.image.get_rect(center=self.pos)


player = Player(200,300)
steps = 10
sprite_list = pygame.sprite.Group()
sprite_list.add(player)

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                player.move(-steps,0) 

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == ord('a'):
            player.move(steps,0)

我希望能够在同一个代码中移动和旋转,我现在不介意卡顿。对不起,如果我粘贴了太多代码,我真的不知道问题出在哪里,所以我决定提供更多信息比提供更少信息更好。

您必须更改 self.pos 而不是 self.rect,因为 self.rect 在方法 rotate():[=21= 中由 self.pos 更新]

def rotate(self):
    # [...]
    self.rect = self.image.get_rect(center=self.pos) # set self.rect by self.pos 

update() 中更新 self.pos,在调用 rotate() 之前:

class Player(pygame.sprite.Sprite):

    # [...]

    def update(self):

        #self.rect.x = self.rect.x + self.movex <--- delete
        #self.rect.y = self.rect.y + self.movey <--- delete
        self.pos = self.pos + pygame.math.Vector2(self.movex, self.movey)

        self.rotate()
        self.pos += self.vel
        self.rect.center = self.pos