移动时图像旋转 [英] Image rotation while moving

查看:45
本文介绍了移动时图像旋转的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我在这里是因为我遇到了问题,我正在学习 pygame 但我的游戏在移动时无法改变旋转.

使用矢量没有帮助.

 类汽车(pygame.sprite.Sprite):def __init__(自我,冲浪,x,y,速度,角度):super().__init__()self.image = pygame.transform.rotate(surf, angle).convert()self.rect = self.image.get_rect(center=(x, y))自我.x = x自我.y = yself.angel=角度self.speed = 速度self.image.set_colorkey(黑色)定义更新(自我):如果 self.rect.x >800:self.rect.x=0elif self.rect.x <0:self.rect.x=800elif self.rect.y >600:self.rect.y=0elif self.rect.y <0:self.rect.y=600键 = pygame.key.get_pressed()如果键[pygame.K_w]:self.rect = self.rect.move(0, -self.speed)elif 键 [pygame.K_s]:self.rect = self.rect.move(0, self.speed)elif 键 [pygame.K_a]:self.rect = self.rect.move(-self.speed, 0)self.angel +=10elif 键 [pygame.K_d]:self.rect = self.rect.move(self.speed, 0)self.angel -=10

我想在课堂上改变图像的角度,但我不能.

解决方案

将原始(未旋转)图像存储在类中,并将汽车的位置存储在

class Car(pygame.sprite.Sprite):def __init__(自我,冲浪,x,y,速度,角度):super().__init__()self.surf = 冲浪self.surf.set_colorkey(黑色)self.pos = pygame.math.Vector2(x, y)self.angle = 角度self.speed = 速度self.image = pygame.transform.rotate(self.surf, self.angle)self.rect = self.image.get_rect(center=(x, y))定义更新(自我):键 = pygame.key.get_pressed()如果键[pygame.K_a]:self.angle -= 10elif 键 [pygame.K_d]:self.angle += 10dirvec = pygame.math.Vector2(0, self.speed).rotate(self.angle)如果键[pygame.K_w]:self.pos = self.pos - dirvecelif 键 [pygame.K_s]:self.pos = self.pos + dirvec如果 self.pos.x >800:self.pos.x = 0elif self.pos.x <0:self.pos.x = 800elif self.pos.y >600:self.pos.y = 0elif self.pos.y <0:self.pos.y = 600self.image = pygame.transform.rotate(self.surf, -self.angle)self.rect = self.image.get_rect(center = (round(self.pos.x), round(self.pos.y)))


另见

Hello I am here because I have a problem, I am learning pygame but my game cannot changes rotation while moving.

Using a vector didn't help.

 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

I want to change image's angle in my class, but I can not.

解决方案

Store the original (not rotated) image in the class and store the position of the car in a pygame.math.Vector2 object:

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

Chang the position of the car dependent on the direction. The direction vector is set by self.speed (in y direction) and has to be rotated by self.angle. Note that (.rotate()) rotates in counter clockwise direction. The y-axis points downwards, so when w is pressed, then the vector has to be subtracted and when s is pressed, then the vector has to be add to 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

Rotate the image and update the rectangle. See also 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)))


Full code of the class 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)))


See also How to turn the sprite in pygame while moving with the keys

这篇关于移动时图像旋转的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆