Beleuchtung

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

    • Beleuchtung

      So, durch diesen Thread ist mir aufgefallen, wie einfach es ist ein Beleuchtungssystem zu erstellen das ähnlich gute Resultate liefert wie GodGear's aus dem offiziellen Forum.
      Zunächst benötigen wir zwei Grafiken, zum einen den Fußboden und zum anderen ein Licht, zum Beispiel so:

      und

      Das Licht wird als Sprite hinzugefügt und das origin sollte 128,128 (center) sein, damit das Licht später auch genau dort erscheint wohin man es platziert hat. Der Boden wird als Background hinzugefügt und auch gleich als Hintergrund für den Raum eingestellt. (Ich arbeite hier mal mit einem Raum in der Größe 640x480).
      Jetzt fügen wir ein neues Objekt hinzu, das das Licht darstellt, wir nennen es einfach "obj_spot". Der Visible-Haken wird rausgenommen. Wir geben ihm KEINEN sprite, schreiben aber in das Create-event:

      GML-Quellcode

      1. sprite_index = spr_light;
      2. image_blend = c_white;
      3. image_alpha = 0.75;


      Und jetzt zur Erklärung der Code-Zeilen:
      sprite_index = spr_light; Hier wird dem objekt der Licht-sprite zugewiesen. Es wird bewusst erst hier gemacht, denn wenn man schon im Objekt das Licht-sprite auswählt ist beim platzieren im Raumeditor schnell der Bildschrim voll.
      image_blend = c_white;# Hier wird dem objetk die standart-licht-farbe gegeben. Durch andere Farben kann man zum Beispiel blaues, gelbes, rotes etc Licht erschaffen.
      image_alpha = 0.75; Die Lichtstärke (0-1), damit das Licht nicht total hell Leuchtet ist es auf 0.75, je kleiner desto schwächer.

      Jetzt verteilen wir ein paar der neuen Licht-objekte im Raum, so zum Beispiel:



      Beim starten des Spiels stellen wir fest, das nichts außerd em Hintergrund gezeichnet wird. Deshalb brauchen wir nun ein anderes Objekt, welches die Lichter zeichnet, wir nennen es "obj_light_controller". Es hat ebenfalls KEINEN sprite, aber eine Depth von 1, damit es Anzeigen welche meistens eine Depth von 0 haben nicht überdeckt. Das Objekt wird irgendwo im Raum platziert.
      Jetz beginnen wir mit den Scripts, und erstellen schonmal das erste! Es heißt "light_init" und setzt das Beleuchtungssystem in Gang. Reingeschrieben wird folgender Code:

      GML-Quellcode

      1. a_color = make_color_rgb(255-color_get_red(argument0),255-color_get_green(argument0),255-color_get_blue(argument0));
      2. surface = surface_create(640,480);


      Erklärung:
      a_color = make_color_rgb(255-color_get_red(argument0),255-color_get_green(argument0),255-color_get_blue(argument0)); Das Skript wird mit einem Parameter aufgerufen, nämlich der Umgebungs-Helligkeit. Da wir aber später die Lichter negativ zeichnen müssen, wird die Farbe ebenfalls umgedreht.
      surface = surface_create(640,480); Hier wird eine Oberfläche erstellt mit der Größe des zu sehenden bereichs (hier 640x480).
      Von nun an haben wir also nicht nur die ganz normale Zeichen-fläche die auf dem Bildschrim gezeigt wird sondern noch eine zweite in der selben größe, das kann man sich nun so vorstellen:
      normale Zeichenfläche + neue Surface (Oberfläche)

      +

      Das komische Muster rechts kommt davon, dass wir noch nichts auf die Oberfläche gezeichnet haben, und deshalb nur überreste aus dem Grafik-Speicher zu sehen sind.

      In das Create-event des Light-Controllers setzen wir nun folgenden Code

      GML-Quellcode

      1. light_init(make_color_rgb(24,24,24));

      Damit wird zu Beginn die Licht-engine aufgerufen und die Umgebungshelle auf ein dunkles grau gesetzt.

      Jetzt kommt das Zweite und somit auch schon das schwerste der 3 Skripts. Es heist "light_refresh", und beinhaltet folgenden Code

      GML-Quellcode

      1. surface_set_target(surface);
      2. draw_clear(a_color);
      3. draw_set_blend_mode(bm_subtract);
      4. with (obj_spot)
      5. {
      6. draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
      7. }
      8. draw_set_blend_mode(bm_normal);
      9. surface_reset_target();

      Erklärung:
      surface_set_target(surface); Das Zeichnen wird auf die Oberfläche umgestellt. d.h. von nun an wird bei Zeichenbefehlen die Surface an stelle des normalen Bildes bemalt.
      draw_clear(a_color); Die Surface wird komplett mit der (invertierten) Umgebungsfarbe übermalt.
      draw_set_blend_mode(bm_subtract); Der Blend-mode wird auf Subtrahieren umgestellt, damit die Lichter ebenfalls invertiert auf die Surface gezeichnet werden
      with (obj_spot)
      {
      draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
      }
      Alle Lichter werden auf der Surface eingezeichnet
      draw_set_blend_mode(bm_normal); Blend Mode wird wieder normal gesetzt.
      surface_reset_target(); Auch wird jetzt nichtmehr auf die Oberfläche gezeichnet.

      Im Step-event des Light-Controller wird eingetragen, dass es das script "light_refresh" aufruft. Wenn wir jetzt starten hat sich aber nichts geändert, es wird immernoch nur der Hintergrund gezeichnet. Woran liegts? Wir haben bisher nur alles auf eine Oberfläche gezeichnet, Verwendung fand diese aber noch nicht. Zur Verdeutlichung, wir haben:
      normale Zeichenfläche + Surface mit invertierten Lichtern drauf

      +

      Jetzt kommen wir zu unserem letzten Skript. Es heißt "light_draw" und beeinhaltet folgenden Code:

      GML-Quellcode

      1. draw_set_blend_mode(bm_subtract);
      2. draw_surface(surface,0,0);
      3. draw_set_blend_mode(bm_normal);


      Hier wird die Surface invertiert über das Bild gezeichnet. Jetzt muss nur noch im draw_event des light_controllers

      GML-Quellcode

      1. light_draw


      eingetragen werden und voilá, fertig sind wir. So müsste es dann aussehen:



      Natürlich ist hier noch nicht so viel möglich, aber ich hab es bewusst einfach gehalten damit leichter das System dahinter verstanden wird. Es zu erweitern ist ziemlich einfach, hier ein paar Stichpunkte was man machen sollte/könnte bevor man es verwendet:
      - Views unterstützen
      - Parents benutzen, da es sonst bei mehreren licht-objekten umständlich wird
      - Lichter die weit außerhalb der View sind deaktivieren
      - light_refresh schon im Create-event benutzen, da sonst im ersten Bild hässliche Fehler sein könnten da die surface noch nicht überzeichnet wurde
      - etc

      PS: Farbige, bewegte Lichter usw ist alles Möglich!
    • Hi ich finde das toturial sehr gelungen vor allem weil jede einzelne code referenz nochmal erklärt wird und das is ganz wichtig vor allem für so leute wie mich. :happy: :D

      Is echt cool geworden
    • @Superdaniel, du hast Recht, image_alpha wird beim zeichnen mit subtrahierten blend-mode ignoriert. Stattdessen kannst du einfach bei "image_blend" eine dunklere Farbe machen, das hat haargenau den gleichen effekt.

      @quicky, tut mir leid das kann ich selber nicht testen, da bei mir seit kurzem selbst leeres spiel mit einem raum und keinem einzigen objekt nur mit 43 frames läuft, so als ob alles darüber gekappt würde. Das tutorial und auch ne andere erweiterte Version mit view und 30 - 40 Lichtern läuft mit 43 Frames. Wär nett wenn hier jemand mal die Frames mit und ohne dem objekt "obj_light_controller" posten könnte.

      sorry für die späte antwort bin erst gestern aus dem Urlaub wieder gekommen!
    • liege ich richtig mit der Vermutung , dass dieses Tut eine gereggte Version benötigt :?:
      (image_alpha denk ich mal nur für gereggte user)

      Wenn ja kann man sowas auch mit ´m unregistriertem Editor amchen :?:

      Grüße Raxoz
      alles ist möglich, unmögliches dauert nur etwas länger
    • Original von Raxoz
      Wenn ja kann man sowas auch mit ´m unregistriertem Editor amchen :?:

      in dem tread, der xibel zu diesem tut inspirierte, hab ich einen "lampen"-beispiel für ungereggte user gemacht. sieht natürlich ziemlich arm aus im gegensatzt zum "lichterspiel". eventuell hilft dir das weiter:

      klickerdiklacker
      Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
      GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
    • hi, also das ganze klappt bei mir wunderbar... jedoch hab ich zwei fragen die mich beschäftigen...

      1. ich will ein weiteres object machen also ein anderes licht mit anderer farbe und aussehen.. wie setze ich das um ? ich hab versucht im "light_refresh" script das abzuändern, aber habs nich hinbekommen. Kann mir da jemand helfen ?

      2. will ich die helligkeit der gegend wärend dem spiel ändern. Also das Script ist ja dafür verantwortlich "light_init(make_color_rgb(5,5,5));" . Aber wenn ich das wärend dem Spiel verändern will bekom ich einen fehler.. ich glaub ich mach da was falsch :) kann mir evtl auch hier jemand helfen ? THX :)
    • zu 2.: Es wurde ja gesagt, dass

      GML-Quellcode

      1. a_color = make_color_rgb(255-color_get_red(argument0),255-color_get_green(argument0),255-color_get_blue(argument0));
      dafür zuständig ist, die umgebungsfarbe einzustellen. Um jetzt nur die farbe zu ändern machst du einfach ein Script mit der oben genannten zeile, und dann sollte es funktionieren!
      “Computers are good at following instructions, but not at reading your mind.” (Donald Knuth)

      Ich schreibe mit Neo.
    • ok habs auch geschafft mit der lichterfarbe :D ;)

      aber einen fehler hab ich entdeckt !!!! unzwar wenn ich das frame drei mal starte (also zum anderen frame wechsel dann wieder züruck usw bis zum dritten mal), dann steht da Error in action number 1 of draw event for obj_light_controler: Trying to use non-exiting surface
      :-/ hab das ganze sogar neu nach anleitung hier aus dem forum gemacht.. aber das passiert immer noch ... komischerweise immer nach dem dritten mal wenn ich in das frame/raum wechsel :-/ weiss jemand rat ?


      edit : Hat niemand rat ? -.-

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

    • Original von F.S.
      Wo bleibt der THX-Bot?

      den gabs damals noch nicht. ich hab den mal angemacht.
      Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
      GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x