PlayerPaddle不会停止旋转

时间:2017-12-05 16:48:03

标签: python pygame

我试图在按键时旋转我的球拍一次,但此刻,我的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)

与我的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

我在另一个文件中测试了我的旋转代码并且它工作得很好(一次按键是一次旋转)所以我现在迷惑为什么现在正在发生这种情况。

编辑:SceneBase类

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)

2 个答案:

答案 0 :(得分:0)

我认为这与您的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转换函数的内容)设置为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.angle更新self.dir,直到你为止再次按事件键。

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

最后,如果你继续按下右键,那么你实际上不会因为angles are always positive而向右转。 pygame需要相反旋转的负角度。

那你怎么解决这个问题?

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

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

  3. 例如,如果你想逆时针旋转它,只需使用正常的正角度值,添加你想要使用的角度的值,如果它是负的则添加360,并像之前一样做%360

    如果您想要按时钟方式旋转,请从self.angle中减去常数值,然后减去360(如果其正数)和%-360

答案 1 :(得分:0)

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

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

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

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

BTW:您不需要self.dirself.angle,因为两者都是相同的。

你宁愿需要

turnLeft()“减去45”

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

turnRight()“加上45”

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

正如我在turnLeftturnRigth的评论中写的那样,你应该只改变角度并最终调用update()

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

相关问题