Morgen. In den letzten Tagen hab ich eine relativ witzige Starfield Simulation zusammengeschustert, welche ich euch nicht vorenthalten will. Das besondere an dieser Starfield Simulation ist, das die Geschwindigkeit der Darstellung nicht von der Anzahl der Sterne abhänig ist, was bei den meisten, gängigen Starfield Simulationen der Fall ist.


Anstatt jeden Stern einzeln zu zeichnen erstelle ich am Anfang des Programms 30 relativ große Sprites in denen eine größere Anzahl von Sternen abgebildet ist. Diese werden dann mit Hilfe einer Funktion gezoomt, welche vom Strahlensatz abgeleitet ist, um so die Illusion von Dreidimensionalität zu erzeugen. Desweiteren werden diese Sprites immer öfters gezeichnet umso näher sie der Kamera kommen um einen Motion Blur Effekt zu erzeugen.
Um das ganze zu realisieren brauchen wir folgende Funktionen:
SCR_CreateStarfield:
Diese Funktion erzeugt das Starfield Objekt.
SCR_Starfield_Step
Diese Funktion manipuliert das Starfield während des Step Events
SCR_Starfield_Draw
Ihr dürft raten was diese Funktion macht...
SCR_RandStarfield
Erzeugt eine neue Starfield Ebene, wenn eine Alte an der "Kamera" vorbei geflogen ist.
SCR_CreateStarfield:
Eine der Komplizierteren Funktionen in diesem System, da sie Tonnen von Parametern Futtert, um das Starfield gut Customizen zu können. Dazu gehören:
argument 0:
Anzahl der Sterne. Diese wird auf die Anzahl der Ebenen verteilt. Hat außer bei der Generierung der Starfield Surfaces keine Auswirkung auf die Performance.
argument 1:
Anzahl der Ebenen. Umso mehr Ebenen eine Starfield Simulation besitzt, umso dynamischer sieht sie aus. Normalerweise reichen 5 - 8 Ebenen, danach kämpft das System schon mit erheblichen Performance Problemen.
argument 2:
Tiefe. Die Maximale Sichtweite der Starfield Simulation.
argument 3 und 4:
die Fixierte und Zufällige größer der Einzelnen Sterne. Ein wert von 4 und 3 ergibt Sterne in der Größe von 4 - 7 Pixel.
argument 5:
Die Geschwindigkeit der Starfield Simulation.
argument 6:
Detailgrad. 1 Ist das Maximum, nach obenhin ist die skalierung offen. Um so höher der Wert, um so niedriger sind die Details. Hat Massive Auswirkungen auf die Performance.
argument 7 und 8:
größe der View in der sich die Simulation befinden soll.
argument 9:
Leerraum für Sterne. Bei 0% können sich Sterne auch im Zentrum der Kamera befinden (was oft störend wirkt), bei 99% sind sie nur am Rand der Simulation.
Alles anzeigen
SCR_Starfield_Step:
Diese Funktion überürpft ob eine Sternenebene an der Kamera vorbeigezischt ist bzw. im nichts verschwindet und erzeugt dann eine neue.
Alles anzeigen
SCR_RandStarfield:
Diese Funktion erzeugt eine neue Sternenebene
SCR_Starfield_Draw:
Und diese Funktion zeichnet das ganze
Alles anzeigen
Die Funktion SCR_Starfield_Step und SCR_Starfield_Draw gehören in das Step und Draw Event eines Objekt namens OBJ_Starfield.
Durch Manipulation der Variablen MoveX und MoveY kann die Starfield Simulation Kurven fliegen, die Geschwindigkeit kann durch die Manipulation der Variable Speed verändert werden. Dabei ist aber anzumerken, das die Simulation bei einer Geschwindigkeit von 1/-1 unheimlich ... fad ... aussieht und bei 0 gänzlich verschwindet.
Wenn sich irgendwer Fragt warum einige Variablen den Namen Fog haben, ursprünglich hätte das eine Nebel Simulation werden sollen ... ist dann aber irgendwie doch keine geworden.
Das Ganze Teil ist mit der SGPL lizensiert (Shoba General Public License) :3.


Anstatt jeden Stern einzeln zu zeichnen erstelle ich am Anfang des Programms 30 relativ große Sprites in denen eine größere Anzahl von Sternen abgebildet ist. Diese werden dann mit Hilfe einer Funktion gezoomt, welche vom Strahlensatz abgeleitet ist, um so die Illusion von Dreidimensionalität zu erzeugen. Desweiteren werden diese Sprites immer öfters gezeichnet umso näher sie der Kamera kommen um einen Motion Blur Effekt zu erzeugen.
Um das ganze zu realisieren brauchen wir folgende Funktionen:
SCR_CreateStarfield:
Diese Funktion erzeugt das Starfield Objekt.
SCR_Starfield_Step
Diese Funktion manipuliert das Starfield während des Step Events
SCR_Starfield_Draw
Ihr dürft raten was diese Funktion macht...
SCR_RandStarfield
Erzeugt eine neue Starfield Ebene, wenn eine Alte an der "Kamera" vorbei geflogen ist.
SCR_CreateStarfield:
Eine der Komplizierteren Funktionen in diesem System, da sie Tonnen von Parametern Futtert, um das Starfield gut Customizen zu können. Dazu gehören:
argument 0:
Anzahl der Sterne. Diese wird auf die Anzahl der Ebenen verteilt. Hat außer bei der Generierung der Starfield Surfaces keine Auswirkung auf die Performance.
argument 1:
Anzahl der Ebenen. Umso mehr Ebenen eine Starfield Simulation besitzt, umso dynamischer sieht sie aus. Normalerweise reichen 5 - 8 Ebenen, danach kämpft das System schon mit erheblichen Performance Problemen.
argument 2:
Tiefe. Die Maximale Sichtweite der Starfield Simulation.
argument 3 und 4:
die Fixierte und Zufällige größer der Einzelnen Sterne. Ein wert von 4 und 3 ergibt Sterne in der Größe von 4 - 7 Pixel.
argument 5:
Die Geschwindigkeit der Starfield Simulation.
argument 6:
Detailgrad. 1 Ist das Maximum, nach obenhin ist die skalierung offen. Um so höher der Wert, um so niedriger sind die Details. Hat Massive Auswirkungen auf die Performance.
argument 7 und 8:
größe der View in der sich die Simulation befinden soll.
argument 9:
Leerraum für Sterne. Bei 0% können sich Sterne auch im Zentrum der Kamera befinden (was oft störend wirkt), bei 99% sind sie nur am Rand der Simulation.
GML-Quellcode
- {
- //argument 0 ... number of Stars
- //argument 1 ... number of Layers
- //argument 2 ... depth
- //argument 3 ... Starsize (fixed)
- //argument 4 ... Starsize (random)
- //argument 5 ... speed
- //argument 6 ... detail
- //argument 7 ... sizex
- //argument 8 ... sizey
- //argument 9 ... toCenter
- var spl;
- var sx,sy,sl,sw;
- var TmpObj;
- TmpObj = instance_create(0,0,OBJ_Starfield);
- with(TmpObj)
- {
- StarNumber = argument0;
- Layers = argument1;
- Depth = argument2;
- StarSize = argument3;
- StarRand = argument4;
- Speed = argument5;
- Detail = argument6;
- SizeX = argument7;
- SizeY = argument8;
- ToCenter = argument9;
- MoveX = 0;
- MoveY = 0;
- PosX = SizeX/2;
- PosY = SizeY/2;
- Size = max(SizeX,SizeY);
- SrfSize = (Size*2)/Detail;
- //Diese Schleife erzeugt 30 Verschiedene Sprites, auf denen die Sterne dargestellt werden
- for(i = 0; i < 30; i+=1)
- {
- SRF_Star = surface_create(SrfSize,SrfSize);
- surface_set_target(SRF_Star);
- draw_clear(c_black);
- spl = random(StarNumber/Layers )+StarNumber/Layers ;
- for(j = 0; j < spl; j+=1)
- {
- col = round(random(128)+127);
- col = make_color_rgb(col,col,col);
- sl = ( ((SrfSize/2)*(ToCenter/100))+random((SrfSize/2)*((100-ToCenter)/100)) );
- sw = random(360);
- sx = SrfSize/2+lengthdir_x( sl,sw);
- sy = SrfSize/2+lengthdir_y( sl,sw);
- draw_circle_color(sx,sy,(random(StarRand)+StarSize)/Detail ,col,col,false);
- }
- draw_point_color(0,SrfY,c_black);
- draw_point_color(0,SrfY-1,c_black);
- surface_reset_target();
- FogSprite[i] = sprite_create_from_surface(SRF_Star,0,0,SrfSize,SrfSize,0,1,0,1,SrfSize/2,SrfSize/2);
- surface_free(SRF_Star);
- }
- for(i = 0; i < Layers; i += 1)
- {
- CurPos[i] = i*(Depth/Layers);
- SCR_RandStarfield(i);
- }
- Timer = 0;
- }
- return TmpObj;
- }
SCR_Starfield_Step:
Diese Funktion überürpft ob eine Sternenebene an der Kamera vorbeigezischt ist bzw. im nichts verschwindet und erzeugt dann eine neue.
GML-Quellcode
SCR_RandStarfield:
Diese Funktion erzeugt eine neue Sternenebene
SCR_Starfield_Draw:
Und diese Funktion zeichnet das ganze
GML-Quellcode
- {
- var i,j,CurFog;
- var dx,Alpha,Number,ox,oy;
- draw_set_blend_mode(bm_add);
- for(i = 0; i<Layers; i+=1)
- {
- CurFog = i;
- Number = ((Depth-CurPos[CurFog])/Depth)*(abs(Speed)*2);
- for(j = 0; j < Number; j+=1)
- {
- Alpha = (Depth-CurPos[CurFog]+((Number*2)-(j*2)))/Depth;
- dx = ((200/(CurPos[CurFog]+(j*2)+0.01))-0.1)*Detail;
- //X´=((A*X)/Z)Y´=((A*Y)/Z)
- ox = MoveX*(1-Alpha);
- oy = MoveY*(1-Alpha);
- draw_sprite_ext(CurSprite[CurFog],-1,x+PosX+ox,y+PosY+oy,dx ,dx ,CurRot[CurFog]+(CurPos[CurFog])/32,CurColor[CurFog]/*c_white*/,Alpha );
- }
- }
- draw_set_blend_mode(bm_normal);
- }
Die Funktion SCR_Starfield_Step und SCR_Starfield_Draw gehören in das Step und Draw Event eines Objekt namens OBJ_Starfield.
Durch Manipulation der Variablen MoveX und MoveY kann die Starfield Simulation Kurven fliegen, die Geschwindigkeit kann durch die Manipulation der Variable Speed verändert werden. Dabei ist aber anzumerken, das die Simulation bei einer Geschwindigkeit von 1/-1 unheimlich ... fad ... aussieht und bei 0 gänzlich verschwindet.
Wenn sich irgendwer Fragt warum einige Variablen den Namen Fog haben, ursprünglich hätte das eine Nebel Simulation werden sollen ... ist dann aber irgendwie doch keine geworden.
Das Ganze Teil ist mit der SGPL lizensiert (Shoba General Public License) :3.
...