我在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]的值,它总是为零。
答案 0 :(得分:13)
问题是你不处理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
来自docs(强调我的):
pygame.event.pump()
内部处理pygame事件处理程序
pump() -> None
对于游戏的每一帧,您需要对事件队列进行某种调用。这可以确保您的程序可以在内部与操作系统的其余部分进行交互。 如果您没有在游戏中使用其他事件功能,则应调用pygame.event.pump()以允许pygame处理内部行动。
如果程序通过其他pygame.event函数一致地处理队列中的事件,则不需要此函数。
必须在事件队列内部处理重要事项。主窗口可能需要重新绘制或响应系统。 如果您未能长时间调用事件队列,系统可能会决定您的程序已锁定 。
请注意,如果您只是在主循环中的任何位置调用pygame.event.get()
,则不必执行此操作;如果不这样做,您应该调用pygame.event.clear()
,这样事件队列就不会填满。
答案 1 :(得分: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()
答案 2 :(得分: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()
你在if语句中不需要pygame.
,你也应该调用pygame.display.flip()
以便它正确地显示窗口然后你需要一个事件循环来退出程序
答案 3 :(得分:0)
您应提供pygame
和python
的版本。
使用pygame 1.9.4dev
和python 3.6.5
时遇到了类似的问题
我将pygame
降级并重新安装python
后,已解决此问题。
注意:如果您使用pyenv
,则必须确保在安装python时设置了--enable-framework
选项。
# 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()