为什么删除print语句时pygame会停止工作?

时间:2016-02-17 13:24:55

标签: python python-3.x pygame

我在这里制作了一些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并重新进入。这无法解决问题。

有谁知道这里发生了什么,为什么会这样? 以及如何解决它?

提前谢谢你。

1 个答案:

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