【问题标题】:Can I alter a pygame object's constant movement direction through a keypress?我可以通过按键更改 pygame 对象的恒定移动方向吗?
【发布时间】:2020-08-28 18:05:38
【问题描述】:

我正在 pygame 中创建一个蛇游戏。基本上,我希望我的蛇对象始终在不断移动。

但是,我希望能够在按键时更改该对象的移动方向。

现在,我可以移动对象,但我必须按住一个键,或者按住那个键。这不是一个持续的运动。

我的目标是让蛇形对象始终向一个方向移动,并且只需按一下键即可改变它的移动方向。这可能吗?

这是我的目标代码:

class Snake:
    def __init__(self, block_size, surface, x_loc, y_loc):
        self.block_size = block_size
        self.surface = surface # red
        self.x_loc = x_loc
        self.y_loc = y_loc
             
    def draw(self, window):
        window.blit(self.surface, (self.x_loc, self.y_loc))

    def collide(self, obj):
        pass

    def move_x_left(self, surface, x_loc, y_loc):
        window.blit(surface, (self.x_loc, self.y_loc))
        self.x_loc -= 20

    def move_y_up(self, surface, x_loc, y_loc):
        window.blit(surface, (self.x_loc, self.y_loc))
        self.y_loc -= 20

    def move_x_right(self, surface, x_loc, y_loc):
        window.blit(surface, (self.x_loc, self.y_loc))
        self.x_loc += 20

    def move_y_down(self, surface, x_loc, y_loc):
        window.blit(surface, (self.x_loc, self.y_loc))
        self.y_loc += 20

这是我的 main 函数中的游戏循环

  while game_running:

        snake.draw(window)

        redraw_window()

        clock.tick(FPS) # tick the clock based on our FPS rate. 

        # snake.move_y_down(mask, snake.x_loc, snake.y_loc)

        for event in pygame.event.get(): # if we hit "x" to close out the game, close out the game.
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
        keys = pygame.key.get_pressed()

        if keys[pygame.K_RIGHT]: 
            snake.move_x_right(mask, snake.x_loc, snake.y_loc)

        if keys[pygame.K_LEFT]:
            snake.move_x_left(mask, snake.x_loc, snake.y_loc)

        if keys[pygame.K_DOWN]:
                snake.move_y_down(mask, snake.x_loc, snake.y_loc)

        if keys[pygame.K_UP]:
                snake.move_y_up(mask, snake.x_loc, snake.y_loc)

FPS 速率为 60。仍然不确定如何/是否正确实施,但无论如何它可能与这个问题无关。

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    您可以创建一个变量来跟踪蛇的移动方向并继续朝该方向移动。

    将方向变量添加到蛇类

    class Snake:
        def __init__(self, block_size, surface, x_loc, y_loc):
            # omited code
            self.direction = None
    

    检查按键并相应地设置变量:

    # SET A CERTAIN DIRECTION IF A CERTAIN KEY IS PRESSED
        if keys[pygame.K_RIGHT]:
            snake.direction = "right"
        if keys[pygame.K_LEFT]:
            snake.direction = "left"            
        if keys[pygame.K_DOWN]:
            snake.direction = "down"
        if keys[pygame.K_UP]:
            snake.direction = "up"
    

    然后每帧都朝那个方向移动

     # MOVE ACCORDING TO DIRECTION
            if snake.direction == "right":
                snake.move_x_right(mask, snake.x_loc, snake.y_loc)
            if snake.direction == "left":
                snake.move_x_left(mask, snake.x_loc, snake.y_loc)
            if snake.direction == "down":
                snake.move_y_down(mask, snake.x_loc, snake.y_loc)
            if snake.direction == "up":
                snake.move_y_up(mask, snake.x_loc, snake.y_loc)
    

    重写代码:

    while game_running:
    
        snake.draw(window)
    
        for event in pygame.event.get(): # if we hit "x" to close out the game, close out the game.
            if event.type == pygame.QUIT:
                pygame.quit()
                exit()
        keys = pygame.key.get_pressed()
    
        if snake.direction == "right":
            snake.move_x_right(mask, snake.x_loc, snake.y_loc)
        if snake.direction == "left":
            snake.move_x_left(mask, snake.x_loc, snake.y_loc)
        if snake.direction == "down":
            snake.move_y_down(mask, snake.x_loc, snake.y_loc)
        if snake.direction == "up":
            snake.move_y_up(mask, snake.x_loc, snake.y_loc)
            
    
        if keys[pygame.K_RIGHT]:
            snake.direction = "right"
    
        if keys[pygame.K_LEFT]:
            snake.direction = "left"
            snake.move_x_left(mask, snake.x_loc, snake.y_loc)
            
        if keys[pygame.K_DOWN]:
            snake.direction = "down"
    
        if keys[pygame.K_UP]:
            snake.direction = "up"
    

    我无法测试这段代码,因为我没有你的其余代码,但你明白了。

    【讨论】:

      【解决方案2】:

      您可以通过定义一个可以在每个游戏时间点上运行的函数来做到这一点

      def move_snake:
          speed = 20
          window.blit(surface, (self.x_loc, self.y_loc))
          self.x_loc += speed * x_heading        
          self.y_loc += speed * y_heading     
      

      然后,您可以在每次向上或向下按键时将 y 的标题更改为 0,并将 x 更改为 1 或 -1,反之亦然。

      如果您的游戏节拍与您的 fps 相关联,您可能需要更正速度以反映您的游戏场景。 :)

      编辑: 您可以将速度和航向定义为蛇本身的属性,以便更好地对代码进行分组。

      【讨论】:

        猜你喜欢
        • 2013-11-17
        • 2017-07-29
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多