我在这里制作了一些pygame代码:
#############################################################################
# IMPORTS
#############################################################################
import pygame, sys
from pygame.locals import *
#############################################################################
# PRE-INITIALIZATION
#############################################################################
pygame.init()
#############################################################################
# CONSTANTS
#############################################################################
SW = 300
SH = 300
#############################################################################
WHITE = (255,255,255)
LIGHTEST_GRAY = (230,230)
LIGHT_GRAY = (205,205,205)
SORTLIGHT_GRAY = (180,180,180)
GRAY = (155,155,155)
SORTDARK_GRAY = (130,130,130)
DARK_GRAY = (105,105,105)
DARKEST_GRAY = (80,80,80)
BLACK_GRAY = (55,55,55)
LIGHT_BLACK = (30,30,30)
SORTLIGHT_BLACK = (5,5,5)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)
#############################################################################
SYS_FONT = pygame.font.SysFont(None, 30)
#############################################################################
# GLOBAL VARIABLES
#############################################################################
state = ""
#############################################################################
# CLASSES
##############################################################################
#############################################################################
# FUNCTIONS
#############################################################################
def addTuples(a,b):
for i in range(len(a)):
a[i] += b[i]
def set_state(newstate="",init_function=None):
global state
state=newstate
if init_function!=None:init_function()
return state
def get_state():
return state
#############################################################################
def initSplashScreen():
screen.fill(BLACK)
def initGameScreen():
pass
#############################################################################
def quitEvent():
pygame.quit()
sys.exit()
def updateEvent():
checkEvents()
if get_state() == "splash":
drawSplashScreen()
elif get_state() == "game":
drawGameScreen()
#############################################################################
def checkEvents():
for event in pygame.event.get():
if event.type == QUIT:
quitEvent()
def checkSplashScreenEvents():
print("naff")
for event in pygame.event.get():
if event.type == KEYUP:
print("saff")
set_state("game",initGameScreen)
def checkGameScreenEvents():
for event in pygame.event.get():
if event.type == KEYUP:
if event.key == K_ESCAPE:
set_state("pause")
def checkPauseScreenEvents():
for event in pygame.event.get():
if event.type == KEYDOWN:
set_state("game")
#############################################################################
def drawText(text,color,loc):
text_obj = SYS_FONT.render(text, True, color)
screen.blit(text_obj,loc)
#############################################################################
def drawSplashScreen():
checkSplashScreenEvents()
drawText("Grid Game",RED,(95,50))
drawText("Press SPACE to begin!",YELLOW,(35,100))
def drawGameScreen():
checkGameScreenEvents()
screen.fill(BLACK)
drawText("Game",BLUE,(95,50))
def drawPauseScreen():
checkPauseScreenEvents()
drawText("Paused",GREEN,(115,50))
drawText("Press ANY KEY to continue!",YELLOW,(15,100))
#############################################################################
# INITIALIZATION
#############################################################################
screen = pygame.display.set_mode((SW,SH))
pygame.display.set_caption("Grid")
set_state("splash",initSplashScreen)
#############################################################################
# PROGRAM STARTS HERE
#############################################################################
while True:
updateEvent()
pygame.display.update()
当我运行该程序时,我可以按“空格”键,并在屏幕上以黑色显示“游戏”,背景为黑色。
但是,当我在checkSplashScreenEvents函数中删除print语句时:print("naff")
程序不再正常工作。当我按“空间”大约二十次时它会在10秒左右后工作......
print语句仅用于测试,以确保在创建此程序时更早地调用该函数。
我认为python Idle IDE可能已经出现故障,因此我退出了Idle并重新进入。这无法解决问题。
有谁知道这里发生了什么,为什么会这样? 以及如何解决它?
提前谢谢你。
答案 0 :(得分:1)
您没有在帧或事件检查之间暂停 ANY - CPU和I / O最大超载。印刷声明将简化系统。
请在致电pygame.time.delay(30)
后立即添加display.update()
左右。
现在,稍微平静一点,真正的问题是你在代码中的多个位置调用pygame.event.get
,并在循环中执行此操作。该调用具有破坏性,因为它会消耗任何未决事件。打印会在调用.get
之间引入一小段暂停,以便KEYUP
事件最终有机会在event.get
方法中调用checkEvents
之间潜入checkSplashScreenEvents
方法中的那个。
您最好重新组织代码,以便在一个地方调用event.get
- 否则您的代码将无法维护(已经难以理解,而且几乎没有任何内容) - 对于例如,尝试为每个游戏状态设置一个事件回调 - 回调从单个getEvents
方法获取正在进行的事件的列表。
对于要运行的代码,只需使用非破坏性方法替换checkEvents以检查退出事件 - 例如:
def checkEvents():
if pygame.event.peek(QUIT):
quitEvent()