Also. Sicherlich kennen einige New Super Mario Bros. für Wii/DS, egal. Auf jeden Fall gibt es in diesem Spiel einige Wasser-Level und wenn man auf oder unter die Oberfläche des Wassers springt, gibt es einen schönen Wellen-Effekt. Nunja, da ich im Moment an einem Platformer arbeite, habe ich mir gedacht auch solch einen Effekt in mein Spiel einzubauen. Das ersparrt einerseits lästiges Animieren und andererseits sieht es einigermaßen cool aus.
Funktionsweise:
Kommen wir nun zur eigentlichen Sache. Wie soll das Ganze funktionieren? Als allererstes werden einige Parameter an die Scripte übergeben, die ich erstellt habe, als da wären die Anfangsposition und die Endposition der Welle/ des Wassers, den Y-Wert der Oberfläche und die Höhe/Tiefe (nennt es wie Ihr wollt) des Wassers. Ok, dann wird noch ein Hilfsobjekt ("water_point" im Example), die Genauigkeit der Welle ("precision") und eine, ich habe es, "friction", genannt, benötigt. Nun wird ein Array erstellt, welches mit Hilfsobjekten gefüllt wird, erstellt. Dadurch erhält man Punkte auf der Wasseroberfläche, die man benutzen kann um ein Welle zu erzeugen. Das Ganze wird dann mit Hilfe von draw_primitive_begin_texture(pr_trianglestrip, texture); gezeichnet. D.h. in meinem Script müsst ihr einen Hintergrund übergeben von dem die Textur geladen wird, um diese anschliessend in einer Wellenform zu zeichnen. Das ganze kann man auch ohne Texturen lösen.
Naja, genug geredet hier sind ein paar Screenies:
Ok und hier sind die Scripts:
wave_init(xStart,xEnd,yPosition,height,obj,precision,friction);
Spoiler anzeigen
Alles anzeigen
wave_points_init();
Spoiler anzeigen
Alles anzeigen
wave_create(xPosition, strength);
Spoiler anzeigen
Alles anzeigen
wave_points_update();
Spoiler anzeigen
Alles anzeigen
wave_point_fix_distance();
wave_draw(background,alpha);
Spoiler anzeigen
Alles anzeigen
An dieser Stelle möchte ich noch sagen, dass mit diesen Scripten das erstellen von mehreren Wellen etwas komisch aussieht, komisch im Sinne von nicht realistisch. Falls jemand weiß wie man die Scripts verbessern könnte...nur zu ;).
Und zu guter Letzt ein Beispiel, wie man die Scripts verwenden sollte.
Die .gmk: wave_texture.rar
und die Executable .
Neue Version: wave_texture_extended.rar, Executable
MfG Trixt0r und viel Spaß mit den Wellen.
Funktionsweise:
Kommen wir nun zur eigentlichen Sache. Wie soll das Ganze funktionieren? Als allererstes werden einige Parameter an die Scripte übergeben, die ich erstellt habe, als da wären die Anfangsposition und die Endposition der Welle/ des Wassers, den Y-Wert der Oberfläche und die Höhe/Tiefe (nennt es wie Ihr wollt) des Wassers. Ok, dann wird noch ein Hilfsobjekt ("water_point" im Example), die Genauigkeit der Welle ("precision") und eine, ich habe es, "friction", genannt, benötigt. Nun wird ein Array erstellt, welches mit Hilfsobjekten gefüllt wird, erstellt. Dadurch erhält man Punkte auf der Wasseroberfläche, die man benutzen kann um ein Welle zu erzeugen. Das Ganze wird dann mit Hilfe von draw_primitive_begin_texture(pr_trianglestrip, texture); gezeichnet. D.h. in meinem Script müsst ihr einen Hintergrund übergeben von dem die Textur geladen wird, um diese anschliessend in einer Wellenform zu zeichnen. Das ganze kann man auch ohne Texturen lösen.
Naja, genug geredet hier sind ein paar Screenies:
Ok und hier sind die Scripts:
wave_init(xStart,xEnd,yPosition,height,obj,precision,friction);
GML-Quellcode
- //Initialisiert ein Array mit der Länge arrayLength = (xStart-xEnd)/precision.
- //In das Array kommen obj-Objekte und werden von xStart bis xEnd in den Room gesetzt.
- //Der jeweilige Abstand zum nächsten obj-Objekt ist precision, d.h. desto höher precision ist, desto ungenauer wird
- //die Welle später sein.
- //yPosition ist die Y-Koordinate im Raum, wo die obj-Objekte erstellt werden.
- //height ist die Höhe des Wassers.
- //friction bestimmt wie schnell die Welle sich in den Ruhezustand versetzt, d.h. desto höher friction umso
- //schneller wird die Welle in die Ruhephase kommen, bei friction = 0, wird die Welle nie in die Ruhephase kommen.
- //////////////////////////////////////
- // argument0 - xStart //
- // argument1 - xEnd //
- // argument2 - yPosition //
- // argument3 - height //
- // argument4 - obj //
- // argument5 - precision //
- // argument6 - friction //
- //////////////////////////////////////
- length = abs(argument0-argument1);
- xx = argument0;
- xxEnd = argument1;
- yy = argument2;
- height = abs(argument3);
- obj = argument4;
- precision = abs(argument5);
- fr = abs(argument6);
- arrayLength = round(length/precision)+1;//+1 weil es sonst einen leeren Rand auf der rechten Seite gibt.
- strength = 0;
- wave_points[] = noone;
- wave_points_init();
wave_points_init();
GML-Quellcode
- //Initialisierung der einzelnen WasserPunkte
- var i;
- for(i = 0; i <= arrayLength; i+=1){
- wave_points[i] = instance_create(xx+precision*i,yy,obj);
- wave_points[i].control = instance_id;
- wave_points[i].index = i;
- wave_points[i].amplitude = 0;
- }
- //Holt sich die einzelnen instanzen
- for(i = 0; i <= arrayLength; i+=1){
- with (wave_points[i]){
- if (index == 0) {
- leftIndex = -1;
- rightIndex = index+1;
- right = control.wave_points[rightIndex];
- }
- else if (index == control.arrayLength) {
- leftIndex = index-1;
- rightIndex = -1;
- left = control.wave_points[leftIndex];
- }
- else {
- rightIndex = index-1;
- leftIndex = index+1;
- left = control.wave_points[leftIndex];
- right = control.wave_points[rightIndex];
- }
- }
- }
wave_create(xPosition, strength);
GML-Quellcode
- //Erstellt eine Welle an x = xPosition mit der Höhe/Stärke strength und der Geschwindigkeit speed.
- //Wenn speed >= 30 ist, dann sieht die Welle nicht wirklich schön aus, also passt auf was für Werte ihr einsetzt
- //////////////////////////////////////
- // argument0 - xPosition //
- // argument1 - strength //
- //////////////////////////////////////
- var tempX,i,dist;
- tempX = argument0;
- strength = argument1;
- for(i = 0; i <= arrayLength; i+= 1){
- dist = round(abs(tempX-wave_points[i].x)/precision);
- if (dist < 10) { // Create a wave for a single water part.
- if (dist == 0) dist = 1;
- wave_points[i].vspeed += strength/(dist*2);
- }
- }
wave_points_update();
GML-Quellcode
- ///Gehört ins Step-Event der WaterPoint-Objekts.
- //Aktualisiert die Y-Positionen der Objekte im Array.
- //////////////////////
- // No arguments //
- //////////////////////
- amplitude = y-control.yy;
- wave_point_fix_distance();
- var dist;
- dist = amplitude;
- if (instance_exists(left)) {
- dist = (left.amplitude-amplitude);
- vspeed += dist/50;
- }
- if (instance_exists(right)) {
- dist = (right.amplitude-amplitude);
- vspeed += dist/50;
- }
- dist = amplitude;
- vspeed -= dist/50;
- if (abs(vspeed) > 0) {
- vspeed /= control.fr;
- }
wave_point_fix_distance();
wave_draw(background,alpha);
GML-Quellcode
- //Gehört in das Draw-Event des Controller-Objekts.
- //Die Textur wird von background geladen und anschliessend mit dem Alpha-Wert alpha gezeichnet.
- /////////////////////////////////
- // argument0 - background //
- // argument1 - alpha //
- /////////////////////////////////
- draw_set_color(c_white);
- draw_set_alpha(argument1);
- var i, tex, back;
- back = argument0;
- tex = background_get_texture(argument0);
- draw_primitive_begin_texture(pr_trianglestrip,tex);
- for(i = 0; i <= global.arrayLength; i += 1){
- draw_vertex_texture(global.wave_points[i].x,global.wave_points[i].y,(i*texture_get_width(tex)/global.arrayLength),0);
- draw_vertex_texture(global.wave_points[i].x,global.yy+global.height,(i*texture_get_width(tex)/global.arrayLength),texture_get_height(tex));
- }
- draw_primitive_end();
- draw_set_alpha(1);
An dieser Stelle möchte ich noch sagen, dass mit diesen Scripten das erstellen von mehreren Wellen etwas komisch aussieht, komisch im Sinne von nicht realistisch. Falls jemand weiß wie man die Scripts verbessern könnte...nur zu ;).
Und zu guter Letzt ein Beispiel, wie man die Scripts verwenden sollte.
Die .gmk: wave_texture.rar
und die Executable .
Neue Version: wave_texture_extended.rar, Executable
MfG Trixt0r und viel Spaß mit den Wellen.
Albert Einstein schrieb:
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Trixt0r ()