Gnomon v1.1.0 [2D Licht und Schatten]

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

    • Gnomon v1.1.0 [2D Licht und Schatten]

      Da es Tradition ist, dass jeder seine eigene Schattenengine bastelt, veröffentliche ich hier meine, welche ich eigentlich schon vor zwei Wochen veröffentlicht haben wollte. Sie ist komplett frei verwendbar und erweiterbar. Für kommerzielle Benutzung mich einfach anschreiben. Das Besondere an dieser Schattenengine ist die enorm einfache Benutzbarkeit. Dabei kommt sie mit oder ohne Views aus. Zudem funktioniert sie prefekt mit jeder Bewegung, Scalierung und Rotation des Views. Die Engine ist komplett dokumentiert.
      Eine weitere Besonderheit ist, dass sie Halbschatten von ausgedehnten Lichtquellen grafisch perfekt darstellen kann und das ohne merklichen Preformanceverlust.
      Weitere Features könnt ihr dann selbst entdecken.
      Um einen kleinen Einblick zu geben wie man die Engine verwendet hier ein kleines Code Beispiel:

      Um die Engine zu initialisieren benötigt man nur die Funktion gno_init(); aufzurufen und den Rückgabewert für die weiteren Funktionen zu speichern.
      Danach kann man alle punktförmigen Lichter mit gno_add_point_light(shadow_object, x, y, light_source_diameter, radius, colour); erstellen.

      GML-Quellcode

      1. //Initialisiert die Engine und speichert den Rückgabewert
      2. gno_inst = gno_init();
      3. //Erstellt ein rotes, grünes und blaues Punktlicht
      4. gno_add_point_light(gno_inst, 512, 256, 0, 128, c_red);
      5. gno_add_point_light(gno_inst, 623, 448, 0, 128, c_lime);
      6. gno_add_point_light(gno_inst, 401, 448, 0, 128, c_blue);


      Anschließen braucht man es nur noch im Draw End Event oder im Draw Event mit einer niedrigen Depth mit der Funktion gno_draw(shadow_object); zu zeichnen.

      GML-Quellcode

      1. //Zeichnet die Situation
      2. gno_draw(gno_inst);


      Schon hat man folgendes Ergebniss:


      Dokumentation:
      simudox.de/gnomon/doku.pdf

      Beispielprojekte mit Engine Achtung Veraltet!:
      simudox.de/gnomon/examples.zip

      Engine:
      simudox.de/gnomon/gnomon.zip

      Extension (Bitte die Engine direkt nach der Dokumentation einfügen, anstatt diese Erweiterung zu benutzen) Achtung Veraltet!:
      simudox.de/gnomon/gnomon.gmez

      Bei Unklarheiten einfach hier oder per PM melden und viel Spaß damit.
      Und das nächste Mal gibt es (neben dem Adventskalender) vieleicht das hier:

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Chris987 ()

    • Auf jeden Fall sehr schön, die Ergebnisse sahen schon mal sehr schön aus, aber bei mir kam folgender Fehler:

      Brainfuck-Quellcode

      1. ___________________________________________
      2. ############################################################################################
      3. ERROR in
      4. action number 1
      5. of Draw Event
      6. for object objCon:
      7. Data structure with index does not exist.
      8. at gml_Script_gno_draw (line 22) - for(var i=0; i<ds_list_size(argument0[6]); i++)
      9. ############################################################################################
      10. --------------------------------------------------------------------------------------------
      11. stack frame is
      12. gml_Script_gno_draw (line 22)
      13. called from - gml_Object_objCon_DrawEvent_1 (line 1) - gno_draw(objShadow)
      Alles anzeigen


      bei folgender Implemtierung:

      GML-Quellcode

      1. Create Event:
      2. objShadow = gno_init()
      3. gno_set_walls(objShadow, objWall)
      4. gno_add_point_light(objShadow,128,288,0,500,c_yellow)
      5. Draw Event:
      6. gno_draw(objShadow)
      7. gno_free(objShadow)

      Wie gesagt, die Schatten wurden erstellt aber, dann kam halt der Fehler
    • Lass das gno_free() weg. Damit gibst du den Speicher wieder frei, wodurch alles nicht mehr existiert und dieser Fehler erscheint. Diese Funktion ist dazu da, um z.B den Raum zu wechseln. Ich glaube, dass die Dokumentation für gno_free() etwas fehlinterpretierbar ist. Ich werde es korrigieren. Vielen Dank fürs melden!

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

    • Ich habe mal ein kleines Update für die Engine gemacht. Es beinhaltet wesentlich neue komfortable Funktion, welche das Arbeiten mit der Engine vereinfachen soll. Als optische Neuerung wurden transparente Objekte hinzugefügt. Diese können zum einen für Fenster Gläsern etz. benutzt werden, aber auch für Objekte, welche nur einen leichten Schatten werfen sollen, wie z.B eine verschiebbare Kiste. Man kann auch beliebige Tönungen benutzen, z.B grünes Glas. Hier ein Bild um sich das vorzustellen.

      Die Tönungen können mit der Funktion gno_set_obstacle_tint(obstacle, colour); gesetzt werden. Bei der Benutzung werden aus technischen Gründen die weichen Schatten für das jeweilige Obstacle abgeschaltet, da sonst seltsame Artefakte entstehen. Vieleicht bekomme ich das noch gelöst.

      Die anderen drei neuen Funktionen sind gno_bind_obstacle, gno_set_as_obstacle und gno_clear. Sie erleichtern die Bedienung enorm, weil einem viele Dinge abgenommen werden. Besonders durch gno_clear braucht man die Engine nur noch beim Starten des Spiels zu initialiesieren, dadurch dass man beim Raumwechsel das shadow_object nicht jedes mal alles löschen und neu erstellen braucht, sondern einfach alle Obstacles und Lichter mit dieser Funktion entfernt werden.

      Ich werde vieleicht noch ein aktuelles Projekt hochladen, wo man die neuen Funktion präsentiert bekommt.

      Alle Funktionen werden in der Dokumentation beschrieben.

    • Hi,
      Kann man die Schatten auch für nicht Quadratische Objekte generieren?
      Und wie mache ich das Licht heller und wie stelle ich eine individuelle Lichtfarbe ein, ala (250,240,207)?
      bisher habe ich diesen coder verwendet

      Quellcode

      1. gno_set_light_colour(light, c_white);



      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von GolfCartDriver ()

    • Falls die Leuchtkraft nicht ausreicht kann man im Code gno_draw in Zeile 238 den Code draw_set_blend_mode_ext(bm_dest_colour, bm_zero); in draw_set_blend_mode_ext(bm_dest_colour, bm_src_colour); abändern, wodurch die Leuchtkraft die zur Verfügung steht, verdoppelt werden kann. Generell wird aber die Leuchtkraft über die Farbe angegeben. Um eigene Farben zu definieren kann man in deinem Fall z.B gno_set_light_colour(light, make_colour_rgb(250,240,207)); verwenden.
      Andere Formen als Rechtecke sind geplant, eventuell auch Polygone, wodurch man völlige Freiheiten hätte. Das Problem besteht durch die Technik, wie die unscharfen Schatten gerendert werden. Ich will es nicht einführen bis es wirklich funktioniert. Objekte kann man über die obstacle Funktionen generieren. Mal ein Auszug:
      gno_add_obstacle_rectangle(shadow_object, x, y, width, height, rotation);
      gno_delete_obstacle(obstacle);
      gno_set_obstacle_pos(obstacle, x, y);
      gno_set_obstacle_rot(obstacle, rotation);

      gno_set_obstacle_size(obstacle, width,height);
      gno_set_obstacle_size(obstacle, enable);
      gno_bind_obstacle(obstacle, instance);
      gno_set_obstacle_tint(obstacle, colour);
      gno_set_as_obstacle(shadow_object);


      Genaueres steht in der Dokumentation. Eventuell als Notlösung, mehrere Quadrate erstellen mit unterschiedlichen Rotation.

    • vielleicht neheme ich die Schatten werfenden Objekte erstmal raus
      habe in der gno_init die koardinaten für einen Würfel gesehen und wollte genauso ein anderes Objekt erstellen, aber der würfel war immer noch da ?(
      Aber wenn du meinst, das ist noch garnicht implementiert,dann, dann... -_-
      aber zylinder für Bäume wären auch toll, hast Du das vielleicht schon? :saint: