Dynamischer Schatten, aber nur bei bestimmten Objekten

  • GM 8

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

  • Dynamischer Schatten, aber nur bei bestimmten Objekten

    In einem Scrolling Shooter (vertikal) sind auf dem Boden viele Objekte, die bewusst nur einen statischen Schatten haben (PNG Bilder). Darüber fliegen Raumschiffe, bei denen hätte ich gerne einen Schatten wie in Raptor: Call Of The Shadows.

    youtube.com/watch?v=pYa2g9_5Ss4 (ab 1:05min)

    Gibt es dafür eine einfache Methode, ohne DLL und aufwändigen Zusatzscripten?
  • Du musst einfach den Sprite in Schwarz und transparent unter das Schiff zeichen.

    Zum Beispiel so:

    GML-Quellcode

    1. draw_sprite_ext(sprite_index, image_index, x + 24, y + 32, image_xscale, image_yscale, image_angle, c_black, .4); // Schatten
    2. draw_self(); // DANACH das normale Schiff zeichen


    - Tobi97
  • Da musst du eben die X bzw Y Koordinaten anpassen und mit der Größe experimentieren.

    Beispielsweise:

    GML-Quellcode

    1. var xx, yy;
    2. yy = room_height/2+((y-room_height/2)/1.2);
    3. xx = room_width/2+((x-room_width/2)/1.2);
    4. draw_sprite_ext(sprite_index, image_index, xx, yy, image_xscale*.7, image_yscale*.7, image_angle, c_black, .4); // Schatten
    5. draw_self(); // DANACH das normale Schiff zeichen


    - Tobi97
  • Ganz so wird es nicht gehen, es müsste über View laufen, nicht über Room. Allerdings sehe ich damit auch nichts:

    GML-Quellcode

    1. yy = view_yview/2+((y-view_yview/2)/1.2);
    2. xx = view_xview/2+((x-view_xview/2)/1.2);


    Der Raum hat eine Größe von 1024*17280. Der Schatten soll, wie im Video, lediglich im View dynamisch sein. :S
  • Danke Zelgadis. In deinem Beispiel sieht es so aus, wie ich es haben wollte, auch wenn es recht aufwändig ist (wenn man bedenkt, dass später rund 30 Objekte davon betroffen sind).

    Bei der Übernahme von deinem Beispiel habe ich aber das gleiche Problem wie oben beschrieben: ich sehe keinen Schatten, nehme an, weil du vom Room ausgehst, ich mich aber in einem View befinde.
  • Verwendest du die Standard, oder die Pro Version vom Game Maker? Manche Funktionen sind nicht nutzbar, darunter eben auch draw_sprite_ext.

    Wenn es an der Version liegt, dann könntest du im Draw event die normale draw_sprite Funktion wie folgt verwenden:

    GML-Quellcode

    1. draw_sprite(spr_sub,0,var_x,var_y);

    Somit dürftest du etwas sehen, aber das Sprite müsstest du in einem Grafik Programm anpassen, also die Größe verändern, transparent machen und einen Blur (Unschärfe) anwenden.

    Außerdem, stelle sicher dass du im Step Event von obj_sub bei der Funktion scr_dynshadowview() auch den richtigen Objektnamen einträgst.

    Noch etwas: Siehst du in meiner Projektdatei keinen Schatten, oder erst wenn du das Ganze in deine eigene Projektdatei einbinden willst?

    Mir ist eben noch etwas aufgefallen, nämlich dass die Sache etwas komplizierter wäre, wenn du für mehrere Objekte einen Schatten zeichnen willst, denn dafür würde meine Projektdatei nicht wirklich ausreichen. Lass dir aber gesagt sein, dass dir ZUMINDEST die Funktion hilfreich ist, denn sie rechnet dir lediglich die x und y Werte für den Schatten aus. Du müsstest dir etwas anderes einfallen lassen, wie mit with statements zu arbeiten, oder kein 2. Objekt für den Zeichner zu benutzen, etc. Wenn du mir eine Beispieldatei von deinem Projekt liefern könntest, dann könnte ich mich mal damit auseinandersetzen und eine Lösung finden.
  • Also an der Version liegt es nicht. 1. habe ich Pro und 2. funktioniert die Alternative auch nicht.

    Noch etwas: Siehst du in meiner Projektdatei keinen Schatten, oder erst
    wenn du das Ganze in deine eigene Projektdatei einbinden willst?


    Es ist aber, wie ich geschrieben habe. Wenn ich mein Objekt ganz oben positioniere, dann sehe ich den Schatten, aber mein Room ist so groß. Was den Aufwand angeht, würde ich die Lösung von Tobi97 bevorzugen, aber da gibt es das Room / View Problem.
  • Meine Funktion war wohl doch fehlerhaft, sorry. Ich habe ihn überarbeitet, jetzt funktioniert es auch beim Scrollen:

    GML-Quellcode

    1. var var_negatex, var_negatey, var_factorx, var_factory;
    2. var_negatex = 1;
    3. var_negatey = 1;
    4. var_factorx = argument2;
    5. var_factory = var_factorx;
    6. if (argument0 < view_xview+view_wview/2) {var_negatex = -1;} else {var_negatex = 1;}
    7. var_x = view_xview + view_wview/2 + (point_distance(view_xview+view_wview/2,view_yview+view_hview/2,argument0,view_yview+view_hview/2)*var_factorx)*var_negatex;
    8. if (argument1 < view_yview+view_hview/2) {var_negatex = -1;} else {var_negatex = 1;}
    9. var_y = view_yview + view_hview/2 + (point_distance(view_xview+view_wview/2,view_yview+view_hview/2,view_xview+view_wview/2,argument1)*var_factorx)*var_negatex;
    Alles anzeigen

    Außerdem benutzt man sie jetzt so:

    GML-Quellcode

    1. factor scr_dynshadow_view(argument0,argument1,argument2);
    2. // argument0 = x-Koordinate vom Originalobjekt
    3. // argument1 = y-Koordinate vom Originalobjekt
    4. // argument2 = ein Wert, von dem abhängt, wie weit der Schatten vom Originalobjekt entfernt ist; sollte zwischen 0 und 1 liegen; Herumprobieren ist erwünscht!

    Hier hab ich wieder eine Beispieldatei, diesmal scrollend und auch mit Gegnern.
    Dateien

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

  • Um das Thema zu Ende zu bringen: Tobi97 hat mir per PN noch eine Version zukommen lassen, welche mich begeistert. Vor allem, weil die Integration so einfach ist.

    Draw:

    GML-Quellcode

    1. var xmid, ymid, xx, yy, bdis;
    2. bdis = 1.5; // Abstand zum Boden (1 = auf dem Boden; 4 = Ziemlich weit oben (hat mit dem Schattenwurf zu tun))
    3. xmid = view_xview[0] + view_wview[0]/2; // Mitte der View (x)
    4. ymid = view_yview[0] + view_hview[0]/2; // Mitte der View (y)
    5. xx = xmid + (x-view_xview[0]-view_wview[0]/2)/bdis;
    6. yy = ymid + (y-view_yview[0]-view_hview[0]/2)/bdis;
    7. draw_sprite_ext(sprite_index, image_index, xx, yy, image_xscale*max(8-bdis,.4)/8, image_yscale*max(8-bdis,.4)/8, image_angle, c_black, .4);
    8. draw_self();
    Alles anzeigen

    Noch einmal "Danke" an dieser Stelle für alle Bemühungen. Für mich ist es auch immer wieder interessant zu sehen, wie viele verschiedene Lösungen zum Ziel führen können. :thumbsup:

    Übrigens habe ich es mit folgender Skalierung umgesetzt:

    GML-Quellcode

    1. draw_sprite_ext(sprite_index, image_index, xx, yy, image_xscale*max(8-bdis,.4)/12, image_yscale*max(8-bdis,.4)/12, image_angle, c_black, .4);


    Damit sind die Schatten kleiner und das Raumschiff sieht aus, als ob es höher fliegen würde.