pygame Unpress键打开事件.key

2024-05-12 17:49:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我对pyGame(这里是完全的新手)有问题。我练习事件.key并想取消按压/切断连续按下的按键。我试着用谷歌搜索并查看了这个网站,但没有得到有希望的结果。整件事都发生在

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

(第49-55行)

^{pr2}$

如果只按一次向上箭头键,这种方法就可以正常工作,但是在循环中继续执行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

Tags: andkeyeventifwindowpygamefpsup
3条回答

如果你只想让玩家在每次上按时能跳10个单位然后停在原地,你可以简单地在每一帧中将yChange设置为0。在

然而,如果你想找一个更健壮的跳跃系统(按下按钮,玩家向上移动几帧,然后停下来,然后再下降)就需要更多的了。在

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

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

我不认为pygame会错过一个关键事件。在

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

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的回答。在

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

在您的例子中,当您按下UP键时,yChange变量将减少为-10。在while循环中,mainCharY将被每帧递减-10,字符将向上移动。一旦您释放该键,yChange将重置为0,玩家角色停止。在

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

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

相关问题 更多 >