Hi, vielleicht hast du schon im GameMaker von Surfaces gehört.
Mit ihnen kann man eine einfache Lichtquelle oder sogar ein Malprogramm erstellen.
Schaut man sich Beispiele dazu an, versteht man aber größten Teils einfach nur Bahnhof.
In diesem Tutorial werde ich versuchen dir beizubringen, wie man so etwas benutzt.
Der Begriff Surface bedeutet im Deutschen soviel wie Oberfläche und das ist es im großen und ganzen auch.
Statt sich eine Leinwand in einem Laden zu kaufen und dafür Geld auszugeben, müssen wir nur einen Befehl ausführen, der uns diese Leinwand in beliebiger Größe gibt.
Hinweis: ich schreibe den Code (die Variablen und eigentlich auch die Kommentare) in englisch, da ich der Meinung bin, dass dies besser und cooler ist :)
Ich erstelle damit eine Variable, die mehr oder weniger die ganze Leinwand besitzt (die freut sich bestimmt :D). width und height ist hierbei Breite und Höhe in Pixeln.
Die Leinwand möchte ich erst einmal zum Malen gebrauchen, wozu mir eine Größe von 640x480 reicht (in dem Fall so groß wie mein Room).
Wenn ich mit meiner Maus auf der Oberfläche der Leinwand klicke/gedrückt halte, will ich einfach nur einen Kreis drauf zeichnen, der meinen „Pinsel“ darstellen soll.
Um zu schauen ob die Maus auf der linken Taste gedrückt wird, kann ich diesen Code benutzen:
Fragt sich jetzt nur, wie man die Leinwand bemalt. Dies ist jedoch gar nicht so schwer.
Man sagt dem Computer, dass man jetzt mit dem Zeichnen beginnen möchte, indem man diesen Befehl ausführt:
Und jetzt darf ich sogar etwas machen, was man sonst nicht macht:
draw_* Funktionen kannst ich zu diesem Zeitpunkt außerhalb des Draw's verwenden!
Das heißt, dass du jetzt einen Kreis zeichnen kannst, der aber erstmals nur auf der Leinwand erscheint, jedoch nicht auf dem Bildschirm.
In dem Fall zeichne ich einen Kreis mit dem Radius 5 an der Mausposition.
Wenn ich mit dem zeichnen fertig bin, kann ich die Arbeiten abschließen (muss gemacht werden), indem ich diesen Befehl ausführe:
Zurzeit kann man aber so viel klicken, wie man will und man zeichnet nichts auf die Leinwand.
Das ist so, weil die Leinwand erst im Draw gezeichnet werden muss.
Dies geht aber ganz einfach mit
x und y sind natürlich die Koordinaten, die in diesem Fall 0 und 0 sind.
Nun kann man auf der Leinwand zeichnen!
Ich habe aber eine wichtige Sache noch nicht gesagt:
Das Surface/die Leinwand ist in der Grafikkarte gespeichert. Manchmal, wenn man beispielsweise das Programm/Fenster minimiert, wird es einfach so mir nichts dir nichts aus dem Speicher gelöscht.
Will ich es dann zeichnen oder etwas darauf zeichnen, bekommst ich dann einen Fehler von GameMaker, dass das Surface nicht existiert.
Da müsste ich also noch am Code etwas machen. Bis jetzt sieht er im Step so aus:
Die Abfrage, ob ein Surface existiert bzw. noch da ist funktioniert so:
Wenn es nicht mehr existiert kann ich es einfach wieder neu erstellen und die Variable ist wieder stolzer Besitzer einer neuen Leinwand:
Zusammengefügt:
Das selbe müsste ich noch beim zeichnen der Leinwand machen:
Jetzt bin ich fertig!
Man kann theoretisch noch eine Löschfunktion einbauen, die alles gemalte zurücksetzt. Dies macht man beim Zeichnen der Leinwand:
Zu Anfangs erwähnte ich auch noch, dass man eine kleine Lichtquelle erstellen kann.
In der Theorie geht man dabei so vor:
Leinwand komplett schwarz oder stark dunkel machen und an den Positionen der Lampen das Schwarze einfach ausstanzen, damit diese Stelle transparenter wird.
Ganz zu Anfangs muss also über
Schwarzes Rechteck über das Surface gezogen werden:
Später muss dann das Rechteck mit einer Lichtquelle ersetzt werden, damit man dort durchschauen kann.
Als erstes setzt man den sogenannten blendmode auf subtract, wodurch man die jeweiligen Stellen ausstanzen kann.
Danach muss einfach nur das gezeichnet werden, was die Fläche ausstanzen soll:
Das wars schon fast. Zum Schluss muss der Modus aber wieder zurück gestellt werden:
So das war's. Wenn du Fragen hast, frag sie einfach hier, als PN oder über Discord(Link in Signatur).
Ich wünsche dir noch einen schönen Tag
Weitere Tutorials:
Mit ihnen kann man eine einfache Lichtquelle oder sogar ein Malprogramm erstellen.
Schaut man sich Beispiele dazu an, versteht man aber größten Teils einfach nur Bahnhof.
In diesem Tutorial werde ich versuchen dir beizubringen, wie man so etwas benutzt.
Der Begriff Surface bedeutet im Deutschen soviel wie Oberfläche und das ist es im großen und ganzen auch.
Statt sich eine Leinwand in einem Laden zu kaufen und dafür Geld auszugeben, müssen wir nur einen Befehl ausführen, der uns diese Leinwand in beliebiger Größe gibt.
Hinweis: ich schreibe den Code (die Variablen und eigentlich auch die Kommentare) in englisch, da ich der Meinung bin, dass dies besser und cooler ist :)
Ich erstelle damit eine Variable, die mehr oder weniger die ganze Leinwand besitzt (die freut sich bestimmt :D). width und height ist hierbei Breite und Höhe in Pixeln.
Die Leinwand möchte ich erst einmal zum Malen gebrauchen, wozu mir eine Größe von 640x480 reicht (in dem Fall so groß wie mein Room).
Wenn ich mit meiner Maus auf der Oberfläche der Leinwand klicke/gedrückt halte, will ich einfach nur einen Kreis drauf zeichnen, der meinen „Pinsel“ darstellen soll.
Um zu schauen ob die Maus auf der linken Taste gedrückt wird, kann ich diesen Code benutzen:
Fragt sich jetzt nur, wie man die Leinwand bemalt. Dies ist jedoch gar nicht so schwer.
Man sagt dem Computer, dass man jetzt mit dem Zeichnen beginnen möchte, indem man diesen Befehl ausführt:
Und jetzt darf ich sogar etwas machen, was man sonst nicht macht:
draw_* Funktionen kannst ich zu diesem Zeitpunkt außerhalb des Draw's verwenden!
Das heißt, dass du jetzt einen Kreis zeichnen kannst, der aber erstmals nur auf der Leinwand erscheint, jedoch nicht auf dem Bildschirm.
In dem Fall zeichne ich einen Kreis mit dem Radius 5 an der Mausposition.
Wenn ich mit dem zeichnen fertig bin, kann ich die Arbeiten abschließen (muss gemacht werden), indem ich diesen Befehl ausführe:
Zurzeit kann man aber so viel klicken, wie man will und man zeichnet nichts auf die Leinwand.
Das ist so, weil die Leinwand erst im Draw gezeichnet werden muss.
Dies geht aber ganz einfach mit
x und y sind natürlich die Koordinaten, die in diesem Fall 0 und 0 sind.
Nun kann man auf der Leinwand zeichnen!
Ich habe aber eine wichtige Sache noch nicht gesagt:
Das Surface/die Leinwand ist in der Grafikkarte gespeichert. Manchmal, wenn man beispielsweise das Programm/Fenster minimiert, wird es einfach so mir nichts dir nichts aus dem Speicher gelöscht.
Will ich es dann zeichnen oder etwas darauf zeichnen, bekommst ich dann einen Fehler von GameMaker, dass das Surface nicht existiert.
Da müsste ich also noch am Code etwas machen. Bis jetzt sieht er im Step so aus:
Die Abfrage, ob ein Surface existiert bzw. noch da ist funktioniert so:
Wenn es nicht mehr existiert kann ich es einfach wieder neu erstellen und die Variable ist wieder stolzer Besitzer einer neuen Leinwand:
Zusammengefügt:
GML-Quellcode
- if(mouse_check_button(mb_left)){ //wenn Maustaste gedrückt wird
- if(surface_exists(surface)){ //wenn Leinwand nicht existiert
- surface = surface_create(640, 480); //erstelle eine neue
- }
- surface_set_target(surface); //beginne auf der Leinwand zu zeichnen
- draw_circle(mouse_x,mouse_y, 5, false); //zeichne einen Kreis
- surface_reset_target(); //beende das zeichnen
- }
Das selbe müsste ich noch beim zeichnen der Leinwand machen:
Jetzt bin ich fertig!
Man kann theoretisch noch eine Löschfunktion einbauen, die alles gemalte zurücksetzt. Dies macht man beim Zeichnen der Leinwand:
Zu Anfangs erwähnte ich auch noch, dass man eine kleine Lichtquelle erstellen kann.
In der Theorie geht man dabei so vor:
Leinwand komplett schwarz oder stark dunkel machen und an den Positionen der Lampen das Schwarze einfach ausstanzen, damit diese Stelle transparenter wird.
Ganz zu Anfangs muss also über
Schwarzes Rechteck über das Surface gezogen werden:
Später muss dann das Rechteck mit einer Lichtquelle ersetzt werden, damit man dort durchschauen kann.
Als erstes setzt man den sogenannten blendmode auf subtract, wodurch man die jeweiligen Stellen ausstanzen kann.
Danach muss einfach nur das gezeichnet werden, was die Fläche ausstanzen soll:
Das wars schon fast. Zum Schluss muss der Modus aber wieder zurück gestellt werden:
So das war's. Wenn du Fragen hast, frag sie einfach hier, als PN oder über Discord(Link in Signatur).
Ich wünsche dir noch einen schönen Tag
Weitere Tutorials:
Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach
Willst du mit mir auf Discord Chatten/Quatschen?
Meine Husi's Tutorial Reihe
Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach
Willst du mit mir auf Discord Chatten/Quatschen?
Meine Husi's Tutorial Reihe
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Husi012 ()