python - 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
解决方案
如果您只希望玩家每次向上按下时能够跳跃 10 个“单位”然后停在原地,您可以在将其添加到 mainCharY 后将每帧的 yChange 设置为 0。
但是,如果您正在寻找更强大的跳跃系统(按下按钮,玩家向上移动几帧,然后停止并回落),则需要更多。
给你一个想法:如果你在每一帧的末尾有一些逻辑来检查 mainCharY > 0(玩家不在地面上),如果是,从 yChange 中减去一些数字(好像重力把它们拉下来) ?
在上述情况下,您的代码应避免重复上按问题。仅测试 (mainCharY > 0) 而不是使用 isJumping 变量可能更容易。
推荐阅读
- sql-server - 如何在 SQL Server 中使用多个 CASE 语句更新多行?
- autodesk-forge - 将网格添加到 Forge 查看器场景
- java - io.appium.java_client.AppiumDriver 无法转换为 io.appium.java_client.clipboard.HasClipboard
- docker - 第二阶段的第一个工作包含 GitLab 中以前工作的状态
- spring-boot - 有没有办法为每个用户创建一个单独的日志文件?(弹簧靴)
- node.js - Node.js - 每当切换切换时调用异步函数
- keycloak - 使用 Keyclock 为多个领域生成令牌
- c# - 销售佣金 8.10 Dietel
- amazon-web-services - 无法修复 提供的执行角色无权调用 EC2 上的 CreateNetworkInterface
- stripe-payments - 如何在 Stripe 中实施免费计划