PlayerPaddle不会停止旋转



我试图在键盘上旋转一次桨,但是目前,我的turnleft()不会停止旋转桨,而我的turnright()甚至都不会开始。

这是我在GameScene中称之为此的地方。

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()

这是我的图像类,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)

与我的玩家类别类别:

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

我在另一个文件中测试了我的旋转代码,它运行得很好(一个键是一个旋转),因此我目前对为什么现在会发生这种情况感到困惑。

编辑:scenebase class

class SceneBase:
    number_of_players = None
    is_game_over = False 
    third_player_mode = None 
    def __init__(self):
        self.next = self
    def ProcessInput(self, events, pressed_keys):
        pass
    def Update(self):
        pass
    def Render(self, screen):
        pass
    def SwitchToScene(self, next_scene):
        self.next = next_scene
    def Terminate(self):
        self.SwitchToScene(None)

我相信这与您的self.dir变量有关。我希望转弯功能简单地为其所调用的每个迭代应用一个转弯,而不是在病房后更新转弯值本身。让我们考虑一下。您具有将转动角色的三个函数。仅当您按向左或向右时,只有两个,一个被称为 everysingle迭代的 character.update()

因此,如果您的左或向右按下,假设您的轮回功能适当地施加旋转(他们没有),那么您只需连续旋转:

 def update(self):
    self.angle = (self.angle + self.dir) % 360
    self.image = pygame.transform.rotate(self.original_image, self.angle).convert()

现在的问题是,当您第一次致电时,无论哪种转弯操作,您都不会旋转。在每个函数中,您将angle设置(实际上是您的真实旋转角度,它将其传递到PyGame Transform函数)为0,然后使用(self.angle + self.dir) % 360更新它,并且由于Self.dir也以零开始,您再次将零...

因此,在开始时,回合事件的第一例,您实际上不会转动任何东西。那你做一些奇怪的事情...

    self.dir -= 45
    if self.dir < 0:
        self.dir = 315

因此,您在下一个事件中以self.dir = 315开始左转,左转,(0 + 315) % 360 = 315,因此您只是旋转了整个图像315度。哦,现在您也将在更新功能中不断将图像旋转315度,因为它总是被调用,并且您每次都会使用 self.dir更新self.angle,直到您再次按事件键为止,它将保持315。

因此,如果您不希望这种情况不断发生,请不要在更新功能中进行更新。

最后,如果您继续按下右键,那么您实际上不会向右转,因为您的角度始终是积极的。pygame需要对相反旋转的负角度。

那么如何修复此操作?

  1. 不要更新update()功能中的旋转以停止常量旋转

  2. 在您想要的方向上,将当前角度偏移到常数值(例如10或30度)。不要使用 self.dir,在角度上更改符号,然后找出旋转到pygame.transform.rotate的正角或负角度。

,例如,如果要旋转它的计数时钟明智,只需使用正常的正角值,添加要使用的角度的值,请添加360,如果其为负,则添加%360,例如

之前

如果您想明智地旋转时钟,请从 self.angle中减去常数值,然后减去360,如果是正值,则%-360

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

 self.angle = (self.angle + self.dir) % 360

update()在每个循环中执行。

您应该仅在turnLeftturnRight中更改角度,而不是update()


btw:您不需要self.dirself.angle,因为两者都这样做。

您宁愿

turnLeft()" MINUS 45"

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

turnRight()" Plus 45"

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

正如我在turnLeftturnRigth中评论中所写的那样,您只能更改角度,最终致电update()

但似乎GameScene.Update()自动调用update(),因此您可能无需在turnLeftturnRigth中调用update()

最新更新