image image


image

Ein Pygame-Grundgerüst

Da ich ja nun Pygame auch unter meinem Anaconda-Python zur Mitarbeit bewegen konnte und mich die Video-Tutorials von Chris und Priya Bradfield inspiriert hatten, habe ich mir vorgenommen, in der nächsten Zeit verstärkt mit der Spieleprogrammierung mit Pygame zu experimentieren. Mir schweben da kleinere Tutorials zu speziellen Themen vor, wie sie zum Beispiel Jorge Rodriguez in seiner YouTube-Playlist Math for Game Developers (in C++) anspricht. Damit ich aber nicht jedes mal das Rad neu erfinden muß, habe ich zur Vorbereitung erst einmal ein lauffähiges Grundgerüst entwickelt, das minimal aus zwei Dateien besteht, einmal der Hauptdatei main.py und dann noch einer Konfigurationsdatei settings.py. Die Datei main.py sieht so aus:

# Erweitertes Pygame-Grundgerüst
# Als Template für alle größeren Python/Pygame-Projekte zu verwenden
import pygame as pg
from settings import Settings
import random
import os

class World:
    
    def __init__ (self):
        # Initialisiert die Spielewelt
        pg.init()
        pg.mixer.init()
        self.screen = pg.display.set_mode((s.WIDTH, s.HEIGHT))
        pg.display.set_caption(s.TITLE)
        self.clock = pg.time.Clock()
        self.keep_going = True
    
    def new(self):
        # Initializes and Resets the Game
        self.all_sprites = pg.sprite.Group()
        self.run()
        
    def run(self):
        # Game Loop
        self.playing = True
        while self.playing:
            self.clock.tick(s.FPS)
            self.events()
            self.update()
            self.draw()
    
    def update(self):
        # Game-Loop Update
        self.all_sprites.update()
    
    def events(self):
        # Game-Loop Events
        for event in pg.event.get():
            if event.type == pg.QUIT or (event.type == pg.KEYDOWN and event.key == pg.K_ESCAPE):
                if self.playing:
                    self.playing = False
                self.keep_going = False
  
    def draw(self):
        # Game-Loop Draw
        self.screen.fill(s.BLACK)
        self.all_sprites.draw(self.screen)
        pg.display.flip()

    def splash_screen(self):
        # Start-Screen
        pass
        
    def game_over(self):
        pass
        

s = Settings()
w = World()
w.splash_screen()
while w.keep_going:
    w.new()
    w.game_over()
    
pg.quit()

Erst einmal habe ich die Importe vorgenommen, wobei die Module os und random noch nicht benötigt werden, aber da man sie praktisch für jedes Spiele benötigt (os für die Pfadangaben zu den Assets und random – kennt einer ein Spiel, in dem der Zufall keine Rolle spielt?).

In der Klasse World wird die Spielewelt, also das Hauptfenster und die darin stattfindenden Aktionen definiert. Nach der Initialisierung im Constructor wird in der Methode new() das Spiel initialisiert und – nach einem Neustart – auf seine Anfangswerte zurückgesetzt. Danach ruft sie die Methode run() auf, die die eigentliche Game Loop enthält. Innerhalb dieser (Endlos-) Schleife werden bei jedem Durchlauf die Methoden events() (die die Tastatur und Mauseingaben etc. verarbeiten soll), update() (zuständig für die Berechnung der Bewegungen und der Kollisionserkennung) und draw() (hier wird dann das Fenster neugezeichnet) aufgerufen.

Die Methoden für den Start- und den Ende-Bildschirm sind noch Platzhalter, aber da auch sie bei jedem ernstzunehmenden Spiel benötigt werden, habe ich sie schon einmal in mein Grundgerüst eingebaut.

Das eigentliche Programm ist dann sehr kurz: Hier wird eine Instanz der Spielewelt erzeugt, gegebenenfalls der Startbildschirm aufgerufen und dann läuft in einer weiteren (Endlos-) Schleife das Spiel ab. Hier gibt es nach Ende des Spieles gegebenfalls einen Game Over Screen, von dem das Spiel auch neu gestartet werden kann. Und wenn keep_going auf False gesetzt wird, ist endgültig Schluß.

Und dann habe ich noch das Modul settings.py erstellt:

# Konstanten und Einstellungen für das Spiel
import pygame as pg

class Settings():
    
    def __init__(self):

        # Einige nützliche Konstanten
        self.TITLE = "🐍 Hällo Pygäme! 🐍"
        self.WIDTH = 640
        self.HEIGHT = 480
        self.FPS = 60   # Framerate

        # Nützliche Farbdefinitionen 
        self.WHITE = (255, 255, 255)
        self.BLACK = (0, 0, 0)
        self.RED = (255, 0, 0)
        self.GREEN = (0, 255, 0)
        self.BLUE = (0, 0, 255)
        self.YELLOW = (255, 255, 0)
        self.GREY = (160, 160, 160)

Es soll in der Hauptsache nur ein paar nützliche Konstanten für alle Werte enthalten, die mehr als einmal im Spiel vorkommen, so daß man sie nur in dieser Konfigurationsdatei ändern, und nicht in den übrigen Quelltexten verzweifelt nach einem Vorkommen dieser Werte suchen muß.

Wie man sieht, ist Pygame mit Python3 wirklich UTF-8 fest und verträgt auch ohne Verrenkungen Emojis in der Titelzeile.

Auf Grundlage dieses Templates habe ich schon angefangen, ein paar kleinere Dinge mit Python und Pygame anzustellen. Ihr werdet daher in den nächsten Tagen noch mehr von mir darüber lesen. Still digging!

image


(Kommentieren) 

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung


Werbung


image  image  image
image  image  image


image