8tes Aufgabenblatt

Es geht hier um Strukturen und Strukturparameter.

Präliminärien:

Wir verwenden dieses Rahmenprogramm steam.cpp innerhalb der Bibliothek ASCII-Gfx. Das Programm stellt ein Spielfeld mit einer sich bewegenden Lok bereit, die wir im Folgenden aufhübschen wollen.

Programmieraufgabe P1:

Wir wollen einen Hintergrund für die Lok zeichnen. Definieren Sie eine Datenstruktur, welche den Hintergrund als Ansammlung von Objekten an bestimmten Positionen und mit unterschiedlichem Aussehen und Größe beschreibt. Es sollen folgende Objekttypen vorkommen:

  1. Tannenbäume
  2. Haus vom Nikolaus
  3. Strichmännchen (könnten sich bewegen, müssen aber nicht)

Die Datenstruktur ist also ein Strukturarray mit folgenden Unterelementen:

  • int type (Werte 1–3 bzw. enum)
  • Vector2D pos
  • float size

Schreiben Sie Code für die Definition obiger Datenstruktur. Definieren Sie n=30 zufällige Elemente. Zufallswerte erhält man mit rand(), z.B. im Bereich 3–10 via 3+rand()%8, siehe auch rand_range().

Programmieraufgabe P2:

Innerhalb des Game Loops rufen Sie analog zu render_rails() eine Zeichenroutine render_background() auf, die das jeweilige zu zeichnende Objekt des Strukturarrays an die Zeichenroutine render_object() übergibt, die wiederum in Abhängigkeit vom Objekttyp die Funktionen render_tree(), render_this_is_the_house_of_santa_clause() und render_stickman() aufruft. Diese zeichnen das jeweilige Objekt mit der vorgegebenen Größe als einfache Liniengrafik (render_line).

Beispiel für eine Tanne:

void render_tree(Vector2D pos, float size)
{
   render_line(pos.x, pos.y, pos.x, pos.y-size/3);
   render_line(pos.x-size/3, pos.y-size/3, pos.x+size/3, pos.y-size/3);
   render_line(pos.x-size/3, pos.y-size/3, pos.x, pos.y-size);
   render_line(pos.x+size/3, pos.y-size/3, pos.x, pos.y-size);
   // flood_fill(pos.x, pos.y-size/3-1, '*');
}

Optionale Programmieraufgabe P3:

Man könnte nun im Hintergrund Parallax-Scrolling verwenden, um die Silhouette einer Gebirgslandschaft darzustellen. Ein Gebirge kann man z.B. mit sog. Perlin-Noise modellieren, welcher die Variation von natürlichen Strukturen nachbilden kann. Man kann aber natürlich auch einfach nur ein paar zufällige Gebirgszacken zeichnen. Diese Gebirgslandschaft müsste wegen der größeren Entfernung nur mit halber Geschwindigkeit gescrollt werden. Dies kann man mit einem weiteren Sprite realisieren, der im Hintergrund gezeichnet wird (background_sprite()) und dessen Position sich langsam in Abhängigkeit von der aktuellen Scrollposition (get_window()) verändert.

Checkliste

  • Wieviele Möglichkeiten gibt es für das Haus vom Nikolaus?
  • Welches Aufrufschema wird bei render_tree() verwendet?
  • Welches Aufrufschema sollte man für render_object() verwenden und wieso?
  • Was ist mit der constness der Parameter?


Options: