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

时间:2015-11-18 09:11:23

标签: python pygame 2d

我使用pygame制作一个简单的自上而下游戏,玩家和墙壁之间的移动和碰撞。

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

现在,问题是当我在移动时放开SHIFT时,我的速度不会变回3而是保持在5.但是如果我停止移动,那么移动,block_speed变回来按预期为3。似乎只有在我停止移动然后再次移动时才会发生对block_speed的任何更改。

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

如果程序正在使用此变量,如何使用SHIFT更改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)

slurp

3 个答案:

答案 0 :(得分:1)

您的问题是,当您将块速度添加到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。这可能是一个更好的解决方案。

答案 1 :(得分:0)

我遇到了同样的问题并尝试使用建议答案中的代码,但发现它对我不起作用。我的精灵仍以基本速度移动,直到钥匙被抬起。

看一下这个帖子,我尝试在事件循环之外移动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

这使我能够在按下某个键时获得速度提升效果,并在不按下时恢复到基本速度。

答案 2 :(得分:0)

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