# Basiskonzepte

| Bestandteile eines Level
| Levelstrukturen und Aufteilung
| Raumstrukturen
| Bewegungsbereiche
| Prinzip der Strahlenverfolgung
| Zusammenfassung

Übersicht

## Bestandteile eines Level

Ein vollständiger Level besteht aus:

1. Levelstruktur
   - Raumstrukturen (Wände, Zäune, Türen, Lifte)
   - Bewegungsbereiche

2. Bewegliche Elemente
   - Gegner
   - Bewegliche Züge/Wagen

3. Extras
   - Specials (z.B. Beamer, Lasersperre)
   - Gegenstände (Medizin, Munition, ...)

4. Missionsstruktur
   - Missionsbriefing
   - Startpunkt
   - Level-Ausgang
   - Primäre und sekundäre Mission

Aufteilung in Sektoren

## Levelstrukturen und Aufteilung

Aufteilung in Sektoren. Ein Level als größte Komponente wird aus kleineren Einheiten gebildet - den Sektoren. Diese Einteilung ist aus zweierlei Hinsicht sinnvoll. Zum einen ermöglicht die feinere Granularität der Engine nur die Sektoren (also Teilbereiche) eines komplexen Levels zu berechnen, die gerade relevant (bzw. sichtbar) sind. Andere Sektoren werden ignoriert und kosten keine Rechnenzeit. Beispiel: befinde ich mich im Badezimmer, macht es keinen Sinn, die Kellerräume zu berechnen (z.B. zu drehen und auf Sichtbarkeit zu überprüfen). Auf der anderen Seite vereinfachen kleine Sektoren die Eingabe und Pflege.

Eingabe | Eingabe. Jede Levelstruktur (und damit jeder Sektor) setzt sich aus Raumstrukturen und Bewegungsbereichen zusammen. Beides wird im Leveleditor im Sektorfenster eingegeben. Die Sichtweise auf den Level in der Konstruktionsphase ist zweidimensional (siehe Abschnitt Running ist zweidimensional). Wir arbeiten dabei in vielerlei Hinsicht wie ein Architekt. Grundrißpläne mit Linien gibt es auch in Running. Letztendlich besteht ein Running-Level nur aus Punkten und Linien. Aus dieser Grundrißzeichnung berechnet die Running-Engine ein 3D-Bild; auch der Leveleditor kann solche Bilder berechnen (etwas langsamer, aber immerhin) - die Preview-Ansicht, die es uns erlaubt einen ersten Eindruck von unseren Gebäuden, Wänden usw. zu bekommen.

Raumstrukturen

Raumstrukturen (Walls, doors, lifts). Dazu gehören z.B. Wände und Türen. Wie sieht der Raum aus ? Wieviele Wände hat er ? Soll in der Mitte des Raumes eine Kiste stehen ? Wo sind die Türen ? Die Raumstrukturen werden durch Linien repräsentiert. Man definiert sich einen Start- und einen Endpunkt. Beide Punkte verbindet man mit einer Linie. Schon ist die Wand fertig - natürlich nur mit Standardeinstellungen. Über die Eigenschaften dieser Linie (aka Wand) kann man festlegen, welche Textur auf diese Wand gemalt werden soll, oder wie hoch die Wand ist. Ein Sektor mit Raumstrukturen könnte im Editor so aussehen:

Bewegungsbereiche (Sector fields)

Bewegungsbereiche (Sector fields). Schön, doch woher soll die Engine wissen, wo sich der Spieler bewegen darf ? Ist doch kein Problem, oder ? Nun, Kollisionsabfrage ist niemals easy. Es gibt hierfür sicherlich elegantere Konzepte, aber wir haben uns in grauer Vorzeit dafür entschieden, extra zu definierende Bewegungsbereiche zu verwenden. Zusätzlich zu den später im Spiel sichtbaren Raumstrukturen (Wände) legen wir mit diesen (später unsichtbaren) Strukturen fest, wo sich der Spieler bewegen darf und auf welcher Höhe er sich gerade befindet.

Also: wie ein Raum aussieht und wo ich mich bewegen darf sind zwei unterschiedliche Konzepte.

Das führt zu zusätzlichem Editieraufwand, ermöglicht jedoch auch ein paar interessante Spielereien (Wände, die man durchlaufen kann; Schweben über dem Boden, ...).

Definition Bewegungsbereiche

Definition der Bewegungsbereiche. Jeder Sektor benötigt mindestens einen Bewegungsbereich (auch: Laufbereich). Für jeden Laufbereich legt man fest, wie hoch der Boden ist und wie hoch der Raum in diesem Bereich ist. Und was wenn in der Mitte eine Kiste steht ? Tja, dann muß man um die Kiste herum mehrere Laufbereiche (grün) definieren, und einen für die Kiste (höherer Boden, rot).

Die schwarzen Linien bilden die Raumstruktur. Die Laufbereiche haben etwas Abstand von der Wand, damit der Spieler nicht direkt an die Wand läuft. Die Engine wertet diese die Bereiche aus und kann feststellen, in welchen Bereich und damit auf welcher Höhe sich der Spieler gerade befindet. Kommt er an die Kiste, bleibt die Spielfigur davor stehen - er muß den Höhenunterschied durch einen Sprung überwinden.

Details Bewegungsbereiche

Details zu Bewegungsbereiche. Die Grafik zeigt auch: Laufbereiche dürfen sich überlappen. Die Rechtecke müssen konvex sein. D.h. daß man von jeder Seite des Rechtecks zu jeder anderen Seite gelangen kann, ohne eine andere Linie des Rechtecks zu schneiden. Punkte, Linien und die Bereichsdefinition führt man in einem speziellen Modus durch.

Die folgende Grafik zeigt den Raum mit den grünen Bewegungsbereichen:

Running ist 2 1/2 dimensional

## Umwandlung der 2D-Pläne in die 3D-Ansicht - das Prinzip der Strahlenverfolgung

Running ist 2 1/2 dimensional. Wie bitte? Jawohl, die Running-Engine ist keine reinrassige 3D-Engine. Freie 3D-Drehungen gibt es nicht (wie z. B. in Tomb Raider). Wie bereits geschildert, geben wir alle Wände mit Linien in einer 2D-Sicht ein. Alle Räume werden von oben betrachtet und editiert. Doch wie wandelt die Engine solche Strukturen in 3D-Bilder um? Ein Beispiel:

Sehstrahlen

Sehstrahlen. Stellen Sie sich einen rechteckigen Raum vor, in dem auch eine Kiste steht.

Die Spielfigur, bzw. der Standort des Betrachters, ist im linken unteren Raumteil (durch roten Pfeil dargestellt). Der Betrachter schaut nach Norden. In der Running Engine hat der Betrachter einen Blickwinkel von genau 90 Grad. Das Bild, das der Betrachter sieht, soll auf einem Bildschirm mit einer Auflösung von 320 mal 200 Bildpunkten ausgegeben werden. Der Blickwinkel von 90 Grad entspricht also den 320 senkrechten Strahlen (X-Auflösung) in horizontaler Richtung.

Jeder einzelne der 320 Strahlen (Sehstrahlen) wird in den Raum hinein verfolgt. Dazu wird der Strahl (als Linie) ins "Unendliche" verlängert und mit allen Raumlinien geschnitten. Schneiden sich ein Sehstrahl (z.B. der erste, ganz rechts) und z.B. eine Wandlinie, merkt sich der Algorithmus die Entfernung, in der sich die Wand sich vom Betrachter befindet. Da die 320 Sehstrahlen den 320 Bildschirmspalten entsprechen, füllt die Engine die Bildschirmspalten mit Grafikinformationen in spaltenform auf - jeweils die Informationen, die sich aus dem Schnitt von Strahl und Wand ergeben haben. Letztendlich besagt der Schnittpunkt zwischen Wand und Sehstrahl in unserem Beispiel, daß sich in der Spalte 1 des Bildschirms eine Spalte einer Wand befindet - mit einer bestimmten Anfangshöhe, Endhöhe und Textur.

Die Engine stellt fest, welche Linie sie getroffen hat und fragt ihre Texturinformationen ab. Je weiter sich der Linienschnittpunkt vom Betrachter entfernt befindet, desto kleiner wird der Wandausschnitt - genauer: die einzelne Spalte der Wand - dargestellt. Diesen Vorgang wiederholt man für alle Sehstrahlen (320 mal) und erhält dadurch einen räumlichen Eindruck. Die folgende Grafik zeigt das Ergebnis dieser Vorgehensweise; die Texturinformationen und die Kiste werden noch nicht berücksichtigt, die Wand sei schwarz.

Erweiterung durch Höhe

Erweiterung durch Höhe. Eine 3D-Engine, die auf diesem Prinzip basiert ist die Wolfenstein-3D Engine. Die Idee des zwei-dimensionalen Linienschneidens wurde für die Running Engine erweitert, indem jeder Raumwand eine zusätzliche Information über ihre Höhe mitgegeben wird.

Jetzt können wir auch die Kiste darstellen. Ist die vordere Kistenwand nur 40 Prozent einer normalen Wand hoch, dann ist auch der zugehörige gezeichnete vertikale Grafikstrahl nur 40 Prozent so hoch wie eine normale Wand. Zeichnet man auch alle Wände, die auf der Rückseite getroffen werden (hinten, links, rechts), dann entsteht unten abgebildete graue Kiste.

Erweiterung durch Wandattribute

Erweiterung durch Wandattribute. Den Wänden kann man neben ihrer Höhe weitere Attribute wie Boden- und Deckenfarbe sowie Texturinformationen hinzufügen. Für unser Beispiel gehen wir von einfarbigen Wänden aus - vorerst.

Bauen wir unsere Szene nun noch ein wenig aus. Wir möchten eine graue Wand, eine braune Kiste mit einem roten Deckel. Die Farbe des Bodens soll schwarz sein, die Decke ist weiß.

Die folgende Tabelle faßt die bisher angesprochenen vier Attribute einer Wand (Linie) nochmal zusammen:

Bodenfarbe | Wenn die Linie von einem Sehstrahl getroffen wird, wird von der Bildschirmunterkante bis zum Anfang der Wand ein Grafikstrahl in der angegebenen Farbe gezeichnet.
Deckenfarbe | Wird die Linie von einem Sehstrahl getroffen, so wird vom Ende der Wand bis zur Bildschirmoberkante ein Grafikstrahl in der angegebenen Farbe gezeichnet.
Wandfarbe (Vorderseite) | Der Grafikstrahl, der die Wand repräsentiert, wird in dieser Farbe gezeichnet.
Wandfarbe (Rückseite) | Wird die Wand von der Rückseite getroffen, so gibt es zwei Fälle. Gehört zur Linie auch Boden, so wird von der Bildschirmunterkante bis zum Ende der Wand diese Farbe gezeichnet. Gehört zur Linie auch Decke, so wird vom Anfang der Wand bis zur Bildschirmoberkante diese Farbe gezeichnet.

Für unsere Beispielszene legen wir die Attribute folgendermaßen fest. Bitte beachten Sie die Definition der Attribute für die Kiste (die ist nämlich gleich ein Sonderfall !).

Raumwände Farbe (Vorderseite): grau
Bodenfarbe: schwarz
Deckenfarbe: weiß, keine Farbe für die Rückseite.
Kistenwände Farbe (Vorderseite): braun, Bodenfarbe: schwarz, keine Deckenfarbe, Farbe (Rückseite): rot.

Zusammensetzen und Farbe

Zusammensetzen und Farbe. So, jetzt die Kür in Farbe ! Betrachten wir nun die Berechnung für unseren ersten Sehstrahl auf der rechten Seite (1). Der Strahl trifft genau drei Linien: Die Wand, die Rückseite der Kiste sowie die Vorderseite.

Die graue Wand hat eine weiße Decke und einen schwarzen Fußboden, die Kiste (Vorderseite) hat eine braune Farbe mit einem schwarzen Fußboden. Aufgrund der Attribute der Rückseite der Kiste ergibt sich ein roter Strahl, der jedoch nicht bis zur Oberkante reicht. Wichtig ist nun, das die Grafikstrahlenbestandteile in der richtigen Reihenfolge übereinandergelegt werden. Die Reihenfolge ergibt sich aus der Entfernung. Das Ergebnis zeigt die obige Grafik auf der rechten Seite.

Wird dieses Prinzip für alle 320 Strahlen angewendet, ergibt sich das fertige 3D-Bild.

Zusammenfassung

## Zusammenfassung Basiskonzepte

- Ein Level besteht aus ein oder mehrern Sektoren. Sektoren teilen den Level in kleine, überschaubare Teile auf.
- Pro Sektor legt man erstens die Raumstrukturen (Wände, Kisten, Stufen, Türen, ...) mit Linien und Punkten fest; und zweitens die Bewegungsbereiche (Höhe und Kollisionsbereich), damit sich der Held auch immer auf der richtigen Höhe im Spiel befindet (z.B. Kiste) und nicht durch Wände laufen kann (könnte auch beabsichtigt sein)
- Pro Wand müssen Attribute wie Textur, Boden- und Deckenfarbe, usw. eingestellt werden.
- Die Engine berechnet aus den 2D-Karten dreidimensionale Ansichten durch Strahlenverfolgung.

Back | Home | Info | Concepts | Workshop | Reference | Next