Pygame 精灵用按键跳跃

Pygame sprite jump with pressed key

我目前正在制作 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")

遗憾的是,新代码不起作用,我不明白为什么。在过去的一周里,我做了很多研究和测试,但都没有成功。当我按下按键时播放器会跳起来,但是当它接触到地面时它不会再跳起来。

我需要松开按键并再次按下才能让玩家跳跃。 "jump is pressed" 仅在按下时打印。

期待您的帮助:)

您的代码在此处正确设置了 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 不是 None.
  2. event.type 既不是 KEYDOWN 也不是`KEYUP
  3. jump_pressed 为真,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 检查即使在没有事件被触发时也会执行。

问题可能是因为您在 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")