pygame - 如何在使用变量时更改它?

pygame - How do I change a variable while it is being used?

我正在使用 pygame.

制作一个简单的自上而下游戏,其中包含玩家与墙壁之间的移动和碰撞

我编写了我的代码,以便当 keys[pygame.K_LSHIFT]pygame.key.get_pressed 期间处于 True 时在键盘状态下被调用时, block_speed 变为 5 而不是3. 所以它起作用了,当我按住 SHIFT 键并同时使用 WASD 键移动时,我的速度变为 5.

现在,问题是当我在移动时松开 SHIFT,我的速度没有变回 3,而是保持在 5。但是如果我停止移动,然后移动,block_speed 变回达到预期的 3。似乎 block_speed 的任何更改只发生在我停止移动然后再次移动时。

我猜它只会在 block_speed 的当前副本被使用后才会收到 block_speed 的新值。

程序正在使用此变量时,如何使用 SHIFT 更改 block_speed

def run(self):

    pygame.init()
    pygame.display.set_caption("Platformer v1")

    block_speed = 3

    sprite_list = pygame.sprite.Group()
    wall_list = pygame.sprite.Group()

    left_wall = Wall(0,0,10,resolution[1])
    wall_list.add(left_wall)
    sprite_list.add(left_wall)

    top_wall = Wall(10,0,resolution[0]-10,10)
    wall_list.add(top_wall)
    sprite_list.add(top_wall)

    test_wall = Wall(10,150,200,10)
    wall_list.add(test_wall)
    sprite_list.add(test_wall)

    player = Player(50,50)
    player.walls = wall_list
    sprite_list.add(player)

    while True:

        self.screen.fill(black)

        keys = pygame.key.get_pressed()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return False

            if keys[pygame.K_LSHIFT]:
                block_speed = 5
            else:
                block_speed = 3

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_d:
                    player.change_x += block_speed
                elif event.key == pygame.K_a:
                    player.change_x += -block_speed
                elif event.key == pygame.K_w:
                    player.change_y += -block_speed
                elif event.key == pygame.K_s:
                    player.change_y += block_speed

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_d or event.key == pygame.K_a:
                    player.change_x = 0
                elif event.key == pygame.K_w or event.key == pygame.K_s:
                    player.change_y = 0


        sprite_list.update()
        sprite_list.draw(self.screen)

        pygame.display.update()
        self.clock.tick(FPS)

您的问题是,当您将块速度添加到 player.change_x/change_y 时,它会在那时执行该计算。之后更改变量不会有什么不同。

针对您的情况的一个简单解决方案是在使用之前简单地对 block_speed 进行更改。如果这样做,block_speed 在更改其他变量时具有您想要的值,从而为您提供所需的结果。

编辑:我意识到还有另一个问题 - 也就是说,如果新按下键(事件被触发),你只会改变移动速度,所以改变方块速度仍然不会改变速度,除非一个方向键被按下。解决办法是每次都计算,不管。

keys = pygame.key.get_pressed()
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        return False

    if keys[pygame.K_LSHIFT]:
        block_speed = 5
    else:
        block_speed = 3

    if keys[pygame.K_d]:
        player.change_x += block_speed
    if keys[pygame.K_a]:
        player.change_x += -block_speed
    if keys[pygame.K_w]:
        player.change_y += -block_speed
    if keys[pygame.K_s]:
        player.change_y += block_speed

    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_d or event.key == pygame.K_a:
            player.change_x = 0
        elif event.key == pygame.K_w or event.key == pygame.K_s:
            player.change_y = 0

另一种方法是在按下某个键时存储方向,然后将其乘以每帧移动时的速度:

    keys = pygame.key.get_pressed()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            return False

        if keys[pygame.K_LSHIFT]:
            player.block_speed = 5
        else:
            player.block_speed = 3

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_d:
                player.change_x += 1
            elif event.key == pygame.K_a:
                player.change_x -= 1
            elif event.key == pygame.K_w:
                player.change_y -= 1
            elif event.key == pygame.K_s:
                player.change_y += 1

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_d or event.key == pygame.K_a:
                player.change_x = 0
            elif event.key == pygame.K_w or event.key == pygame.K_s:
                player.change_y = 0

然后在您的位置代码中执行 self.rect.x += self.change_x * self.block_speed。这可能是一个更好的解决方案。

我遇到了同样的问题并尝试使用建议答案中的代码,但发现它对我不起作用。在按下一个键之前,我的精灵仍然以基本速度移动。

查看此线程,我尝试将 get_pressed() 键检测移到事件循环之外,这解决了问题。

keys = pygame.key.get_pressed()
if keys[pygame.K_LSHIFT]:
    player.block_speed = 5
else:
    player.block_speed = 3

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        return False

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_d:
            player.change_x += 1
        #etc.

    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_d or event.key == pygame.K_a:
            player.change_x = 0
        #etc.

如上述答案,在您的位置代码中有 self.rect.x += self.change_x * self.block_speed.

这让我在按住某个键时获得速度提升效果,而在未按下时恢复到基本速度。

import pygame
running = True
while running:
   for event in pygame.event.get():
       #K_UP mean releasing the key
       if event.type == pygame.K_UP:
           if event.key == pygame.K_LSHIFT:
              block_speed = 3