【问题标题】:Pygame sprite jump with pressed keyPygame精灵用按键跳跃
【发布时间】:2016-02-03 23:28:13
【问题描述】:

我目前正在制作一个 2D 平台游戏,我希望玩家精灵在接触地面并且按下跳跃键时跳跃。

我在乞讨时得到了这个,发现它没有按照我的意愿做,我使用布尔值编写了一个新代码。

原码:

if not (event == None):
        if (event.type == pygame.KEYDOWN):
            if (event.key == pygame.K_UP or event.key == pygame.K_SPACE):
                if (self.vspeed == 0):
                    self.vspeed = -(self.speed)*2

新代码:

if not (event == None):
        if(event.type == pygame.KEYDOWN):
            if (event.key == pygame.K_UP or event.key == pygame.K_SPACE):
                jump_pressed = True

        elif (event.type == pygame.KEYUP):
            if (event.key == pygame.K_UP or event.key == pygame.K_SPACE):
                jump_pressed = False

        elif (jump_pressed == True and self.vspeed == 0):
            self.vspeed = -(self.speed)*2
            print("jump is pressed")

很遗憾,新代码不起作用,我不明白为什么。在过去的一周里,我做了很多研究和测试,但没有任何成功。当我按键时玩家会跳跃,但是当它触地时它不会再次跳跃。

我需要松开按键并再次按下才能让玩家跳跃。只有当我按下时才会打印“按下跳转”。

期待您的帮助:)

【问题讨论】:

  • 不要使用event == NoneNone 进行比较,而是使用event is None(或者,在这种情况下为event is not None)。
  • 此外,Python 样式在 if 条件中避开括号。
  • 你为什么要检查if not (event == None): - 你没有for event in pygame.event.get() 自动检查吗?
  • Program Arcade Games With Python And Pygame 上更好地分析Platformer examples 的代码(在本页末尾)
  • 问题可能是因为你有最后一个eliffor event 循环内。

标签: python pygame keypress


【解决方案1】:

您的代码在此处正确设置了jump_pressed 变量:

if not (event == None):
    if(event.type == pygame.KEYDOWN):
        if (event.key == pygame.K_UP or event.key == pygame.K_SPACE):
            jump_pressed = True
    elif (event.type == pygame.KEYUP):
        if (event.key == pygame.K_UP or event.key == pygame.K_SPACE):
            jump_pressed = False

但是,这种情况

    elif (jump_pressed == True and self.vspeed == 0):
        self.vspeed = -(self.speed)*2
        print("jump is pressed")

(几乎)永远不会正确:它可以进入这种情况的唯一方法是

  1. event 不是无。
  2. event.type 既不是 KEYDOWN 也不是 `KEYUP
  3. jump_pressed 为 True,self.vspeed 为 0。

你必须把结构改成

if event is not None:
    if event.type == pygame.KEYDOWN:
        if event.key in [pygame.K_UP, pygame.K_SPACE]:
            jump_pressed = True
    elif event.type == pygame.KEYUP:
        if event.key in [pygame.K_UP, pygame.K_SPACE]:
            jump_pressed = False

if jump_pressed and self.vspeed == 0:
    self.vspeed = -(self.speed)*2
    print("jump is pressed")

这样即使没有触发事件,jump_pressed 也会执行检查。

【讨论】:

  • 感谢您的帮助。我发现了另一个问题,我在哪里引用 jump_pressed 变量?因为如果我将jump_pressed = False 设置为默认值,它会在每个刻度中设置为False。如果我不设置它,我会收到错误local variable 'jump_pressed' referenced before assignment
  • __init__ 上添加一个您设置为False 的类字段self.jump_pressed
【解决方案2】:

问题可能是因为您在 for event 循环内有最后一个 elif

你需要这样的东西:

for event in pygame.event.get():

    if event.type == pygame.KEYDOWN:
        if event.key in (pygame.K_UP, pygame.K_SPACE):
            jump_pressed = True

    elif event.type == pygame.KEYUP:
        if event.key in (pygame.K_UP, pygame.K_SPACE):
            jump_pressed = False

# after `for` loop
if jump_pressed and self.vspeed == 0:
    self.vspeed = -(self.speed)*2
    print("jump is pressed")

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多