Spur eines Fahres erstellen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Spur eines Fahres erstellen

    Hallo,

    ich habe einen Surfer auf dem Meer.
    Und dieser Surfer soll hinter sich eine Spur erstellen, eben genau da, wo er gefahren ist.
    Ich hoffe, das Beispielbild verdeutlicht das ein wenig. :)

    Ich habe nur keine Idee, wie man das am besten umsetzen könnte.
    Ich dachte erst daran, dass Objekte in gewissen Abständen erstellt werden, die transparente Kreise zeichnen.
    Im Prinzip funktioniert das, aber

    a) mehrere transparente Kreise, sie sich überlappen, sind ja nicht mehr so transparent
    b) je schneller der Surfer wird (er verändert seine Geschwindigkeit) desto mehr Objekte müssten ja kreiert werden, da sonst Lücken entstehen.

    Hat jemand eine Idee für eine ellegante Lösung? ?(
    Bilder
    • beispiel.png

      78,89 kB, 1.280×720, 508 mal angesehen
  • Ach, da gibt es unzählige Möglichkeiten. Du kannst es
    1) Mit GMs Partikelsystem lösen (wahrscheinlich am einfachsten)
    2) Ein Surface erstellen und dann darauf die gewünschten Kreise etc malen mit alpha 1, dann das surface mit sinkendem alphawert malen, wird aber wahrscheinlich nicht einen so tollen Effekt erzielen
    3) Die Kreise auf ein Surface malen mit (bm_src_color,bm_src_alpha), dann das surface auf die Wellen malen
    EDIT: du könntest dann auch einfach ein Array im Spieler erstellen welches bspw. die letzten 10 Positionen für den gemalten Kreis beinhaltet und die Positionen so in der Art berechnen
    (pseudo)

    GML-Quellcode

    1. var dir = point_direction(x,y,xprevious,yprevious);
    2. var len = 15;
    3. var xx = x;
    4. var yy = y;
    5. repeat(anzahl)
    6. xx = xx + lengthdir_x(dir,len);
    7. yy = yy + lengthdir_y(dir,len);

    Nur auf die schnelle das wird so natürlich nicht richtig funktionieren, nur um dir ein bisschen Anregung zu geben welche Funktionen man nutzen kann

    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rhazul ()

  • Also das was ich eben gefunden hab war ein haufen Kot, hab mal kurz das hier geschrieben, ich denke darauf kann man aufbauen :

    GML-Quellcode

    1. var sprite = sprite_index;
    2. var x1 = x;
    3. var y1 = y;
    4. var len = speed;
    5. var dist = 5;
    6. draw_sprite_ext(sprite,0,x,y,1,1,0,c_white,1);
    7. for (var i = 1; i < len; i++) {
    8. x1 += lengthdir_x(dist,point_direction(x,y,xprevious,yprevious));
    9. y1 += lengthdir_y(dist,point_direction(x,y,xprevious,yprevious));
    10. draw_sprite_ext(sprite,0,x1,y1,1,1,0,c_white,1/i);
    11. }
    Alles anzeigen

    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rhazul ()

  • Ich habs lösen können, allerdings irgendwie ganz anders als dein Code, kann damit gerade nicht viel anfangen. ;)

    Wenn ich jetzt das mit der Transparenz hinbekommen möchte: Geht das über eine Alpha-Maske?
    Kann ich einefach eine Maske über mein Surface legen?
    Konnte dazu nichts finden.
  • Du musst eigentlich nichts weiter machen als :
    1) ein Sprite erstellen, nehmen wir einen weißen Kreis, 32x32 oder so, origin auf center.
    2) obigen code in das draw event deines Spielers einfügen, falls du da sonst nichts drin hast, musst du dahinter noch draw_self() aufrufen.
    3) var sprite auf dein eben erstelltes Sprite setzen
    4) ? -> profit
    sollte ungefähr eine Minute dauern zu implementieren, und schon zieht dein Spieler eine Spur hinter sich. Falls das dann noch scheisse aussieht, kannst du immernoch was mit den Werten rumspielen.
    EDIT: Um es nochmal klarzustellen, daür benötigst du keine Surfaces oder sonstiges
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • obj_controller:

    Create Event:

    GML-Quellcode

    1. surf = surface_create(room_width, room_height);


    Step Event:

    GML-Quellcode

    1. surface_set_target(surf);
    2. draw_set_alpha(0.025);
    3. draw_set_color(c_black);
    4. draw_rectangle(0, 0, room_width, room_height, false);
    5. draw_set_alpha(1);
    6. draw_set_color(c_white);
    7. if (instance_exists(obj_player)){
    8. draw_circle(obj_player.x-view_xview[0],obj_player.y-view_yview[0], 8, false);
    9. draw_line_width(obj_player.pre_x-view_xview[0], obj_player.pre_y-view_yview[0], obj_player.x-view_xview[0],obj_player.y-view_yview[0], 16);
    10. }
    11. surface_reset_target();
    Alles anzeigen


    Draw Event:

    GML-Quellcode

    1. draw_set_blend_mode( bm_add );
    2. draw_surface_ext(surf, 0, 0, 1, 1, 0, c_white, 0.5);
    3. draw_set_blend_mode( bm_normal );



    obj_player:

    Create Event:

    GML-Quellcode

    1. pre_x = x;
    2. pre_y = y;


    Step Event:

    GML-Quellcode

    1. pre_x = x;
    2. pre_y = y;
    3. x += lengthdir_x(10, point_direction(x,y,mouse_x, mouse_y));
    4. y += lengthdir_y(10, point_direction(x,y,mouse_x, mouse_y));
    5. image_angle = point_direction(x,y,mouse_x, mouse_y);


    Das ist genau, was du wolltest.
    Inklusiv: Es ensteht keine Lücken, auch wenn du schnell surfst + transparent (unter draw_surface_ext).

    Download: https://www.dropbox.com/s/37npoua9chztx1r/Trail.gmz?dl=0

    [EDIT:]

    statt pre_x und pre_y kannst du auch xprevious und yprevious benutzen.


    Ihr stinkt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Chinafreak ()

  • Mhh... das Problem ist bei mir, dass das Spiel bei mir etwas anders abläuft.
    Und zwar bewegt sich der Spieler nicht im Raum, sondern er bleibt fest, und nur der Hintergrund bewegt sich nach oben.
    (Dazu dann auch diverse Hindernisse etc.)

    D.h. die im Survace gedrawte Spur muss sich ja auch entsprechend bewegen.

    Das sieht aktuell so bei mir aus:

    GML-Quellcode

    1. surface_set_target(surface);
    2. draw_clear_alpha(0,0);
    3. draw_set_color(c_white);
    4. for(i = 0; i < 200; i += 1)
    5. {draw_circle(spur_x[i],i-40,16,false);}
    6. surface_reset_target();


    Dabei wird spur_x vorher immer entsprechend verändert.
    Das funktioniert ganz gut, also die Spur ist so, wie sie sein soll. ;)
    Nur das blasser werden ist leider nicht drin. :)

    Da die Spur ja nur so ca. die obersten 160 Pixel einnimmt, dachte ich, man könnte dort einfach eine Alpha Maske mit einem Schwarz-Weiß Verlauf drüber legen.
    Aber so etwas geht technisch gar nicht?
  • GML-Quellcode

    1. var sprite = spr_whiteCircle;
    2. var x1 = view_wview/2;
    3. var y1 = view_hview/2;
    4. var len = beliebigeGeschwindigkeit;
    5. var dist = 5;
    6. draw_sprite_ext(sprite,0,x,y,1,1,0,c_white,1);
    7. for (var i = 1; i < len; i++) {
    8. x1 += lengthdir_x(dist, scrollRichtungBackground);
    9. y1 += lengthdir_y(dist,scrollRichtungBackground);
    10. draw_sprite_ext(sprite,0,x1,y1,1,1,0,c_white,1/i);
    11. }
    Alles anzeigen
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Das sollte jetzt kein wirkliches Problem sein da eine Krümmung reinzubekommen. Bau es doch erstmal ein und dann können wir gucken wie wir das hinkriegen. Und das suface kannst du dann auch rausschmeissen

    @3D2Y Bandicoot way to be. So kann man bequem Punkte sammeln ohne je was sinnvolles beigetragen zu haben :thumbsup:
    Und dann später wundert man sich wenn jemand ***Gold*** Status hat der keine kompetente Antwort liefern kann <3
    naja, jeder wie er will

    EDIT by TrunX: Der Spam von Gtsanas und die Antworten darauf wurden gelöscht.

    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rhazul ()

  • Ja ist drin.
    Aber wie soll man denn da jetzt ne Krümmung reinbekommen? ?(

    Bild 1 zeigt, wie es jetzt ist, ohne, dass es transparenter wird, aber mit Krümmung.
    Bild 2 zeigt deine Variante. Wird zwar transparenter, aber ohne Krümmung.
    Bilder
    • spur1.png

      24,06 kB, 487×278, 347 mal angesehen
    • spur2.png

      27,23 kB, 487×278, 360 mal angesehen
  • Create event :

    GML-Quellcode

    1. Sdir = 0;


    draw event :

    GML-Quellcode

    1. //bspw : (musst was mit Werten spielen)
    2. scr_surf_trail(spr_trail,x,y,trailLength,3,.1,scrollDir);


    Skript :

    GML-Quellcode

    1. ///scr_surf_trail(sprite,x,y,length,seperation,smoothness,direction)
    2. var sprite = argument0; // zu malendes Sprite
    3. var x1 = argument1; // Start x Koordinate
    4. var y1 = argument2; // Start y Koordinate
    5. var len = argument3; // Länge der Spur
    6. var dist = argument4; // Abstand zwichen gemalten sprites
    7. var smooth = argument5; // Stärke der Krümmung
    8. var dirPart = Sdir;
    9. Sdir = argument6;
    10. dirPart = angle_difference(Sdir,dirPart);
    11. for (var i = 1; i < len; i++) {
    12. x1 += lengthdir_x(dist,Sdir - (dirPart*i)*smooth);
    13. y1 += lengthdir_y(dist,Sdir - (dirPart*i)*smooth);
    14. draw_sprite_ext(sprite,0,x1,y1,1,1,0,c_white,1/i);
    15. }
    Alles anzeigen


    voila, bitte schön.
    Nichts ist unmöglich! (toyota) :thumbsup:
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rhazul ()

  • Nee, das sieht nicht aus.
    Die Spur wirkt einfach immer fest hinter dem Surfer. Mal gerade, mal gekrümmt, aber nicht so, als wenn sie direkt auf dem Wasser wäre.
    Das sieht bei der Surface-Variante schon so aus, da sich die Spur da mit dem Hintergund passend mit bewegt und so die passenden Kurven gezeichnet werden...
  • Ich habs doch getestet...
    Sah genau so aus wie bild1
    Natürlich nicht mit nem scrollenden Hintergrund, aber ohne jetzt scheisse rüberzukommen, ein bisschen selber denken sollte doch drin sein..
    Wenns kacke aussieht dann musst du halt noch ne zwichenvariable einbauen welche dann langsamer rotiert.
    132 little bugs in the code. 132 little bugs. Fix a few, set the compiler to stew, 172 little bugs in the code... :vogel:
  • Ich habe mal ein Video gemacht, damit du siehst, was ich meine.
    Und an den Werten herumspielen bringt da nichts, da es ja von Grund auf schon ein ganz anderes System ist.
    Weiß nicht, wie das da so aussehn soll, als sei es auf dem Wasser.
    Immer, wenn der Surfer sich gerade nicht dreht, ist die Spur gerade, obwohl er vorher einen Bogen gefahren ist.

    file-upload.net/download-10816483/spur.mp4.html