我对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
如果你只想让玩家在每次上按时能跳10个单位然后停在原地,你可以简单地在每一帧中将yChange设置为0。在
然而,如果你想找一个更健壮的跳跃系统(按下按钮,玩家向上移动几帧,然后停下来,然后再下降)就需要更多的了。在
给你一个想法:如果你在每一帧末尾都有一些逻辑来检查mainCharY>;0(玩家不在地面上),如果是的话,从yChange中减去一些数字(就像重力把他们拉下来一样)?在
在上面的情况下,您的代码应该避免重复上压问题。只测试(mainCharY>;0)而不是使用isJumping变量可能更容易。在
我不认为pygame会错过一个关键事件。在
我认为问题是你没有在任何地方设置}的更改。如果我正确地解释了这一点,以下代码应该可以工作:
isJumping
为false,这会在第一次按下后永远停止{有一件事要记住,这个跳跃系统看起来不是很自然。关于这一点,请看@SamHolloway的回答。在
似乎您误解了事件队列和事件循环的工作方式。{1>当事件添加到队列时,按一个键。调用
pygame.event.get
会清空事件队列并将所有事件放入一个列表中,您可以使用for循环进行迭代:for event in pygame.event.get():
。这意味着pygame不知道你还拿着钥匙,它只会看到你按了一次。它还将注意到您释放了密钥并向队列添加了一个pygame.KEYUP
事件。在在您的例子中,当您按下UP键时,
yChange
变量将减少为-10
。在while循环中,mainCharY
将被每帧递减-10
,字符将向上移动。一旦您释放该键,yChange
将重置为0
,玩家角色停止。在为了在游戏中实现跳跃,你应该在每一帧的y速度上加上一个重力常数来加速。当角色接触地面时,将y速度设置为0,并将变量(
on_ground
或类似的)设置为True
,这样你就知道玩家可以跳跃了。当玩家按下跳跃键时,你可以将y速度设置为负值,精灵将开始向上移动,直到重力再次将他拉下来。这是一个complete example。在相关问题 更多 >
编程相关推荐