【问题标题】:pygame - Unpress key on event.keypygame - 按下 event.key 上的键
【发布时间】:2018-07-24 20:35:19
【问题描述】:

我在使用 pyGame 时遇到问题(此处为新手)。我用 event.key 练习,想解开/切断连续按下的键。我试图用谷歌搜索它并检查了这个网站,但这并没有导致有希望的结果。整件事发生在

if event.key == pygame.K_UP and isJumping == False:

(第 49 - 55 行)

## HOW TO UNPRESS K_UP IN CASE IT WAS PRESSED AND NOT RELEASED?
    if event.key == pygame.K_UP and isJumping == False:
        yChange -= 10
        isJumping = True

    elif event.key == pygame.K_UP and isJumping == True:
        print("X")

如果按下向上箭头一次,这工作得很好,但会继续在循环中执行 yChange,以防它没有被释放 - 这当然是根本不需要的。你能帮我解决这个问题吗?

import pygame

pygame.init() # Initialize pyGame module

# Set screen dimensions
screenW = 800
screenH = 600

# Set color
AQUA = (155, 255, 255)

# Set FPS
FPS = 60
fpsClock = pygame.time.Clock()

# Set character
mainChar = pygame.image.load('p1_front.png')
mainCharX = screenH / 2 # char X position
mainCharY = screenW / 2 # char Y position
isJumping = False
xChange = 0
yChange = 0
MOVSPEED = 1
# Set backgrounds
mainBg = pygame.image.load('bg_castle.png')
mainBg = pygame.transform.scale(mainBg, (screenW, screenH))

# Set the window, param in a tuple is width / height
DISPLAYSURF = pygame.display.set_mode((screenW, screenH))
# Set window name (game title)
pygame.display.set_caption("Newbie training")

while True: # Main loop of the game
#set BG
DISPLAYSURF.blit(mainBg, (0,0))

# Events loop below
for event in pygame.event.get():
    if event.type == pygame.QUIT: # Quit window when [x] is pressed
        pygame.quit()
        exit()

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_RIGHT:
            xChange += MOVSPEED
        elif event.key == pygame.K_LEFT:
            xChange -= MOVSPEED

        ## HOW TO UNPRESS K_UP IN CASE IT WAS PRESSED AND NOT RELEASED?
        if event.key == pygame.K_UP and isJumping == False:
            yChange -= 10
            isJumping = True

        elif event.key == pygame.K_UP and isJumping == True:
            print("X")



    if event.type == pygame.KEYUP:
        if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
            xChange = 0
        if event.key == pygame.K_UP:
            yChange = 0
    #print(event)

mainCharX += xChange
mainCharY += yChange
DISPLAYSURF.blit(mainChar, (mainCharX, mainCharY)) # Load character
pygame.display.update() #update window
fpsClock.tick(FPS) # FPS goes always after update

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    如果您只希望玩家每次向上按下能够跳跃 10 个“单位”然后停在原地,您可以在将其添加到 mainCharY 后将每帧的 yChange 设置为 0。

    但是,如果您正在寻找更强大的跳跃系统(按下按钮,玩家向上移动几帧,然后停止并回落),则需要更多。

    给你一个想法:如果你在每一帧的末尾有一些逻辑来检查 mainCharY > 0(玩家不在地上),如果是,从 yChange 中减去一些数字(好像重力在拉他们下来)?

    在上述情况下,您的代码应避免重复上按问题。仅测试 (mainCharY > 0) 而不是使用 isJumping 变量可能更容易。

    【讨论】:

      【解决方案2】:

      您似乎误解了事件队列和事件循环的工作方式。当您按下一个键时,一个 pygame.KEYDOWN 事件会添加到事件队列中。调用 pygame.event.get 会清空事件队列并将所有事件放入一个列表中,您可以使用 for 循环对其进行迭代:for event in pygame.event.get():。这意味着 pygame 不知道您仍然按住键,它只会看到您按了一次 UP。它还会注意到您释放密钥并将pygame.KEYUP 事件添加到队列中。

      在您的情况下,当您按下 UP 键时,您将 yChange 变量减少到 -10。在 while 循环中,mainCharY 每帧将递减-10,角色将向上移动。只要您松开按键,yChange 就会重置为 0,并且玩家角色会停止。

      if event.type == pygame.KEYUP:
          if event.key == pygame.K_UP:
              yChange = 0
      

      要在您的游戏中实现跳跃,您应该添加一个 GRAVITY 常数,将其添加到每帧的 y 速度以向下加速。当角色接触地面时,将 y-velocity 设置为 0 并将变量(on_ground 或类似的东西)设置为True,这样你就知道玩家可以跳跃了。当玩家按下跳跃键时,您可以将 y-velocity 设置为负值,精灵将开始向上移动,直到 GRAVITY 再次将他拉下。这是complete example

      【讨论】:

        【解决方案3】:

        我认为 pygame 根本不可能错过关键事件。

        我认为问题在于您没有在任何地方将 isJumping 设置为 false,这会在第一次按下后永远停止更改 yChange。如果我的解释正确,下面的代码应该可以工作:

        if event.type == pygame.KEYDOWN:
            ...  # Your other code
        
            if event.key == pygame.K_UP and not isJumping:  # "== False" is not necessary
                yChange -= 10
                isJumping = True
        
        
        if event.type == pygame.KEYUP:
            ...  # Your other code
        
            if event.key == pygame.K_UP and isJumping:
                yChange = 0
                isJumping = False  # <-- This is the addition to the code
        

        要记住的一点是,这种跳跃系统看起来不太自然。请查看@SamHolloway 的答案以获得更多说明。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-12
          • 2020-05-06
          • 2021-09-04
          相关资源
          最近更新 更多