[[http://www.siedler-games.de|{{:sg-link.jpg|}}]]
====== Eigene GFX-Sets ======
Dieses Tutorial soll eine kurze Einführung in das Thema GFX-Set bieten. Es wird erklärt, was überhaupt ein GFX-Set ist, wofür man es braucht und wie man sich eigene Sets schreiben kann.
===== GFX-Set? =====
Das Wetter, Licht und Schatten und der Entfernungsnebel werden durch die sogenannten GFX-Sets gesteuert. Jeder ist damit schon einmal in Kontakt gekommen, aber vermutlich hast du dir da nie große Gedanken drüber gemacht. In jeder Map muss in der Funktion InitWeatherGfxSets() ein GFX-Set angeben werden, zum Beispiel könnte das so aussehen:
function InitWeatherGfxSets()
SetupNormalWeatherGfxSet()
end
Wie du sicher weißt, kannst du nicht nur "normales" Wetter angeben, sondern auch "Highland", "Steppe", "Evelance", "Mediterranean" und "Moor". Je nachdem welches Set du wählst, sieht die Spielwelt anders aus. Evelance ist düster während Highland etwas kühler wirkt. Ein GFX-Set spielt also für die Umgebung und die Stimmung in der Spielwelt eine herausragende Rolle.
===== Das Wetter =====
Es gibt drei Arten von Wetter: Normal, Regen und Schnee. Diese Wetterlagen werden durch IDs gekennzeichnet und haben bekannterweise auch Auswirkungen auf die Spielwelt:
^ID^Wetter^Effekte^
|1|normal|keine|
|2|Regen|80% Sichtweite für Gebäude und Siedler, 5% Wahrscheinlichkeit, dass Projektile nicht treffen|
|3|Schnee|85% Bewegungsgeschwindigkeit für Siedler, 2% Wahrscheinlichkeit, dass Projektile nicht treffen|
Ein Wetterwechsel geschieht nicht sofort, sondern dauert eine bestimmte Zeit an. Diese Information wird später noch Bedeutung haben. Die folgende Tabelle zeigt, wie lange ein Wetterwechsel jeweils dauert:
^Neue Wetterlage^Vorlaufzeit^Dauer des Wetterwechsels^
|normal|5 Sekunden (4 Sekunden mit Wetterturm)|10 Sekunden (8 Sekunden mit Wetterturm)|
|Regen|5 Sekunden (4 Sekunden mit Wetterturm)|10 Sekunden (8 Sekunden mit Wetterturm)|
|Schnee|5 Sekunden|10 Sekunden|
==== Visuelle Wettereffekte ====
Interessanterweise sind die Wetterlagen aber **nicht** dafür verantwortlich, ob es auch wirklich regnet oder schneit. Diese sichtbaren Effekte sind ein Teil des gewählten GFX-Sets. Es sind wiederum drei Effekte zu unterscheiden:
* Regen-Effekt
* Schneefall-Effekt
* Schneebedeckte Landschaft und vereistes Wasser
Wir werden später sehen, dass dieses Effekte beliebig kombiniert werden können (z.B. Schneeregen bei grüner Landschaft).
==== Licht und Schatten ====
Die Siedler-Welt wäre ziemlich dunkel, würde es keine virtuelle Sonne geben. Im Gegensatz zur realen Welt, kann man die Siedlersonne verschieben und die Farbe ihres Lichtes verändern. Je nach Einstellung wirkt das Licht heller oder dunkler und Schatten länger oder kürzer.
==== Der Nebel ====
In der Regel ist die Siedler-Welt recht vernebelt, wenn man versucht in die Ferne zu schauen. Besonders deutlich wird dies, wenn es regnet. Dann bildet sich ein weiß-grauer Schleier, der die Sicht behindert. Die Intensität und sogar die Farbe dieses Nebels kann über ein GFX-Set gesteuert werden.
===== Ein GFX-Set erstellen =====
Ein GFX-Set erstellt man mit einer ganzen Reihe von Funktionsaufrufen aus dem **Display**-Table. Für jede Wetterlage müssen die Werte für die visuellen Wettereffekte, Licht und Nebel gesetzt werden. Diese Einstellungen "verpacken" wir in einer Funktion namens SetupXXXWeatherGfxSet(), wobei XXX für einen freiwählbaren Namen steht (z.B. SetupAbendrotWeatherGfxSet()).
Zuallererst muss dem Spiel gesagt werden, dass überhaupt GFX-Sets verwendet werden sollen (es geht nämlich auch ohne, aber das ist ein anderes Thema). Das geschieht mit dem Aufruf von **Display.SetRenderUseGfxSets(1)**:
function SetupXXXWeatherGfxSet()
Display.SetRenderUseGfxSets(1)
end
Die folgenden Schritte müssen für jede Wetterlage gemacht werden. Es muss also jeweils die **WeatherID** durch 1, 2 bzw. 3 ersetzt werden. Ebenso tauchen immer wieder die Parameter **TransitionStart** und **TransitionEnd** auf. Die Werte dieser Parameter müssen zwischen 0.0 und 1.0 liegen, wobei gilt: TransitionStart < TransitionEnd. Sie geben an, wann und wie lange ein Effekt während des Wetterwechsels auftritt.
**Beispiel**: Der Wetterwechsel von normal nach Schnee dauert 10 Sekunden. Der Schneefall soll genau 2 Sekunden nach dem Beginn des Wechsels beginnen und nach weiteren 6 Sekunden seine volle Intensität erreichen. TransitionStart muss dafür auf den Wert 0.2 gesetzt werden und TransitionEnd auf 0.8.
==== Wettereffekte ====
Um Regen, Schneefall und Schneetexturen/Eis an oder auszuschalten benutzt man diese Funktionen:
-- Regen
Display.GfxSetSetRainEffectStatus(WeatherID, TransitionStart, TransitionEnd, Flag)
-- Schneefall
Display.GfxSetSetSnowEffectStatus(WeatherID, TransitionStart, TransitionEnd, Flag)
-- Schneetexturen/Eis
Display.GfxSetSetSnowStatus(WeatherID, TransitionStart, TransitionEnd, Flag)
Um den entsprechenden Effekt einzuschalten, muss **Flag** auf 1 gesetzt werden. Um ihn auszuschalten, setzt man **Flag** auf 0.
==== Licht ====
Das Licht wird mit dieser Funktion eingestellt:
Display.GfxSetSetLightParams(WeatherID, TransitionStart, TransitionEnd,
PositionX, PositionY, PositionZ,
AmbientR, AmbientG, AmbientB,
DiffuseR, DiffuseG, DiffuseB)
**PositionX, PositionY, PositionZ** gibt die Position der Lichtquelle (der Siedlersonne) an. Die Werte sollten ganze Zahlen sein (auch negative Zahlen sind möglich). Wenn man ein wenig mit den Werten experimentiert, kommt man schnell hinter das System.
**AmbientR, AmbientG, AmbientB**, ist die Farbe des Umgebungslicht (also das Licht, welches nicht direkt von der Lichtquelle kommt). Die Farbe wird im RGB-Format angegeben (Ganzzahlen zwischen 0 und 255). Dieses Licht ist überall gleich stark.
**DiffuseR, DiffuseG, DiffuseB** ist die Farbe des Lichtes, welches von der Lichtquelle direkt abgegeben wird.
==== Nebel ====
Der Entfernungsnebel wird über diese Funktion eingestellt:
Display.GfxSetSetFogParams(WeatherID, TransitionStart, TransitionEnd, Flag,
ColorR, ColorG, ColorB,
FogStart, FogEnd)
**Flag** gibt an, ob überhaupt Nebel dargestellt werden soll. Wie üblich bei Flags muss hier 0 oder 1 angegeben werden.
**ColorR, ColorG, ColorB** gibt die Farbe des Nebels im RGB-Format an.
**FogStart, FogEnd** gibt an, in welcher Entfernung (Siedlerzentimeter) der Nebel sichtbar ist. Werte zwischen 2000 und 30000 sind üblich.
==== Skybox (Himmel) ====
Der Himmel ist normalerweise gar nicht sichtbar. Er taucht aber in Cutscenes und Briefings auf.
Display.GfxSetSetSkyBox(WeatherID, TransitionStart, TransitionEnd, SkyBoxName)
Es gibt eine ganze Reihe von Himmeln zur Auswahl:
^SkyBoxName^Bevorzugte Wetterlage^
|YSkyBox01|Schnee|
|YSkyBox02|normal|
|YSkyBox03|normal|
|YSkyBox04|Regen|
|YSkyBox05|normal|
|YSkyBox06|normal|
|YSkyBox07|normal|
===== Beispiel =====
FIXME Wenn jemand irgendein schönes GFX-Set erstellt hat, bitte hier als Beispiel einfügen und das alte inklusive diesem Hinweis entfernen.\\
Mal ein Versuch Tag und Nacht zu Simulieren \\
Habe meinen Link gelöscht, weil der Aufruf verweigert wird \\
Peermanent
Dies hier ist das GFX-Set, welches für Evelance verwendet wurde:
function SetupEvelanceWeatherGfxSet()
-- GFX-Sets aktivieren
Display.SetRenderUseGfxSets(1)
-- normal
Display.GfxSetSetSkyBox(1, 0.0, 1.0, "YSkyBox07")
Display.GfxSetSetRainEffectStatus(1, 0.0, 1.0, 0)
Display.GfxSetSetSnowStatus(1, 0, 1.0, 0)
Display.GfxSetSetSnowEffectStatus(1, 0.0, 0.8, 0)
Display.GfxSetSetFogParams(1, 0.0, 1.0, 1, 38,48,58, 4000,10500)
Display.GfxSetSetLightParams(1, 0.0, 1.0, 40, -15, -50, 136,144,144, 128,104,72)
-- Regen
Display.GfxSetSetSkyBox(2, 0.0, 1.0, "YSkyBox04")
Display.GfxSetSetRainEffectStatus(2, 0.0, 1.0, 1)
Display.GfxSetSetSnowStatus(2, 0, 1.0, 0)
Display.GfxSetSetSnowEffectStatus(2, 0.0, 0.8, 0)
Display.GfxSetSetFogParams(2, 0.0, 1.0, 1, 38,58,68, 4000,8000)
Display.GfxSetSetLightParams(2, 0.0, 1.0, 40, -15, -50, 136,144,144, 128,104,72)
-- Schnee
Display.GfxSetSetSkyBox(3, 0.0, 1.0, "YSkyBox01")
Display.GfxSetSetRainEffectStatus(3, 0.0, 1.0, 0)
Display.GfxSetSetSnowStatus(3, 0, 1.0, 1)
Display.GfxSetSetSnowEffectStatus(3, 0.0, 0.8, 1)
Display.GfxSetSetFogParams(3, 0.0, 1.0, 1, 108,128,138, 2000,9500)
Display.GfxSetSetLightParams(3, 0.0, 1.0, 40, -15, -50, 116,144,164, 255,234,202)
end
===== FIXME =====
* Man sollte stärker zwischen Wetter-ID und GFX-Status-ID unterscheiden: Zwar werden sie im Spiel normalerweise identisch verwendet, aber während die Wetter-Status nur die Zahlen 1 - 3 belegen, sind GFX-Status von 1 - 6 möglich.
* Ich habe wohl gemerkt, dass auch mehrere GFX-IDs möglich sind, aber macht es Sinn 4-6 zu verwenden? Wenn nicht, ist es auch nicht erwähnenswert und man sollte es der Einfachheit halber dabei belassen
* Vielleicht ist es doch ganz sinnvoll, wenn man etwas mehr Abwechslung in das Wetter bringen will. So wäre es zum Beispiel mithilfe zweier GFX-Status, im Winter auch mal kurz den Schneefall aussetzen zu lassen. Das wäre doch eine tolle Abwechslung, oder? Ich meine, mich noch an eine Map im Hauptspiel zu erinnern, in der genau das der Fall war. Man müsste natürlich die Funktion Logic.AddWeatherElement() erklären...
* Ja ok, das wäre natürlich eine Möglichkeit. Werde das dann noch irgendwann ergänzen.
* Mir fiel auf, dass man mehr als 6 Gfx-IDs verwenden kann. (Bis neunzehn bei Legenden in der Gold Edition(Version 1.05) getestet.)