Python Tutorial
- jetzt Python programmieren lernen

Zeichen der Mauersteine

Jetzt kommen wir zu der im Kapitel „ein Koordinatensystem für unsere Computerspiele“ gezeigten Vorgehensweise. Wir wollen haben 2 Ziele:

  • Mauersteine zeichnen
  • überprüfen können auf Kollision

Wir setzen zum Zeichnen der Mauersteine als Grundlage eine ineinander verschachtelte Liste ein (siehe Kapitel Listen). Diese verschachtelte Liste dient einerseits zum ersten Zeichnen unsere Spielelemente „Mauersteine“ und während dem Spiel zur Kollisions-Kontrolle. Hier haben wir einen großen Unterschied zum Kapitel mit Pong. Wir selber überprüfen, ob eine Kollision vorliegt und können dann darauf reagieren. Somit wären auch unterschiedliche Reaktionen möglich (zum Beispiel trifft man einen grünen Ziegelstein, wird der Ball schneller – trifft man einen braunen Ziegelstein könnte der Ball langsamer werden – das nur zum gedanklich durchspielen, warum gerne eine Kollisionskontrolle nicht aus der Hand gibt).

Aber zeichnen wir erst einmal unsere Ziegelsteine. Zum Zeichnen erstellen wir uns eine Funktion, der wir nur das gewünschte Feld mitgeben. Die Berechnung, auf welcher x- und y-Position das Feld sich befindet, wird in der Funktion über die Konstante „MULTIPLIKATOR“ erledigt.

Die Funktion nennen wir element_zeichnen() und übergeben von unserem Feld den Reihe und die Spalte. Bauen wir Schritt für Schritt die Funktion auf. Wir benötigen auch noch Farben, die wir wie gewohnt definieren:

# genutzte Farben
ORANGE  = ( 255, 140, 0)

# Spielelement zeichnen
def element_zeichnen(spalte,reihe):
    pygame.draw.rect(fenster, ORANGE,(spalte*MULTIPLIKATOR, reihe*MULTIPLIKATOR,MULTIPLIKATOR,MULTIPLIKATOR)) 

Wenn wir nun ein Spielelement zeichnen wollen, dann können wir einfach die Funktion aufrufen:

# genutzte Farben
ORANGE  = ( 255, 140, 0)

# Spielelement zeichnen
def element_zeichnen(spalte,reihe):
    pygame.draw.rect(fenster, ORANGE,(spalte*MULTIPLIKATOR, reihe*MULTIPLIKATOR,MULTIPLIKATOR,MULTIPLIKATOR))

# Testen der Ausgabe im Spielfenster
element_zeichnen(0,0)
element_zeichnen(1,1)
element_zeichnen(2,2)
element_zeichnen(3,2)
element_zeichnen(19,0)

Wir erhalten als Ergebnis des Zeichnens der 4 Spielelemente dann folgendes Aussehen:

Ausgabe von Steinen
Ausgabe von Steinen

Was fällt bei unseren orangen Mauersteinen auf?

  • Unsere erste Position ist bei Spalte 0 und Zeile 0
  • Unsere letzte Position ist daher nicht Spalte 20 sondern Spalte 19
  • die Mauersteine kleben aneinander und sind damit schlecht unterscheidbar

Start bei 0 ist Ok. Das ist das übliche Verhalten von den allermeisten Programmiersprachen. Wichtig ist einfach, dass man bei der Entwicklung daran denkt.

Damit wir einen guten Eindruck vom Aussehen bekommen, wird der Hintergrund in der endgültigen Farbe Weiß gezeichnet:

# genutzte Farben
ORANGE  = ( 255, 140,   0)
SCHWARZ = (   0,   0,   0)
WEISS   = ( 255, 255, 255)

# Hintergrundfarbe Fenster
fenster.fill(WEISS)

Damit die Mauersteine nicht so aneinanderkleben, lassen wir 1 Pixel Abstand.

Als Erstes erstellen wir eine neue Funktion mit dem Namen „kor“. Diese berechnet den Korrekturfaktor und gibt den korrigierten Wert zurück. Dadurch wird unsere Funktion „element_zeichnen“ deutlich übersichtlicher:

def kor(zahl):
    zahl = zahl * MULTIPLIKATOR
    return zahl

# Spielelement zeichnen
def element_zeichnen(spalte,reihe):
    pygame.draw.rect(fenster, ORANGE, [kor(spalte), kor(reihe), kor(1), kor(1)])

Und wenn wir nun die 1-Pixel-Abstände noch integrieren, sieht unser Programm wie folgt aus:

# Korrekturfaktor berechnen
def kor(zahl):
    zahl = zahl * MULTIPLIKATOR
    return zahl

# Spielelement zeichnen
def element_zeichnen(spalte,reihe):
    pygame.draw.rect(fenster, ORANGE, [kor(spalte)+1, kor(reihe)+1,kor(1)-1,kor(1)-1])

# Testen der Ausgabe im Spielfenster
element_zeichnen(0,0)
element_zeichnen(0,1)
element_zeichnen(0,2)
element_zeichnen(1,0)
element_zeichnen(1,1)
element_zeichnen(1,2)
element_zeichnen(2,0)
element_zeichnen(2,1)
element_zeichnen(2,2)

Als Ergebnis erhalten wir Mauersteine mit Abständen:

unsere ersten Mauersteine
unsere ersten Mauersteine