按住键时如何移动对象?

时间:2017-12-30 16:08:38

标签: python python-3.x pygame

我知道这个问题可以看作是重复的,但我花了几个小时搜索并弄清楚我的代码出了什么问题。

我的问题是,当按下左或右键时,我的对象(称为播放器)不会一直移动:

for event in pygame.event.get():

    if event.type == QUIT:
        self.terminate()

    if event.type == KEYDOWN:
        if event.key == K_ESCAPE:
            self.terminate()
        if event.key == K_LEFT or event.key == K_a:
            self.moveRight = False
            self.moveLeft = True
        if event.key == K_RIGHT or event.key == K_d:
            self.moveLeft = False
            self.moveRight = True

    if event.type == KEYUP:
        if event.key == K_LEFT or event.key == K_a:
            self.moveLeft = False
        if event.key == K_RIGHT or event.key == K_d:
            self.moveRight = False

# Move the player around
if self.moveLeft :
    # Moves the player object to left with self.PLAYERMOVERATE pixels.
    self.player.setLeftRight(-1 * self.PLAYERMOVERATE) 


if self.moveRight :
    self.player.setLeftRight(self.PLAYERMOVERATE)

我也试过这个替代方案:

while True:
    keys = pygame.key.get_pressed() 
    if keys[pygame.K_LEFT]:
        self.player.setLeftRight(-1 * self.PLAYERMOVERATE)
    if keys[pygame.K_RIGHT]:
        self.player.setLeftRight(self.PLAYERMOVERATE)

1 个答案:

答案 0 :(得分:0)

我认为问题在于你没有在主游戏循环中处理输入。

在您的代码中,您似乎正在处理对象Player的方法内的输入。这不是应该如何处理输入。在你的第二个代码示例中,有一个while True:循环,这意味着循环永远不会退出,因此方法的执行永远不会完成。我怀疑你的第一个例子中可能存在类似的问题。

相反,你应该:

  1. 创建所有对象和类。

  2. 写下主游戏循环。

  3. 主游戏循环应该处理输入,然后处理游戏的逻辑,然后渲染任何应该渲染的内容。

    这是一个简短的代码示例。

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit() # Exit from pygame window
                quit() # End python thread
    
            if event.type == KEYDOWN:
                if event.key == K_LEFT or event.key == K_a:
                    player.moveRight = False
                    player.moveLeft = True
                if event.key == K_RIGHT or event.key == K_d:
                    player.moveLeft = False
                    player.moveRight = True
    
            if event.type == KEYUP:
                if event.key == K_LEFT or event.key == K_a:
                    player.moveLeft = False
                if event.key == K_RIGHT or event.key == K_d:
                    player.moveRight = False
    
    
        # Move player using method
        if player.moveLeft:
            # Move player
        # ...
    
    
        # Render player
    

    我希望这对您有所帮助,如果您有任何其他问题,请随时在下面的评论部分发布!