首页 > 解决方案 > pygame - 按下 event.key 上的键

问题描述

我在使用 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

标签: pythonpygame

解决方案


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

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

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

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


推荐阅读