Nach (mal wieder) längerer auszeit, habe ich wieder im Game Maker ein wenig herumgespielt.
Normalerweiße wollte ich einen kleinen draw_messagebox Skript für diese Community schreiben, der einige Funktionen beinhaltet, jedoch verzweifle ich jetzt selber,
denn Starte ich mein Skript, so wird keine Fehlermeldung ausgegeben. Auch wenn im Spiel der Skript ausgeführt werden sollte, so wird ohne jegliche Fehlermeldung einfach das "Spiel" beendet.
Leider weiß ich nicht voran es scheitert, somit habe ich mich mal entschieden euch zu fragen.
Hier ist die Source, des Skriptes (sehr viele Kommentare, da es nachher jeder benutzen können sollte)
draw_messagebox
Spoiler anzeigen
Alles anzeigen
Und das draw_event des Objekts "object0" (das einzigste Event vom einzigsten Objekt)
Spoiler anzeigen
Ich habe absolut keine ahnung, und hoffe das mir jemand von euch sagen kann voran dies liegt (vorallem das der Game Maker keine Fehlermeldung ausgibt, und sich einfach so beendet oO)
Mfg.,
Metalknight
Normalerweiße wollte ich einen kleinen draw_messagebox Skript für diese Community schreiben, der einige Funktionen beinhaltet, jedoch verzweifle ich jetzt selber,
denn Starte ich mein Skript, so wird keine Fehlermeldung ausgegeben. Auch wenn im Spiel der Skript ausgeführt werden sollte, so wird ohne jegliche Fehlermeldung einfach das "Spiel" beendet.
Leider weiß ich nicht voran es scheitert, somit habe ich mich mal entschieden euch zu fragen.
Hier ist die Source, des Skriptes (sehr viele Kommentare, da es nachher jeder benutzen können sollte)
draw_messagebox
GML-Quellcode
- {
- // draw_messagebox(xpos,ypos,width,height,str,col,back_c,br_col,spd,alpha,margin);
- // ==================================================================
- // Copyright Pascal 'Metalknight' Piduhn 2009
- // Credits wäre nett, ist aber kein muss ;)
- // ==================================================================
- // Argumente werden in localen (!) Variablen gespeichert
- var xpos, ypos, width, height, str, col, back_c, br_col, spd, alpha, margin;
- xpos = argument0; // Die X-Position der Messagebox
- ypos = argument1; // Die Y-Position der Messagebox
- width = argument2; // Die relative Länge der Messagebox (relativ zu xpos)
- height = argument3; // Die relative Breite der Messagebox (relativ zu ypos)
- str = argument4; // Der Text, den die Messagebox beinhalten soll
- col = argument5; // Die Farbe, die der normale Messagebox-Text haben soll
- back_c = argument6; // Die Hintergrundsfarbe der Messagebox
- br_col = argument7; // Die Randfarbe der Messagebox
- spd = argument8; // Die Geschwindigkeit, mit der der Text in der Messagebox gezeichnet werden soll
- alpha = argument9; // Der Alpha Wert des Textes, der in die Messagebox geschrieben wird
- margin = argument10; // Der Abstand zwischen dem Text und dem Rand (da der Game Maker nur 10 Argumente
- // hat, kann man leider nur ein Margin für alle Randabstände einstellen - oder man editiert den Code unten!)
- // Erstelle zwei lokale Variablen, die die alte Farbe und den alten Alpha Wert speichern
- var o_col, o_alpha;
- o_col = draw_get_color();
- o_alpha = draw_get_alpha();
- // Screen einmal neu malen (alle Draw Events aufrufen)
- screen_redraw();
- // 1. Zeichne die Messagebox
- /// Die Messagebox wird nun zuerst mit einen Alpha Wert von 1
- /// und der Hintergrundsfarbe "back_c", an der Position (xpos|ypos)
- /// mit der Breite "width" und der höhe "height", gezeichnet.
- /// Dadrüber wird der Rand mit der Farbe "br_col", an der Position
- /// (xpos|ypos) mit der Breite "width" und der höhe "height", gezeichnet.
- draw_set_alpha(1);
- draw_set_color(back_c);
- draw_rectangle(xpos,ypos,xpos+width,ypos+height,false);
- draw_set_color(br_col);
- draw_rectangle(xpos,ypos,xpos+width,ypos+height,false);
- // 2. Text Bearbeiten
- /// In diesem Schritt wird der Text ordnungsgemäß bearbeitet. Zu erst
- /// wird in der "Breiten Phase" die Text Breite ermittelt. Sollte der
- /// Text breiter sein als eine "Line", so wird bei dem nächst möglichen
- /// Leerzeichen (" ") ein "#" eingefügt. Somit wird ein Teil des Strings in
- /// der nächsten "Line" gezeichnet.
- /// In der zweiten Phase, der "Höhen Phase" wird überprüft ob der Text
- /// zu tief ist, also tiefer als die Messagebox. Sollte dies der Fall sein
- /// wird ein Abbild des vorher bearbeiteten Textes (argument4) mit allen
- /// voreinstellungen erneut an draw_messagebox geschickt. (Jedoch natürlich
- /// nur der vorher nicht gezeichnete Teil)
- var i, j;
- // 2.1 "Breiten Phase"
- for (i = 0; i < string_length(str); i += 1)
- {
- if (string_width(string_copy(str,0,i)) > width-(margin*2))
- {
- for (j = i; j > 0; j -= 1)
- {
- if (string_char_at(str,j) == " ")
- break;
- }
- if (j != 0)
- str = string_insert("#",str,j+1);
- else
- str = string_insert("#",str,i);
- }
- }
- // 2.2 "Höhen Phase"
- /// Anmerkung:
- /// Die Variable to_large nutz der Skript am Ende, um im Step 5. zu
- /// überprüfen, ob es weiteren Text gibt, den man mit einen Abbild von
- /// argument4 zeichnen muss, und somit die Funktion sich selbst neu aufruft
- var to_large;
- to_large = false;
- for (i = 0; i < string_length(str); i += 1)
- {
- if (string_height(string_copy(str,0,i)) > height-(margin*2))
- {
- to_large = true;
- str = string_delete(str,i,string_length(str)-i);
- break;
- }
- }
- // 3. Text Zeichnen
- /// Nun wird der passend, "skalierte" (bearbeitete) Text "str"
- /// mit einer Geschwindigkeit von "spd", und einen Alpha Wert von "alpha",
- /// und einen Abstand von "margin" zu allen vier Rändern hin, und der Farbe
- /// "col", gezeichnet.
- /// Weitere Bemerkung:
- /// Es gibt momentan zwei Vorgefertigte Text-Aktionen. Du darfst natürlich
- /// diese erweitern, bearbeiten, und verändern - passend zu deinem Spiel ;)
- i = 0;
- draw_set_color(col);
- draw_set_alpha(alpha);
- while (i < string_length(str))
- {
- // ANFANG - TEXT AKTIONEN - ANFANG
- if (string_char_at(str,i) == "§")
- {
- switch (string_copy(str,i,3))
- {
- case "§00":
- sleep(400);
- break;
- case "§01":
- str = string_insert("#",str,i+3);
- break;
- }
- // Diesen Befehl nur dann erweitern, falls die Text Aktionen
- // von "§00" bis "§99" vergeben sind.
- // Wer nicht so ganz auf die Übersichtlichkeit achtet, kann
- // auch noch von "§aa" bis "§zz" und von "§AA" bis "§ZZ" und
- // einen Groß- und Kleinschreibungs Mix machen (und das ganze
- // nochmal mit den Zahlen von 0-9 ... eine unmengen an
- // Text Aktionen können also so auch mit nur zwei Feldern
- // Definiert werden - zum schaden der Übersichtlichkeit.
- str = string_delete(str,i,3);
- }
- // ENDE - TEXT AKTIONEN - ENDE
- else
- {
- draw_text(xpos+margin,ypos+margin,string_copy(str,0,i));
- screen_refresh();
- sleep(100/spd);
- }
- i += 1;
- }
- // 4. Sonstiges
- /// Hier werden die alten Werte (Alpha / Color) zurückgesetzt, und
- /// außerdem kann (wie in diesem Beispiel) ein "Continue" (Fortsetzungs)
- /// Pfeil eingefügt werden, nachdem der ganze Text gezeichnet wurde.
- /// Zu schluss warten wir auf eine Reaktion des Spieler, der einen
- /// (bestimmten ?) Knopf drücken soll, um Fortzufahren mit den nächsten
- /// Text (falls to_large = true) / um die "Messagebox" zu beenden, nachdem
- /// lesen.
- draw_sprite(s_con_pfeil,0,xpos+(width/2),ypos+height-(margin/2));
- draw_set_color(o_col);
- draw_set_alpha(o_alpha);
- screen_refresh();
- keyboard_wait();
- // 5. "Outro"
- /// Hier wird nun überprüft, ob es weiteren Text gibt, der einfach "to_large"
- /// für die Messagebox war. Dies wird also mittels "to_large" überprüft, und
- /// falls es weiteren Text gibt, wird mithilfe des nicht bearbeiteten Textes
- /// argument4 ein Abbild erschaffen, das nicht mehr den Inhalt von dem
- /// Text String "str" enthält.
- if (to_large == false)
- return 1; // Die Messagebox gibt bei erfolgreichem Beenden eine 1 zurück
- str = string_replace_all(str,"#"," ");
- argument4 = string_replace(argument4,str,"");
- draw_messagebox(argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10);
- }
Und das draw_event des Objekts "object0" (das einzigste Event vom einzigsten Objekt)
GML-Quellcode
- draw_set_color(c_red);
- draw_circle(x,y,20,true);
- draw_text(10,10,string(distance_to_point(mouse_x,mouse_y)));
- if (distance_to_point(mouse_x,mouse_y) < 20)
- draw_messagebox(x,y,200,150,"Dies ist eine einfache Demonstration, des draw_messagebox Skriptes von Metalknight. Es ist einfach zu verstehen, dank vielen Kommentaren, und auch einfach zu erweitern. Ein Credits eintrag bei dem gebrauch wäre nett, ist aber nicht notwendig!$00$01Mfg.,$01Metalknight",c_black,c_white,c_gray,8,1,3);
- // draw_messagebox(xpos,ypos,width,height,str,col,back_c,br_col,spd,alpha,margin);
Ich habe absolut keine ahnung, und hoffe das mir jemand von euch sagen kann voran dies liegt (vorallem das der Game Maker keine Fehlermeldung ausgibt, und sich einfach so beendet oO)
Mfg.,
Metalknight