首页 > 解决方案 > pygame.error:视频系统未初始化,但我已经使用了 pygame.init()

问题描述

我检查了与我相同的错误的问题,但这是一个初始化问题。所以我确保我做了我使用 pygame.init() 的初始化,但发生了错误。我不明白这一点。所以我在下面的代码中指定了 Pycharm IDE 告诉我的位置。帮我

import pygame
import random

BLACK=(0,0,0)
pad_width=480
pad_height=640
fight_width=36
fight_height=38
enemy_width=26
enemy_height=20
def drawObject(obj,x,y):
    global gamepad
    gamepad.blit(obj,(x,y))
def runGame():
    global gamepad,clock,fighter,enemy
    x=pad_width*0.45
    y=pad_height*0.9
    x_change=0
    enemy_x=random.randrange(0,pad_width-enemy_width)
    enemy_y=0
    enemy_speed=3
    ongame=False
    while not ongame:
        for event in pygame.event.get():      #I got an error here
            if event.type ==pygame.QUIT:
                ongame=True
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_LEFT:
                    x_change-=5
                elif event.key==pygame.K_RIGHT:
                    x_change+=5
            if event.type==pygame.KEYUP:
                if event.key==pygame.K_LEFT or event.key==pygame.K_RIGHT:
                    x_change=0
        gamepad.fill(BLACK)

        x+=x_change
        if x<0:
            x=0
        elif x>pad_width-fight_width:
            x=pad_width-fight_width

        drawObject(fighter,x,y)
        enemy_y+=enemy_speed
        if enemy_y>pad_height:
            enemy_y=0
            enemy_x=random.randrange(0,pad_width-enemy_width)

        drawObject(enemy,enemy_x,enemy_y)

        pygame.display.update()
        clock.tick(60)

        pygame.quit()

def initGame():
    global gamepad,clock ,fighter,enemy

    pygame.init()
    gamepad=pygame.display.set_mode((pad_width,pad_height))
    fighter=pygame.image.load('fighter.png')
    enemy=pygame.image.load('enemy.png')
    clock=pygame.time.Clock()

initGame()
runGame()  #and here

标签: pythonpython-3.xpygameinit

解决方案


问题是pygame.quit()使其成为while not ongame:循环的一部分的缩进。

所以代码正确地初始化了 PyGame,但是在通过主循环的第一次迭代结束时,最终会pygame.quit()关闭所有东西 - 使事件系统未初始化并导致您看到的错误消息。

调整缩进足以修复它:

def runGame():
    global gamepad,clock,fighter,enemy
    x=pad_width*0.45
    y=pad_height*0.9
    x_change=0
    enemy_x=random.randrange(0,pad_width-enemy_width)
    enemy_y=0
    enemy_speed=3
    ongame=False
    while not ongame:
        for event in pygame.event.get():      #I got an error here
            if event.type ==pygame.QUIT:
                ongame=True

        # [ ... ]
                
        drawObject(enemy,enemy_x,enemy_y)

        pygame.display.update()
        clock.tick(60)

    pygame.quit()    # <<-- HERE (un-indent 1 place)

因此,虽然这只是一个错字,但它也是一个足够常见的情况,需要一个完整的答案。


推荐阅读