python - 如何在pygame中使用Keyup
问题描述
我是一个非常新的程序员,所以请您详细解释一下您所做的一切。
这是我的测试代码(请注意缩进都是错误的):
import pygame
pygame.init()
win = pygame.display.set_mode((500,500))
pygame.display.set_caption("First Game")
x = 50
y = 50
width = 40
height = 60
vel = 5
run = True
while run:
pygame.time.delay(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
for event in pygame.event.get():
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP:
y -= vel
if event.key == pygame.K_DOWN:
y += vel
if event.key == pygame.K_RIGHT:
x += vel
if event.key == pygame.K_LEFT:
x -= vel
win.fill((0,0,0))
pygame.draw.rect(win, (255,0,0), (x, y, width, height))
pygame.display.update()
pygame.quit()
解决方案
pygame.event.get()
获取所有消息并将它们从队列中删除。因此,第一个或第二个循环都会获得一个事件,但绝不会两个循环都会获得所有事件。这导致某些事件似乎被错过了。在一个事件循环中处理所有事件:
run = True
while run:
pygame.time.delay(100)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP:
y -= vel
if event.key == pygame.K_DOWN:
y += vel
if event.key == pygame.K_RIGHT:
x += vel
if event.key == pygame.K_LEFT:
x -= vel
win.fill((0,0,0))
pygame.draw.rect(win, (255,0,0), (x, y, width, height))
pygame.display.update()
该pygame.KEYUP
事件仅在释放按钮时发生一次。如果要实现连续移动,则必须评估键的当前状态。所有键盘按钮的状态都可以通过 检索pygame.key.get_pressed()
。
使用.tick()
来pygame.time.Clock
限制帧速率,而不是pygame.time.delay
. 例如:
import pygame
pygame.init()
win = pygame.display.set_mode((500,500))
pygame.display.set_caption("First Game")
clock = pygame.time.Clock()
x, y, width, height = 50, 50, 40, 60
vel = 5
run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
y -= vel
if keys[pygame.K_DOWN]:
y += vel
if keys[pygame.K_RIGHT]:
x += vel
if keys[pygame.K_LEFT]:
x -= vel
win.fill((0,0,0))
pygame.draw.rect(win, (255,0,0), (x, y, width, height))
pygame.display.update()
pygame.quit()
推荐阅读
- c# - 我们可以使用代码优先方法在 SQL Server 2016 上启用 DDM 吗?
- node.js - 使用 javascript 和 socket.io 从串口显示多个传感器数据
- javascript - 仅删除与第二个表对应的第一个表中没有条目的那些
- unity3d - 在编辑器播放模式下显示从 AssetBundle 加载的 Sprite 的问题
- java - 如何让手机进入睡眠状态?
- python - 在 NixOS 中,如何使用 Python 包 SpaCy、pandas 和 jenks-natural-breaks 安装环境?
- python - Tweepy API 中的“UnicodeDecodeError”
- angular - Google 使用 Angular4 在 localhost 上登录
- php - 验证(如果电子邮件和令牌正确,则更新数据库)
- java - 我想生成一个随机数并在另一个类中使用它来生成随机名称