Nebel (Rauchentwicklung)
(Dominik Jülich)
Die Auswahl
Um eine Performante Rauchentwicklung zu erzeugen, die auch eine Dynamik hat um den Raum zeitlich verschieden mit Rauch zu füllen, wurde zuerst entschieden auf welche Weise der Nebel implementiert wird. Da Partikel sich schlecht auf die Performance auswirken würden, da bei der Größe des Levels eine ziemlich große Menge an Partikeln benötigt werden, entschied man sich dazu den Fog aus der Three.js Libary zu verwenden. Zuerst wurde geschaut wie der Fog mit der Umgebung im Level zusammen passt.
Dazu wurde zunächst mit der Three.Fog die Fog in die Scene eingebunden. Da es von der Fog zwei verschiedene Varianten gab, war es nun die Aufgabe die passende Variante herauszufinden. Die erste Variante war es die normale Three.Fog zu benutzen, in der es möglich war 2 Variabeln zu ändern, die die minimum und maximum Distanz des Nebels änderte. Die zweite möglichkeit war die FogExp2, die eine density als variable besaß um die Dichte des Nebels zu verändern. Da wir die Dichte zeitlich verändern wollten, fanden wir es für sinnvoller die FogExp2 zu nehmen. Diese haben wir dann in die scene eingebunden:
scene.fog = new THREE.FogExp2(0x424242, 0.005);
...
Der Farbwert 424242 schien als passender Grauton für eine realistische Rauchfarbe. Der zweite Wert beschreibt die "density", also die Dichte des Nebels. Je höher der Wert ist, desto weniger Sicht ist vorhanden.
fortschreitender Rauch
Da die Density durch einen Wert dargestellt wird, kam schnell die Idee für die zeitliche Entwicklung der Rauchentwicklung. Dazu wurde die Variabel "myfog" erzeugt. Diese speichert einen Startwert für die "density" des Fogs. Um diesen Wert regelmäßig zu erhöhen, entschied man sich die Fog zunächst in die Loop zu packen und sie mit einem anderen Wert zu addieren. Dadurch entstand beim Spielen schonmal die Simulation des zeitlich zunehmenden Rauches.
Startzeit: Der Raum ist ohne Rauch gefüllt.
Nach kurzer Zeit: Der Raum fängt an sich mit Rauch zu füllen.
Weit fortgeschrittene Zeit: Der Raum ist komplett von Rauch gefüllt (Nullsicht).
Rauch als weiterer Schwierigkeitsgrad
Nun folgte die Idee, den Spieler ab einem gewissen density-Wert schaden hinzu zu fügen. Dazu erzeugten wir die Variabel "HEALTH_PER_SECOND". Diese wurde standardgemäß auf 10 gesetzt. In einer Funtkion wurde es dann so gelöst, das an player.damage einen aktuellen Wert geliefert wird, der die Lebensenergie beeinflusst.
fogInterval = setInterval(function() {
if (!menu && !pause) {
player.damage(myfog / MAX_FOG) * (HEALTH_PER_SECOND / 100);
player.damage(additional_healthloose);
Als weiteres Feature zum Rauch wird eine Sounddatei abgespielt, welches Husten Darstellt. Dazu wird abgefragt ob die Fog-density einen gewissen Wert erreicht hat, welche als Grenze zum abspielen darstellt. Diese ist standardgemäß auf 0.009 gestellt, da diese Dichte als groß genug erscheint. Dies soll das "langsame ersticken" simulieren.
Raumabhängige Rauchentwicklung
Als wir die fortschreitende Rauchentwicklung implementiert hatten und den Spieler dynamisch mit dem Rauch Schaden hinzufügen konnten, haben wir uns nun Gedanken um die Idee gemacht, den Rauch raumabhängig verdichten lassen zu können. Dazu mussten wir irgendwie an die Werte der einzelnen Räume kommen und die mit dem Fog bearbeiten.
Dazu haben wir zunächst für jedes Level einen Maximumwert für die Fog-densitiy festgelegt. Dies wird erzeugt durch die Variable "MAX_FOG", welche in der Funktion createRoom festgelegt wird. Ebenso bekommt nun jeder Raum eine gewisse "fogtime", welche die Zeit des zunehmenden Rauches definiert. Aus diesen Werten kann man nun den "fogincrement" berechnen welcher sich wiefolgt berechnen lässt:
MAX_FOG = allfloors[floornumber-1].maxfog; if (godmode) {MAX_FOG = 0.005};
myfog = allfloors[floornumber-1].startfog; if (godmode) {myfog = 0.0002};
fogTime = allfloors[floornumber-1].fogtime; if (godmode) {fogTime = 1200}; //siehe oben
fogIncrement= MAX_FOG/(fogTime*1000/10) ;
Anfangslevel bei fortgeschrittener Zeit. Man sieht, das es eine Zeit lang dauert bis der Raum gefüllt ist.
Im Vergleich ist der CIP-Pool des Groundlevel beim direkten betreten komplett mit Rauch gefüllt.