pygame的。神秘的错误。在分配错误之前引用的事件

时间:2017-04-16 04:40:42

标签: python pygame

我正在尝试用pygame制作一个python太空射击游戏。

我得到的错误是:分配前引用的局部变量'event'

这很神秘,因为有时它会出现并且会破坏我的程序,有时它不会。错误发生没有模式,它只是无处不在地发生。

我可以运行该程序2次,它可以正常工作,但之后我再次运行它,它会出现此错误。

我展示的代码是真实程序的一个非常简化的版本,但它仍会产生相同的错误。

import pygame

WIDTH = 640
HEIGHT = 660
FPS = 30

WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
BLUE = (0,0,255)
GREEN = (0,255,0)

pygame.init()
pygame.mixer.init()
gamedisplay = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Game!")

clock = pygame.time.Clock()

all_sprites = pygame.sprite.Group()

def quit_game():
    pygame.quit()

def message_to_screen(msg, colour, x, y):#This function is used to display messages to the game display.
    font = pygame.font.SysFont(None, 25)
    text = font.render(msg, True, colour)
    gamedisplay.blit(text, (x,y))


def start_screen():    
    global intro_running
    intro_running = True    

    while intro_running:
        clock.tick(FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                quit_game()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    quit_game()
                if event.key == pygame.K_a:
                    main_game_loop()

        gamedisplay.fill(WHITE)

        message_to_screen("start screen: press \"a\" to start", RED, 200, 200)

        pygame.display.update()#Updating the display.



def main_game_loop():
    intro_running = False#I make intro_running equal False here so that when this subprogram starts, the start_screen subprogram will end

    running = True

    while running:
        clock.tick(FPS)

        pygame.mouse.set_visible(0)#Makes the mouse invisible.

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
                quit_game()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    quit_game()

        gamedisplay.fill(GREEN)

        message_to_screen("Main game will be here", RED, 200, 200)

        all_sprites.draw(gamedisplay)

        all_sprites.update(event)#The event parameter needs to be passed, because some sprites in the group need it to check for events.

        pygame.display.update() 


start_screen()

完整错误是:

Traceback (most recent call last):
  File "C:/Users/Home/Documents/Python/pygame/test game/re-creation.py", line 106, in <module>
    start_screen()
  File "C:/Users/Home/Documents/Python/pygame/test game/re-creation.py", line 64, in <module>
    main_game_loop()
  File "C:/Users/Home/Documents/Python/pygame/test game/re-creation.py", line 98, in <module>
    all_sprites.update(event)#All sprites will be updated, each frame.
builtins.UnboundLocalError: local variable 'event' referenced before assignment

非常感谢所有帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

你的精灵可能不需要事件参数,但它是你的游戏...你可以通过将它放在事件循环中来轻松解决这个问题,因为你的错误是由event造成的。从未在while循环的第一次迭代中定义,因为没有任何事件,因此从未生成变量event

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
        quit_game()
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_ESCAPE:
            quit_game()
    all_sprites.update(event) # this will guarantee that there's an event

但你也可以考虑这样做,以确保精灵永远得到更新:

class mysprite(pygame.sprite.Sprite): # example sprite class
    def __init__(self, event = None): # allow the event to have a default None argument 
        if event is None:
            # do stuff without the event
            return 
        # do stuff with the event


# the event loop snippet
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        running = False
        quit_game()
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_ESCAPE:
            quit_game()
    all_sprites.update(event) # this will guarantee that there's an event
all_sprites.update() # without the event outside of the event loop in the while loop, where the all_sprites.update(event) used to be in your example, so the sprites will always get updated

答案 1 :(得分:0)

除了在其他答案中提供的内容(你必须应用那里建议的内容)还有其他原因导致Pygame出现问题:

Pygame神秘错误可能与计算机上发生的其他事情有关。我运行你的脚本一千次没有任何错误,但是......我在使用屏幕截图实用程序来捕捉Pygame窗口一个冷冻显示到我必须重新启动计算机的程度(但是只有在关闭Pygame窗口的特殊时间时)才会看到并做截图一起来了)。根据这段经验,我建议如果其他答案中给出的建议不能阻止你的游戏因为什么原因而崩溃:

  

检查在后台或前台运行的哪些应用程序可能会干扰Pygame。

可能很容易检测到错误发生的次数和错误发生的次数,但是如果另外还有应用程序的特殊时间事件干扰Pygame是发生错误的必要条件可能很难找到。

无法保证这会解决您的问题,但也许可以。

如果你想亲眼目睹Pygame处理事件和刷新显示效果不好,只需运行一个非常简单的Pygame应用程序,只需显示一个FPS为每秒一帧的空窗口FPSclock = pygame.time.Clock() -> FPSclock.tick(1) )。如果你的盒子和我的盒子一样,你会看到CPU非常忙于Pygame。 Pygame只是一个玩具 - 不要期望太多......

也许你可以找到如何修改你的代码以避免发生特殊错误,但这很可能是一种彩票游戏。我想没有办法让Pygame在任何情况下都能完全避免错误和问题。如果你想要,切换到另一个称为稳定和成熟的游戏引擎。

它的生命 - 如果你在一边获得某些东西,你会在另一边松开一些东西。使用Pygame编程游戏的难易程度肯定要付出代价 - 也许你可以安排自己接受这不是一个问题,如果偶尔会出现神秘错误?