Pygame-Tutorial

Aus Spieleprogrammierer-Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
[gesichtete Version][gesichtete Version]
K (Testen)
(Ein paar Grundlagen)
Zeile 73: Zeile 73:
 
== Ein paar Grundlagen ==
 
== Ein paar Grundlagen ==
  
Schauen wir uns das erste Beispiel mal etwas genauer an...
+
Schauen wir uns das erste Beispiel mal etwas genauer an ...
  
 
=== Das erste Beispiel ===
 
=== Das erste Beispiel ===
Zuerst importieren wir die benötigten Pygame Module. Wenig Aufregendes:
+
Zuerst importieren wir das benötigte Pygame-Modul. Wenig Aufregendes:
  
 
<sourcecode lang=python line start=4>
 
<sourcecode lang=python line start=4>
Zeile 82: Zeile 82:
 
</sourcecode>
 
</sourcecode>
  
Über diese Zeile importieren wir alles, was wir fürs Programmieren mit Pygame benötigen. Zusätzlich können wir noch testen, ob die Module für die Sound- und die Font-Bibliothek korrekt geladen wurden.
+
Über diese Zeile importieren wir alles, was wir für's Programmieren mit Pygame benötigen. Zusätzlich können wir noch testen, ob die Module für die Sound- und die Font-Bibliothek korrekt geladen wurden.
  
 
=== Pygame initialisieren ===
 
=== Pygame initialisieren ===
Als nächstes initialisieren wir Pygame und erstellen eine Surface die wir als Bildschirm verwende, mit einer festen Auflösung von 800x600 Pixeln.
+
Als Nächstes initialisieren wir Pygame und erstellen eine Surface (was das ist, besprechen wir später noch), die wir als Bildschirm verwenden, mit einer festen Auflösung von 800x600 Pixeln.
 +
 
 
<sourcecode lang=python line start=12>
 
<sourcecode lang=python line start=12>
 
     pygame.init()
 
     pygame.init()
 
     screen = pygame.display.set_mode((800, 600))
 
     screen = pygame.display.set_mode((800, 600))
 
</sourcecode>
 
</sourcecode>
Der set_mode Funktion können wir noch zusätzliche Parameter übergeben, aber ohne sie sucht SDL die für den PC besten Einstellungen heraus, was in den meisten Fällen der bessere Weg ist. Wer ein Bestimmtes Format benötigt schaut hier nach: http://www.pygame.org/docs/ref/display.h…isplay.set_mode.
+
 
Das Festlegen des Fenstertitels und das Anzeigen der Maus ist selbserklärend. Als Letztes schalten wir noch die Tasten-Wiederholung ein. Dadurch weisen wir Pygame an, trotzdem eine Taste-gedrückt-Nachricht zu senden, obwohl die Taste noch nicht losgelassen wurde.
+
Der <tt>set_mode</tt> Funktion können wir noch zusätzliche Parameter übergeben, aber ohne sie sucht SDL die für den PC besten Einstellungen heraus, was in den meisten Fällen der bessere Weg ist. Wer ein bestimmtes Format benötigt, schaut [http://www.pygame.org/docs/ref/display.html#pygame.display.set_mode hier in der Dokumentation] nach. Das Festlegen des Fenstertitels und das Anzeigen der Maus ist selbsterklärend. Als Letztes schalten wir noch die Tastenwiederholung ein. Dadurch weisen wir Pygame an, wiederholt eine "Taste gedrückt"-Nachricht zu senden, obwohl die Taste noch nicht losgelassen wurde.
 +
 
 
<sourcecode lang=python line start=14>
 
<sourcecode lang=python line start=14>
 
     pygame.display.set_caption("Pygame Tutorial")
 
     pygame.display.set_caption("Pygame Tutorial")
Zeile 99: Zeile 101:
  
 
=== Die Nachrichtenschleife ===
 
=== Die Nachrichtenschleife ===
Damit ist Pygame grundlegend initialisiert. Jetzt müssen wir nur noch dafür sorgen, dass das Fenster auch länger als ein Frame angezeigt wird. Dafür verwenden wir eine Nachrichtenschleife. Um Probleme mit der Geschwindigkeit der verschiedenen PCs zu vermeiden, legen wir fest, dass wir maximal 30 Frames pro Sekunde haben wollen:
+
Damit ist Pygame grundlegend initialisiert. Jetzt müssen wir nur noch dafür sorgen, dass das Fenster auch länger als ein Frame angezeigt wird. Dafür verwenden wir eine Nachrichtenschleife. Um Probleme mit der Geschwindigkeit der verschiedenen PCs zu vermeiden, legen wir fest, dass wir maximal 30 Frames pro Sekunde berechnen wollen:
 +
 
 
<sourcecode lang=python line start=19>
 
<sourcecode lang=python line start=19>
 
     clock = pygame.time.Clock()
 
     clock = pygame.time.Clock()
Zeile 112: Zeile 115:
 
         screen.fill((0, 0, 0))
 
         screen.fill((0, 0, 0))
 
</sourcecode>
 
</sourcecode>
Zuerst erstellen wir ein time.Cock-Objekt welches sich um die Frame Begrenzung kümmern soll. Um die Schleife bequem wieder verlassen zu können, verwenden wir die <tt>running</tt>-Variable. Solange sie 1 ist, bleiben wir in der Schleife. In der Schleife lassen wir das <tt>time.Clock</tt>-Objekt erstmal berechnen, wie lange wir warten müssen, um maximal 30 Frames zu erhalten. Danach überschreiben wir den gesamten Bildschirm mit der Farbe Schwarz.
+
 
 +
Zuerst erstellen wir ein <tt>time.Cock</tt>-Objekt, welches sich um die Framerate-Begrenzung kümmern soll. Um die Schleife bequem wieder verlassen zu können, verwenden wir die <tt>running</tt>-Variable. Solange sie 1 ist, bleiben wir in der Schleife. In der Schleife lassen wir das <tt>time.Clock</tt>-Objekt erstmal berechnen, wie lange wir warten müssen, um maximal 30 Frames pro Sekunde zu erhalten. Danach überschreiben wir den gesamten Bildschirm mit der Farbe Schwarz.
 +
 
 
<sourcecode lang=python line start=31>
 
<sourcecode lang=python line start=31>
 
         for event in pygame.event.get():
 
         for event in pygame.event.get():
Zeile 119: Zeile 124:
 
                 running = 0
 
                 running = 0
 
</sourcecode>
 
</sourcecode>
Hier haben wir die erste Abbruchsbedingung. Wir holen uns per <tt>pygame.event.get()</tt> sämtliche Events, die Pygame empfangen/generiert hat. Finden wir eines vom Typ <tt>QUIT</tt>, setzen wir die <tt>running</tt>-Variable auf 0, sodass wir die Schleife verlassen können.
+
 
Als Nächstes interessiert uns, welche Tasten der User gedrückt hat. Diese Events werden durch den Typ <tt>KEYDOWN</tt> abgefangen.
+
Hier haben wir die erste Abbruchbedingung. Wir holen uns per <tt>pygame.event.get()</tt> sämtliche Events, die Pygame empfangen/generiert hat. Finden wir eines vom Typ <tt>QUIT</tt>, setzen wir die <tt>running</tt>-Variable auf 0, sodass wir die Schleife verlassen können.
 +
Als Nächstes interessiert uns, welche Tasten der Benutzer gedrückt hat. Diese Events werden durch den Typ <tt>KEYDOWN</tt> repräsentiert.
 +
 
 
<sourcecode lang=python line start=37>
 
<sourcecode lang=python line start=37>
 
             if event.type == pygame.KEYDOWN:
 
             if event.type == pygame.KEYDOWN:
Zeile 127: Zeile 134:
 
                     pygame.event.post(pygame.event.Event(pygame.QUIT))
 
                     pygame.event.post(pygame.event.Event(pygame.QUIT))
 
</sourcecode>
 
</sourcecode>
Wir testen hier nur auf die Escape-Taste. Wurde sie gedrückt, posten wir ein Event vom Typ <tt>QUIT</tt>, was dafür sorgt, dass wir die Schleife verlassen (wir erinnern uns: auf dieses Event reagieren wir ja etwas weiter oben).
+
 
Nachdem wir alle Events durchgesehen habe, können wir endlich den Bildschirm anzeigen:
+
Wir testen hier nur auf die Escape-Taste. Wurde sie gedrückt, generieren wir ein Event vom Typ <tt>QUIT</tt>, was dafür sorgt, dass wir die Schleife verlassen (wir erinnern uns: auf dieses Event reagieren wir ja etwas weiter oben).
 +
Nachdem wir alle Events durchgesehen haben, können wir endlich den Bildschirminhalt anzeigen:
 +
 
 
<sourcecode lang=python line start=43>
 
<sourcecode lang=python line start=43>
 
         pygame.display.flip()
 
         pygame.display.flip()
 
</sourcecode>
 
</sourcecode>
Intern arbeitet Pygame mit einem Buffer für den Bildschrim, der erst mit diesem Befehl angezeigt wird. Würde man direkt auf den Bildschirm rendern, würde man den Bildaufbau sehen können.
+
 
Damit sind wir auch fast schon am Ende des Beispiels. Das gerade Besprochene haben wir in eine Funktion <tt>main</tt> gesteckt, die wir jetzt einfach aufrufen, falls diese Datei nicht als Modul importiert wird.
+
Intern arbeitet Pygame mit einem Puffer für den Bildschrim, der erst mit diesem Befehl angezeigt wird (Double Buffering). Würde man direkt auf den Bildschirm rendern, würde man den Bildaufbau sehen können.
 +
Damit sind wir auch fast schon am Ende des Beispiels. Das gerade Besprochene haben wir in eine Funktion <tt>main</tt> gesteckt, die wir jetzt einfach aufrufen, falls diese Datei nicht als Modul importiert wird:
 +
 
 
<sourcecode lang=python line start=46>
 
<sourcecode lang=python line start=46>
 
if __name__ == '__main__':
 
if __name__ == '__main__':
 
     main()
 
     main()
 
</sourcecode>
 
</sourcecode>
 +
 
Damit sind wir mit den Grundlagen fertig.
 
Damit sind wir mit den Grundlagen fertig.
  

Version vom 28. Oktober 2011, 15:11 Uhr

Klicke hier, um diese Version anzusehen.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge