PlayerPaddle不会停止旋转

2024-04-23 19:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着按一次键来旋转我的桨,但是现在,我的turnlight()无法停止旋转我的桨,而turnRight()甚至无法启动。你知道吗

这就是我在游戏场景中所说的。你知道吗

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

我在另一个文件中测试了我的旋转代码,它运行得非常好(一次按键就是一次旋转),所以我现在很困惑为什么现在会发生这种情况。你知道吗

编辑:场景库类

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)

Tags: keyrectimageselfeventsizeifinit
2条回答

我相信这与self.dir变量有关。我希望一个turning函数只为它调用的每个迭代应用一个turn,而不是在wards之后更新turn值本身。让我们想想这个。你有三个可以改变角色的函数。两个仅在按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()

现在的问题是,当你第一次调用任何一个转弯操作时,你根本不会旋转。在每个函数中,您将angle(这实际上是您的实际旋转角度,它传递到pygame变换函数中的值)设置为0,然后用(self.angle + self.dir) % 360更新它自我目录同样从零开始,你又剩下零。。。你知道吗

所以在开始的时候,第一次轮到你的时候,你不会真的轮到任何东西。然后你做一些奇怪的事。。。你知道吗

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

所以,你从self.dir = 315开始,在下一个事件中,左转,(0 + 315) % 360 = 315,所以你把整个图像旋转了315度。哦,现在你也将在update函数中不断地将图像旋转315度,因为它总是被调用的,并且你每次都用+self.dir更新self.angle,直到你再次按下事件键,这个值保持315度。你知道吗

因此,如果不希望这种情况经常发生,就不要在update函数中更新它。你知道吗

最后,如果你继续按右边的按钮,你实际上不会右转,因为你的angles are always positive。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()中更改


顺便说一句:你不需要self.dirself.angle,因为两者都是一样的。你知道吗

你需要

turnLeft()“减45”

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

turnRight()“加45”

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

正如我在turnLeftturnRigth的评论中所写,您应该只改变角度,并最终调用update()。你知道吗

但似乎GameScene.Update()会自动调用update(),所以您可能不需要在turnLeftturnRigth中调用update()。你知道吗

相关问题 更多 >