python - 移动时图像旋转

标签 python python-3.x pygame

你好,我来这里是因为我有一个问题,我正在学习pygame,但我的游戏无法在移动时改变旋转。

使用向量没有帮助。

 class Car(pygame.sprite.Sprite):
    def __init__(self, surf, x, y, speed, angle):
        super().__init__()
        self.image = pygame.transform.rotate(surf, angle).convert()
        self.rect = self.image.get_rect(center=(x, y))
        self.x = x
        self.y = y
        self.angel=angle
        self.speed = speed
        self.image.set_colorkey(black)
    def update(self):
        if self.rect.x  > 800:
            self.rect.x=0
        elif self.rect.x <0:
            self.rect.x=800
        elif self.rect.y > 600:
            self.rect.y=0
        elif self.rect.y <0:
            self.rect.y=600
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w]:
            self.rect = self.rect.move(0, -self.speed)
        elif keys[pygame.K_s]:
            self.rect = self.rect.move(0, self.speed)
        elif keys[pygame.K_a]:
            self.rect = self.rect.move(-self.speed, 0)
            self.angel +=10
        elif keys[pygame.K_d]:
            self.rect = self.rect.move(self.speed, 0)
            self.angel -=10

我想在类里面改变图像的角度,但我不能。

最佳答案

将原始(未旋转)图像存储在类中,并将汽车的位置存储在 pygame.math.Vector2 中对象:

def __init__(self, surf, x, y, speed, angle):
    # [...]
    self.surf = surf.convert()
    self.surf.set_colorkey(black)
    self.pos = pygame.math.Vector2(x, y)
    # [...]

根据方向更改汽车的位置。方向向量由 self.speed 设置(在 y 方向),并且必须按 self.angle 旋转。请注意,( .rotate() ) 以逆时针方向旋转。 y 轴指向下方,因此当按下 w 时,必须减去向量,而当按下 s 时,则必须将向量添加到 self.pos:

def update(self):
 
    # [...]

    dirvec = pygame.math.Vector2(0, self.speed).rotate(self.angle)

    if keys[pygame.K_w]:
        self.pos = self.pos - dirvec
    elif keys[pygame.K_s]:
        self.pos = self.pos + dirvec

旋转图像并更新矩形。另请参阅How do I rotate an image around its center using Pygame? :

def update(self):

    # [...]

    self.image = pygame.transform.rotate(self.surf, -self.angle)
    self.rect  = self.image.get_rect(center = (round(self.pos.x), round(self.pos.y)))

Car的完整代码:

class Car(pygame.sprite.Sprite):
    def __init__(self, surf, x, y, speed, angle):
        super().__init__()     
        self.surf = surf
        self.surf.set_colorkey(black)
        self.pos = pygame.math.Vector2(x, y)
        self.angle = angle
        self.speed = speed
        self.image = pygame.transform.rotate(self.surf, self.angle)
        self.rect  = self.image.get_rect(center=(x, y))

    def update(self):

        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:
            self.angle -= 10
        elif keys[pygame.K_d]:
            self.angle += 10

        dirvec = pygame.math.Vector2(0, self.speed).rotate(self.angle)
        if keys[pygame.K_w]:
            self.pos = self.pos - dirvec
        elif keys[pygame.K_s]:
            self.pos = self.pos + dirvec

        if self.pos.x > 800:
            self.pos.x = 0
        elif self.pos.x < 0:
            self.pos.x = 800
        elif self.pos.y > 600:
            self.pos.y = 0
        elif self.pos.y < 0:
            self.pos.y = 600

        self.image = pygame.transform.rotate(self.surf, -self.angle)
        self.rect  = self.image.get_rect(center = (round(self.pos.x), round(self.pos.y)))

另请参阅How to turn the sprite in pygame while moving with the keys

repl.it/@Rabbid76/PyGame-CarMovement

关于python - 移动时图像旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57226587/

相关文章:

android - 安卓上的Python

python - 从python中的字符串中删除空格

python - 为什么从串联列表创建集合比使用 `.update` 更快?

python - Apache Cassandra 中的无效字符串常量错误(使用 Python)

python - pygame 不显示我的图像

python - Pygame 碰撞检测无法按我想要的方式工作

python - 如何裁剪 Keras 中图层返回的值?

python - 如何在 Python 中逐行打印字典?

python - 在 sqlalchemy、数据库、ORM 中使用标签

python - ModuleNotFoundError 即使 __init.py__ 存在