Python PlayerPaddle-won';不要停止旋转

Python PlayerPaddle-won';不要停止旋转,python,pygame,Python,Pygame,我试着按一次键旋转我的桨,但现在,我的左转弯()无法停止旋转我的桨,而右转弯()甚至无法启动 这就是我在游戏场景中所说的 class GameScreen(SceneBase): def __init__(self): SceneBase.__init__(self) self.player_paddle = classes.PlayerPaddle(screen_size) self.my_font = pygame.font.Sys

我试着按一次键旋转我的桨,但现在,我的左转弯()无法停止旋转我的桨,而右转弯()甚至无法启动

这就是我在游戏场景中所说的

class GameScreen(SceneBase):

    def __init__(self):
        SceneBase.__init__(self)

        self.player_paddle = classes.PlayerPaddle(screen_size)
        self.my_font = pygame.font.SysFont("Arial", 50)

    def ProcessInput(self, events, pressed_keys):
        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    self.player_paddle.direction = -1
                elif event.key == pygame.K_DOWN:
                    self.player_paddle.direction = 1      
                elif event.key == pygame.K_LEFT:
                    self.player_paddle.turnLeft()
                elif event.key == pygame.K_RIGHT:
                    self.player_paddle.turnRight()

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP and self.player_paddle.direction == -1:
                    self.player_paddle.direction = 0
                elif event.key == pygame.K_DOWN and self.player_paddle.direction == 1:
                    self.player_paddle.direction = 0

    def Update(self):
        self.player_paddle.update()
这是我的image类,PlayerPaddle从中继承

class Image(pygame.sprite.Sprite):

    def __init__(self, screen_size, color=(255,0,0)):
        super().__init__()
        self.screen_size = screen_size


        self.angle = 0
        #self.dir = 0

        self.original_image = pygame.image.load('naruto.png').convert()
        self.colorkey = self.original_image.get_at((0,0))

        self.original_image = pygame.transform.scale(self.original_image, (20, 100))
        self.rect = self.original_image.get_rect()

        self.update()


    def turnLeft(self):

        self.angle = (self.angle - 45) % 360


    def turnRight(self):
        print("entered")
        self.angle = (self.angle + 30) % 360


    def update(self):

        self.image = pygame.transform.rotate(self.original_image, self.angle).convert()
        self.image.set_colorkey(self.colorkey)


        #self.rect = self.image.get_rect(center = screen_rect.center)
        self.rect = self.image.get_rect()
        self.mask = pygame.mask.from_surface(self.image)

        self.olist = self.mask.outline()

        if self.olist:
            pygame.draw.lines(self.image, (0, 0, 0), 3, self.olist)

    def draw(self, screen):
        screen.blit(self.original_image, self.rect)
连同我的PlayerPaddle类:

class PlayerPaddle(Image):

    def __init__(self, screen_size, color = (255,0,0)):

        self.centerx = 10
        self.centery = screen_size[1] // 2

        self.height = 100
        self.width = 20

        self.speed = 3
        self.direction = 0


        super().__init__(screen_size, color = (255, 0, 0))

    def update(self):

        super().update()
        self.centery += self.direction*self.speed

        self.rect.center = (self.centerx, self.centery)

        if self.rect.top < 0:
            self.rect.top = 0

        if self.rect.bottom > self.screen_size[1]-1:
            self.rect.bottom = self.screen_size[1]-1

我相信这与您的
self.dir
变量有关。我希望一个转向函数只为它调用的每个迭代应用一个转向,而不是在调用之后更新转向值本身。让我们想想这个。您有三个函数可以转换角色。两个仅在按left或right时调用,另一个称为everysingle iteration,
character.update()

因此,如果按“左”或“右”,假设您的旋转功能正确地应用了旋转(它们没有),您将得到一个连续的旋转:

 def update(self):

    self.angle = (self.angle + self.dir) % 360
    self.image = pygame.transform.rotate(self.original_image, self.angle).convert()
现在的问题是,当你第一次调用任意一个旋转操作时,你根本不会旋转。在每个函数中,您将
角度
(实际上是您的实际旋转角度,它传递到pygame变换函数中)设置为0,然后使用
(self.angle+self.dir)%360更新它,并且由于self.dir也从零开始,因此您仍然保留零

所以在开始的时候,第一次轮换的时候,你实际上什么都不会轮换。然后你做一些奇怪的事

    self.dir -= 45
    if self.dir < 0:
        self.dir = 315
self.dir-=45
如果self.dir<0:
self.dir=315
因此,在左转的下一个事件中,您从
self.dir=315
开始,
(0+315)%360=315
,因此您只需将整个图像旋转315度。哦,现在你也将在更新函数中不断地将图像旋转315度,因为它总是被调用,并且你每次都用+
self.dir
更新
self.angle
,直到你再次按下事件键为止,它将保持315度

因此,如果您不希望这种情况持续发生,请不要在update函数中更新它

最后,如果你继续按右边的按钮,你就不会真正右转,因为你的车坏了。pygame需要反向旋转的负角度

那么你如何解决这个问题呢

  • 不要在
    update()
    函数中更新旋转以停止恒定旋转

  • 按所需方向将当前角度偏移常量值(如10或30度)。不要使用
    self.dir
    ,更改角度上的符号,并为pygame.transform.rotate计算出要旋转的正角度或负角度

  • 例如,如果要逆时针旋转,只需使用正常的正角度值,添加要使用的角度值,如果是负角度,则添加360,然后像前面一样执行%360


    如果你想按时钟旋转,从你的
    自我角度中减去你的常量值,如果它是正的,那么减去360,-360

    问题可能是因为在
    update()
    中你有

     self.angle = (self.angle + self.dir) % 360
    
    并且在每个循环中执行
    update()

    只能在
    左转
    右转
    中更改角度,而不能在
    更新()中更改角度


    顺便说一句:您不需要
    self.dir
    self.angle
    ,因为两者的作用相同

    你需要

    左转()
    “减45”

    右转()
    “加45”


    正如我在
    turnLeft
    turnRigth
    中的评论中所写,您应该只更改角度,并最终调用
    update()


    但是它似乎自动调用了
    gamesene.Update()
    所以您可能不需要调用
    Update())
    turnlight
    turnRigth

    顺便说一句:我认为你应该只使用
    self.dir
    或只使用
    self.angle
    -你不需要两者都旋转它,因为你可以在很多地方使用
    print()
    来查看变量中的值以及执行了哪部分代码-这有助于发现问题(而且你不必学习如何使用Debugger)你在
    turnLeft
    turnRight
    update()
    中有几乎相同的代码。请参阅-不要重复你自己。你应该在
    turnLeft
    turnRight
    中更改
    self.angle
    ,然后调用
    update()
    。甚至你也可以不调用
    update()
    来更改角度,因为
    GameScreen.update()
    将自动执行。我对代码进行了旋转更改,并删除了update()中的多余调用.然而,现在我的划桨从屏幕上飞走了,这很奇怪,因为我已经对边界设置了限制。我想这可能与我的自我有关。尽管有些不同,但我还是想从
    左转
    ,和
    右转
    中删除重复的代码,并将其仅保留在
    更新()
    update()
    中需要此代码。在
    左转
    右转
    中,您应该只更改
    自身角度
    而不旋转图像。我没有显示class
    场景库
    ,但我认为
    游戏场景.update()
    应该执行
    更新()
    需要时。我再次重复:如果有问题,请使用
    print()
    查看变量中的内容以及执行的代码部分-这有助于解决问题,您无需询问其他人。旋转似乎不起作用。它没有偏离中心轴旋转。相反,拨片只是左右移动。我还添加了SceneBase类。此外,我一直在使用打印语句,但ey没有帮我调试。谢谢你的帮助!你必须使用
    print()
    来显示变量中的值,然后才能查看它们是否正确。使用
    print()
    来查看它是否以正确的顺序执行函数,以及它是否执行
     self.angle = (self.angle + self.dir) % 360
    
     self.angle = (self.angle - 45) % 360
    
     self.angle = (self.angle + 45) % 360