pygame problem: video system not initialized

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Lerikson
User
Beiträge: 14
Registriert: Freitag 13. November 2009, 08:52

hi,
ich habe gerade angefangen eine kleine Demoanwendung in Python zu schreiben und alles lief auch gut, bis ich versuchte einen Colorkey bei einem Bild zu setzen... Das ist ja nicht das Problem, jetzt mault IDLE nämlich an einer Zeile die sonst immer funktioniert hat rum:
Hier mal der gesamte code:

Code: Alles auswählen

# import pygame (all)
import pygame
from pygame.locals import *

# path to the images
bif = "background.jpg"
mif = "crosshair.png"
baif = "ballon.png"

# initialise pygame/screen
pygame.init()
screen = pygame.display.set_mode((640,480),0,32)

# loading the images
background = pygame.image.load(bif).convert()
crosshair = pygame.image.load(mif).convert_alpha()
ballon = pygame.image.load(baif).convert_alpha()

# making the normal cursor disappear
pygame.mouse.set_visible(False)

# setting colorkey for baloon image
#colorkey = ballon.get_at((0,0))
ballon.set_colorkey((255,255,255))

# the Gameloop
while True:
    for event in pygame.event.get():
        # if "exit" event close application
        if event.type == QUIT:
            pygame.quit()

    # variables for the ballon coordinates
    ballon_x,ballon_y = 100,100
    
    # get mouse position
    crosshair_x,crosshair_y = pygame.mouse.get_pos()

    # correct to the middle of the image
    crosshair_x -= crosshair.get_width()/2
    crosshair_y -= crosshair.get_height()/2

    # blitting all on the screen (first background, than baloon than crosshair)
    screen.blit(background, (0,0))
    screen.blit(ballon,(ballon_x,ballon_y))
    screen.blit(crosshair, (crosshair_x,crosshair_y))

    # update
    pygame.display.update()
    
und der Fehler:
Traceback (most recent call last):
File "C:\Users\Lennart\Desktop\shooter.py", line 37, in <module>
crosshair_x,crosshair_y = pygame.mouse.get_pos()
error: video system not initialized
...ich werde daraus nicht schlau, erkennt ihr dort einen Fehler??

mfg,
Lennart
BlackJack

Versuch's mal ohne IDLE. Verschiedene GUI-Toolkits sollte man nicht mischen.
Lerikson
User
Beiträge: 14
Registriert: Freitag 13. November 2009, 08:52

also die Fehlermeldung kommt zwar immer noch, allerdings funktioniert die Demo sonst einwandfrei (habe max. 500FPS), gibt es eigentlich Pygame benchmarks (im Vergleich zur C++/SDL oder zu Rubygame)?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Du rufst die Abfrage erst nach der Gameloop auf, d.h. pygame hat schon den QUIT-Event erhalten. Sonst stimmt die Einrückung deines Codes mit Sicherheit nicht.
Lerikson
User
Beiträge: 14
Registriert: Freitag 13. November 2009, 08:52

hmm dake für den tipp, aber warum läuft das ganze wie "geschmiert", wenn es einen Fehler gibt?
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Das Ganze laeuft dehalb wie geschmiert, weil der Fehler erst beim Beenden des Programmes auftritt.
Beim Schliessen des Fensters wird in Zeile 31 zwar 'pygame.quit()' aufgerufen, die Gameloop laeuft danach aber weiter. In Zeile 37 wird dann auf 'pygame' zugegriffen, obwohl dieses Objekt schon nicht mehr existiert. Also musst Du dafuer sorgen (z.B. mit einer Kontrollvariable), dass die Gameloop nach Zeile 31 verlassen wird, wenn das Fenster geschlossen wird.

:wink:
yipyip
Lerikson
User
Beiträge: 14
Registriert: Freitag 13. November 2009, 08:52

danke für den Hinweis, ich habe das ganze jetzt wie vorgeschlagen umgesetzt und es funktioniert nun auch ohne Fehler

Hier mal der betreffende Code:

Code: Alles auswählen

# gameloop variable
running = True
# the Gameloop
while running == True:
    # start clock (allow just 50 fps)
    clock.tick(50)
    
    for event in pygame.event.get():
        # if "exit" event close application
        if event.type == QUIT:
            pygame.quit()
            running = False
            
    # check gameloop variable
    if running == False:
        break
Danke für die hilfe
BlackJack

@Lerikson: Bei `running` sind aber ein paar Anmerkungen nötig: Es ist sinnlos die Bedingung sowohl in der ``while``-Bedingung als auch in dem ``if`` innerhalb der Schleife zu überprüfen. Dann sollte man keine Vergleiche auf `True` und `False` durchführen, wenn das andere beteiligte Objekt bereits *selbst* `True` oder `False` ist. Also ``while running:`` und ``if not running:``. Last but not least ist `running` hier überflüssig, wenn man einfach eine "Endlosschleife" mit ``while True:`` schreibt, und an der Stelle wo `running` an `False` gebunden wird, diese Schleife direkt mit einem ``break`` verlässt.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

@BlackJack:
Wenn in Zeile 12 'running = False' durch ein 'break' ersetzt wird, wird doch aber nur die innere for-Schleife beendet und nicht wie gewuenscht, die aeussere while-Schleife.
Lerikson
User
Beiträge: 14
Registriert: Freitag 13. November 2009, 08:52

ok, mit dem auf True und False prüfen hast du recht das ist echt ein bissl überflüssig, allerdings dachte ich das wäre so besser, und bei der Stelle

Code: Alles auswählen

running = False
würde ein

Code: Alles auswählen

break
wie schon gesagt nur die For Schleife beenden...darum habe ich es dort unten eingebaut
BlackJack

Ups, das hatte ich übersehen. Naja, dann packt man das ganze in eine Funktion und an der Stelle ein ``return``. Code auf Modulebene ist ja sowieso nicht schön.
Antworten