Anfang

 

 2

 

Dieses Script beinhaltet nur die Lösung für ein einziges zusammenhängendes Terrain pro Level!

 

Was kann Soundmap für Terrain?

Um dem Player einen entsprechenden Sound zu geben, wenn er über verschiedene Bodenmaterialien läuft oder auch schwimmt oder fliegt, gibt es beim erstellen des Levels aus Blöcken, die Möglichkeit mit Hilfe von "trace" und "scan_texture" den Namen der Bodentextur abzufragen.

Und bei der Verwendung von Terrain? Hier steht nur eine einzige Textur zur Verfügung. Eine Abfrage wie bei Blöcken ist nicht möglich. Alternativ kann man sich behelfen indem flache Blöcke unter das Terrain gesetzt werden. Sie entsprechen der Form des Terrains, werden wieder texturiert und dann mit "scan_texture" abgefragt. Oder es werden unsichtbare Blöcke oder Mapentitys ins Level gesetzt die bei Kollision mit dem Player den entsprechenden Sound abspielen.

Das hat eine ganze Menge Nachteile. Angefangen bei dem erhöhten Aufwand des Levelbaus,wachsender Unübersichtlichkeit bis hin zur ungenauen Abfrage bei kurvenreichem Untergrund.

 

Daraus entstand die Idee einer Farbmap, eines Bildes das noch einmal das vereinfachte Level zeigt in seinen unterschiedlichen Bodenmaterialien. Die weiter unten downloadbare colormap.wdl enthält alle nötigen Funktionen. Die darin enthaltenen Definitionen der Farben und Sounds beziehen sich auf dieses Beispielterrain und können individuell von euch geändert und beliebig erweitert werden.

Aber in der Idee einer colormap für Terrain steckt noch mehr. So kann z.B. eine Farbe als Levelbegrenzung dienen. Läuft der Player über diese Farbe wird er zurückgedrängt und kann nicht passieren. Ideal für sehr verwinkelte Terrains, wo eine Levelbegrenzung aus Blöcken ziemlich aufwändig wäre.

 

Das erste Bild zeigt die Textur (Skin) desTerrains. Original ist es 1400x1000 Pixel groß. Ich habe darauf selbst die Wege gezeichnet. (Nur 10 Pixel breit.)

 

 

Diese Terraintextur dient nun als Vorlage für eine colormap (nächstes Bild) die hier die Funktion einer "soundmap" hat. Anmerkung zur Größe der colormap. Würde ich diese genauso groß wie die Textur des Terrains erstellen, also auch 1400x1000 Pixel bedeutet das ungefähr 100kb komprimiert oder 4MB unkomprimierten Festplattenplatz aber ! 8MB Arbeitsspeicher bei geöffnetem Bild. Deshalb empfehle ich bei einem Game mit einem Terrain, das Bild für die colormap bis maximal 1400x1400 1:1 zur Terraintextur beizubehalten. Habt ihr größere Terraintexturen oder viele verschiedene Terrains in den unterschiedlichen Leveln dann die Größe der colormap kleiner halten. Also z.B. Terraintextur 1000x1000 pixel  =  colormap 500x500 pixel (Verhältnis 2:1). Bitte immer ganzzahlige Verältnisse nehmen (1:2, 1:3, 1:4...)! Die Genauigkeit der Soundzuweisung zum Terrainuntergrund nimmt mit immer größeren Verhältnissen ab. Abgespeichert wird das colormap bild als *.tga File mit 24bit Farbtiefe. (16.7Mill. Farben).  Geringere Farbtiefen funktionieren auch aber die einzelnen Farbwerte sind dann nicht so einfach vom Zeichenprogramm zum Script zu adaptieren.

ANMERKUNG: Ich habe auch 24bit bmp und pcx Bilder getestet. Diese wurden jedoch von der A6 Engine auf 16bit runtergerechnet. Dadurch stimmten die Farbwerte nicht mehr mit dem Script überein.

 

 

Im Bild oben ist nun zu sehen was für verschiedene Untergründe diese colormap für das Terrain darstellen soll. Definiert soviele Farben wie benötigt werden. Ich brauchte halt erst mal nur fünf. Darauf achten das die Farben sich nicht vermengen durch Glättung oder Antialiasing. Das gilt vor allem wenn ihr die colormap nach der Erstellung verkleinert. Die hier dargestellten fünf Farben sind in der colormap.wdl integriert. Um das alles zu testen ist es am besten ihr malt eure "soundmap" erst mal mit diesen Farben an um zu sehen wie es funktioniert. Später könnt ihr euch dann alles so erweitern wie ihr es braucht.

 

 

Wenn die colormap bemalt wird ist es wichtig den RGB Wert der benutzten Farbe zu wissen. R = Rot G = Grün B= Blau sind die 3 Anteile aller möglichen Farben. Sie reichen je Farbteil von 0 - 255 (256x256x256 =  16777216 Farben, deshalb muß das Bild 24 bit haben). Der Untergrund für die Berge ist hier Blau (Blue, die Namen sind frei wählbar. Habe ich nur für spätere Englischübersetzung so gewählt. BLUE setzt sich aus R = 000 G = 000 B = 255 Farbteilen zusammen. Diese 3x3 RGB Werte müssen mit dem von euch gewählten Farbnamen aufgeschrieben werden.

 

 

Die colormap wird nun in euer 3DGS Arbeitsverzeichnis abgelegt. In das gleiche Verzeichnis in dem auch alle anderen Bilder des Levels/Games liegen.

Als nächstes wird die hier mitgelieferte colormap.wdl per include in euere "main.wdl" mit eingebunden. Und zwar vor den WDL's die Player- und Actor movement beinhalten.

 

 

 

Nun den WED öffnen und die colormap.tga (oder wie auch immer diese Farbmap Datei bei euch heißen mag) in das Level mit dem Terrain laden. OBJEKT --> ADD SPRITE .

Die colormap soll ja nicht gesehen werden und nicht im Weg stehen. Deshalb invisible & passable Flag anklicken. Das Bild an einen Teil innerhalb des Levels ablegen wo es nicht stört. Die Ausrichtung ist egal. Vielleicht gleich unter das Terrain.

 

 

 

Jetzt der colormap die "get color" Aktion zuweisen.

 

 

Das Terrain bekommt die Aktion "terrain_colmap". Außerdem wird der SCALE wert des Terrains noch einmal in seinen Skill1 geschrieben. In Skill2 kommt das Größenverhältnis des colormap bildes zur Originalgröße der Terraintextur. Ist diese 1:1 also gleich groß muß hier gar nichts eingeschrieben werden. Ist die colormap kleiner als die Terraintextur, z.B 1:2, dann hier eine '2' eintragen (1:3 dann '3' eintragen, 1:4 dann '4' eintragen...).

 

 

Das war alles was im WED zu tun ist.

 

Benutzung der colormap wdl

Hier ein Beispiel wie eine Farbe der colormap definiert wird. Genauso macht ihr es mit den anderen Farben euer eigenen colormap. Der colorvektor 'RED_cv' enthält den im Malprogramm gemerkten RGB Wert. Darunter wird noch eine Variable definiert die als Schalter dient. Diese ist bei RED immer dann == 1 wenn der RGB Wert des colorvektors RED gleich der aktuellen Farbe auf der colormap ist. Dann ist eine Bedingung erfüllt den Berge/Mountains Sound abzuspielen.

Die dritte Zeile enthält die Definition des wave Sounds. Am Schluß kommt dann noch eine Variable die das Handle des Soundes speichert. Das ist soetwas wie eine einmalige Identitätsnummer des Soundes. Diese wird gebraucht um den Sound jeweils bis zum Ende spielen zu lassen und auch ordentlich zu beenden.

 

 

In der Funktion "sound_instruct" wird gleich zu Anfang der Vergleich der colorvektoren mit der colormap (das Sprite im WED) durchgeführt. Zum ersten müssen die Farben übereinstimmen, zum zweiten darf der Sound gerade nicht spielen und zum dritten muß sich der Player bewegen. Ist das alles der Fall wird der entsprechende Sound mit den eingestellten Werten abgespielt.

 

 

Die anderen Funktionen managen die Anpassung der aktuellen Playerposition auf dem Terrain zur entsprechenden Position auf der colormap.

WICHTIG für Levelwechsel!!!

Der Pointer für die colormap mymap MUSS bei einem Levelwechsel auf NULL gesetzt werden. Sonst gibt es einen Absturz. Hier im Bild die Aktion wo er mit der aktuellen colormap gefüllt wird.

 

 

Hier das kurze Beispiel eines Levelwechsels um zu zeigen wie der Pointer auf NULL gesetzt werden kann.

 

 

Zum Schluß die Anbindung des ganzen an den Player.

Ich kann nur zeigen wie ich es bei mir gemacht habe. Das nächste Bild zeigt das Ende meiner eigenen "player_move" Funktion. Dort rufe ich die "sound_on_terrain" funktion auf, die sich mit in der colormap.wdl befindet. Diese Funktion berechnet eine interne Playerposition und bringt sie in Übereinstimmung mit der colormap. Danach wird von der "sound_on_terrain" Function zur "sound_instruct" Funktion gewechselt. Diese vergleicht einen colorvektor mit der aktuellen Farbe auf der sich die interne Playerposition befindet, mit den von der Colormap definierten Colorvektoren. Sind diese gleich und der Player bewegt sich (walk_sound_switch == 1) wird der passende Sound abgespielt. Solange bis entweder ein neuer Sound den alten ersetzt oder der Player sich nicht bewegt. (walk_sound_switch ==0). In meiner eigenen Funktion "player_animation", die auch aus der player_move startet, wird diese "walk_sound_switch" Variable in den "walk" und "stand" Animationen verabeitet. Ich habe einen Teil meines Animationsscriptes in der colormap.wdl mit unten hineingesetzt. Er soll lediglich als Anleitung dienen. Ich habe im Script *.wav Files aus dem Template Verzeichnis verwendet, die natürlich überhaupt nicht zum Untergrund passen. Aber ich habe zur Zeit keine besseren und mußte ja etwas zum testen haben.

 

 

So und hier die colormap.wdl zum DOWNLOAD

 

August 2004: Manche von euch haben Probleme mit dem verstehen dieses Tutorials. Andere möchten nur die Farbe unter den Füßen des Players um ihre eigenen Funktionen anzuhängen. Deshalb hier nochmal das ganze ohne den Soundteil.

 

tercolor.wdl

DOWNLOAD

 

Auf der nächsten Seite findet ihr zwei weitere Beispiele um die Möglichkeiten der Colormap zu demonstrieren!

 

2