Surface leicht gemacht

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

    • Surface leicht gemacht

      So, da ich jetzt vor kurzem viele Erfahrungen in Surface zeichnen gemacht habe. Werde ich hier mal versuchen ein kleines Tutorial zu machen.

      Viele wollen ihre Spiele mit coolen Effekten ausschmücken. Einige wollten schon immermal eine Map haben, die man zerstören kann. So wie bei Worms.
      Das ist mit Surface ganz einfach.

      Ich versuche nun anhand eines Examples die Funktion "Surface" euch ein wenig näher zu bringen.
      Es sei noch gesagt, dass es bei manchen zu evtl. Problemen kommen kann, was später die Tranzparents ausmacht (zumindest beim GM6).
      Im Example werden wir ein Guckloch zeichnen. Oder auch Fog-of-War.

      Was ist Surface:
      Surface ist Englisch (klar ^^) und heißt "Oberfläche".
      Mit Oberflächen ist es möglich Dinge zu zeichen wie im Draw-Event. Nur das nicht direkt gezeichnet wird.
      Die Oberfläche befindet sich nachdem man sie erstellt hat im VRAM (Video-Arbeitspeicher).
      Solange man auf dieser Oberfläche zeichnet, hat es keinen Einflüss auf das eigentliche Draw-Event.


      Wie wende ich Surface an:
      Die erste Funktion um eine Oberfläche zu erstellen lautet "surface_create".
      Dazu muss man die größe der Oberfläche angeben. Hier im Example nehmen wir 640x480. Da unser Raum die selben Maße hat.

      Da wir unsere Surface gleich ansprechen wollen, müssen wir eine Variable erstellen, die dessen ID speichert.
      Unsere erste Zeile im
      Create-Event sieht also wie folgt aus:

      GML-Quellcode

      1. sf=surface_create(640,480);
      sf ist unsere Variable. Ihr könnt diese so nennen wie ihr wollt (zb. surface_a).

      So nun können wir diese Oberfläche ansprechen und verwenden.
      Wir müssen nun sagen, das wir nun auf dieser Öberfläche zeichnen wollen.
      Dazu schreiben wir folgendes im selbigen Create-Event:

      GML-Quellcode

      1. surface_set_target(sf);
      (target=ziel)

      Nun wurde eine Oberfläche erstellt. Diese wird aber wahrscheinlich "dreckig" sein. Da sich diese im VRAM befindet. Im VRAM wird alles bearbeitet was du gerade auf deinem Monitor siehst.
      Um dies zu vermeiden und die Oberfläche zu säubern, fügen wird folgendes ein:

      GML-Quellcode

      1. draw_clear_alpha(0,0);


      Nun zeichnen wir ein schwarzes Rechteck über den Screen, also Oberfläche.

      GML-Quellcode

      1. draw_rectangle_color(0,0,640,480,0,0,0,0,0);


      So mehr wollen wir im Create-Event auf der Surface nicht zeichen. Also geben wir die Draw-Funktionen wieder für den normalen Gebrauch frei und schließen wie folgt ab:

      GML-Quellcode

      1. surface_reset_target();


      Nun nehmen wir uns das Step-Event vor.
      Hier werden wird das Loch zeichnen.
      Dazu verwenden wir auch eine sehr nützliche Funktion des GM. Und zwar "draw_set_blend_mode" um diesen Kreis tanzparant zu zeichnen.
      Der gesamte Script im Step sieht so aus:

      GML-Quellcode

      1. surface_set_target(sf);
      2. draw_clear_alpha(0,0); //Das hält die Surface einfach sauber.
      3. draw_rectangle_color(0,0,640,480,0,0,0,0,0); //Damit wir mit dem Loch nichts dauerhaft löschen.
      4. draw_set_blend_mode_ext(0,4); //Tranzparents
      5. draw_circle(mouse_x,mouse_y,64,0); //Kreis ^^
      6. draw_set_blend_mode(bm_normal); //Damit wieder normal gezeichnet werden kann. (Ohne ..._ext(0,4).
      7. surface_reset_target();


      Weil wir unseren Speicher mögen und nicht schlecht behandeln wollen, ^^ frühen wir folgendes im Game_end-Event aus. Um die Surface zu löschen.

      GML-Quellcode

      1. surface_free(sf);


      So jetzt sind wir eig. fertig.
      Nun können wir die Surface zeichen. Das sieht so aus:

      GML-Quellcode

      1. draw_background(back,0,0); //Hinten
      2. draw_surface(sf,0,0); //Vorne

      als "back" habe ich irgendein Hintergundbild genommen. Ihr könnt aber alles verweden. Es muss kein Background sein.

      Um auch immer alles zu verstecken was nicht im Kreis ist, schiebt das Object mit der Surface weit in den Vordergrund. (zb. Mit depth=-100000000).



      Ich hoffe es hat euch Spaß gemacht und alles verstanden.


      Edit: Freut mich, dass es euch gefällt. Klickt doch als Dankeschön auf den Danke-Button. Bringt mir mehr :D.

      [edit: Farben, für bessere lesbarkeit geändert]


      Dateien
      • guckloch.rar

        (746,61 kB, 458 mal heruntergeladen, zuletzt: )
      [Signature is loading ... Please use while you waiting the thanks-button. If it is enabled. -->]

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von DAG ()

    • Cooles Tutorial. Habe noch nie irgendwas mit Surfaces gemacht, aber mit nem kleinen Schubser durch dieses Tutorial werde ich mir vielleicht einige Anwendungsmöglichkeiten für mein Projekt einfallen lassen.
      Aber ehrlich gesagt finde ich die rote Schrift im Tutorial sehr störend. Liest sich nicht sonderlich gut. o.o