首页 > 解决方案 > 如何在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()

标签: pythonpygame

解决方案


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() 

推荐阅读