8

我在 Stack Overflow 上读过与此类似的问题,但它们没有帮助。这是我的代码:

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Hello World')
pygame.mouse.set_visible(1)

done = False
clock = pygame.time.Clock()

while not done:
    clock.tick(60)

    keyState = pygame.key.get_pressed()

    if keyState[pygame.K_ESCAPE]:
        print('\nGame Shuting Down!')
        done = True

按下escape不会退出游戏或打印消息。这是一个错误吗?如果我打印 keyState[pygame.K_ESCAPE] 的值,它总是为零。

4

4 回答 4

16

问题是您不处理 pygame 的事件队列。您应该在循环结束时简单地调用pygame.event.pump(),然后您的代码就可以正常工作:

...
while not done:
    clock.tick(60)

    keyState = pygame.key.get_pressed()

    if keyState[pygame.K_ESCAPE]:
        print('\nGame Shuting Down!')
        done = True
    pygame.event.pump() # process event queue

文档(强调我的):

pygame.event.pump()

内部处理 pygame 事件处理程序

pump() -> None

对于游戏的每一帧,您都需要对事件队列进行某种调用。这确保您的程序可以在内部与操作系统的其余部分进行交互。如果您没有在游戏中使用其他事件函数,则应调用 pygame.event.pump() 以允许 pygame 处理内部操作。

如果您的程序通过其他 pygame.event 函数持续处理队列上的事件,则不需要此函数。

有一些重要的事情必须在事件队列内部处理。主窗口可能需要重新绘制或响应系统。如果您长时间未能调用事件队列,系统可能会判断您的程序已锁定

pygame.event.get()请注意,如果您只是在主循环中的任何位置调用,则不必这样做;如果你不这样做,你可能应该打电话pygame.event.clear(),这样事件队列就不会填满。

于 2013-07-30T07:32:02.303 回答
2

我可以建议改用事件队列吗?这可能是一个更好的主意:

while True: #game loop
    for event in pygame.event.get(): #loop through all the current events, such as key presses. 
        if event.type == QUIT:
            die()

        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE: #it's better to have these as multiple statments in case you want to track more than one type of key press in the future. 
                pauseGame()
于 2013-07-30T04:27:38.067 回答
0

做这样的事情:

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption('Hello World')
pygame.mouse.set_visible(1)

done = False
clock = pygame.time.Clock()

while not done:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    key = pygame.key.get_pressed()

    if key[K_ESCAPE]:
        print('\nGame Shuting Down!')

    pygame.display.flip()

你不需要pygame.if 语句,你也应该调用pygame.display.flip()它以正确显示窗口,然后你需要一个事件循环来退出程序

于 2013-07-30T04:28:36.660 回答
0

您应该提供 和 的pygame版本python

我在使用时遇到了类似的pygame 1.9.4dev问题python 3.6.5

我降级pygame并重新安装后解决了这个问题python

注意:如果您使用pyenv,您必须确保--enable-framework在安装 python 时设置了选项。

# exit current virtualenv
$ pyenv deactivate
# reinstall python
$ PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.6.5
# And reinstall pygame again.
pip install https://github.com/pygame/pygame/archive/1.9.3.zip

使用以下代码检查它是否工作。

import pygame
import sys


def run():
    """Initialize pygame, settings, and screen object."""
    pygame.init()
    screen = pygame.display.set_mode((300, 200))
    pygame.display.set_caption('Keyboard Test')

    # main loop
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                print('KEY pressed is ' + str(event.key) + '.')

        # Make the most recently drawn screen visible.
        pygame.display.flip()


run()
于 2018-08-17T08:55:42.753 回答