Skip to main content
 首页 » 编程设计

python之pygame之在 event.key 上取消按键

2025年05月04日21小虾米

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

请您参考如下方法:

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

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

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

在上面的例子中,你的代码应该避免重复向上按键的问题。只测试 (mainCharY > 0) 而不是使用 isJumping 变量可能更容易。