Game Maker beendet ohne Fehlermeldung meinen draw_messagebox Skript oO

  • GM 7

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

  • Game Maker beendet ohne Fehlermeldung meinen draw_messagebox Skript oO

    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

    GML-Quellcode

    1. {
    2. // draw_messagebox(xpos,ypos,width,height,str,col,back_c,br_col,spd,alpha,margin);
    3. // ==================================================================
    4. // Copyright Pascal 'Metalknight' Piduhn 2009
    5. // Credits wäre nett, ist aber kein muss ;)
    6. // ==================================================================
    7. // Argumente werden in localen (!) Variablen gespeichert
    8. var xpos, ypos, width, height, str, col, back_c, br_col, spd, alpha, margin;
    9. xpos = argument0; // Die X-Position der Messagebox
    10. ypos = argument1; // Die Y-Position der Messagebox
    11. width = argument2; // Die relative Länge der Messagebox (relativ zu xpos)
    12. height = argument3; // Die relative Breite der Messagebox (relativ zu ypos)
    13. str = argument4; // Der Text, den die Messagebox beinhalten soll
    14. col = argument5; // Die Farbe, die der normale Messagebox-Text haben soll
    15. back_c = argument6; // Die Hintergrundsfarbe der Messagebox
    16. br_col = argument7; // Die Randfarbe der Messagebox
    17. spd = argument8; // Die Geschwindigkeit, mit der der Text in der Messagebox gezeichnet werden soll
    18. alpha = argument9; // Der Alpha Wert des Textes, der in die Messagebox geschrieben wird
    19. margin = argument10; // Der Abstand zwischen dem Text und dem Rand (da der Game Maker nur 10 Argumente
    20. // hat, kann man leider nur ein Margin für alle Randabstände einstellen - oder man editiert den Code unten!)
    21. // Erstelle zwei lokale Variablen, die die alte Farbe und den alten Alpha Wert speichern
    22. var o_col, o_alpha;
    23. o_col = draw_get_color();
    24. o_alpha = draw_get_alpha();
    25. // Screen einmal neu malen (alle Draw Events aufrufen)
    26. screen_redraw();
    27. // 1. Zeichne die Messagebox
    28. /// Die Messagebox wird nun zuerst mit einen Alpha Wert von 1
    29. /// und der Hintergrundsfarbe "back_c", an der Position (xpos|ypos)
    30. /// mit der Breite "width" und der höhe "height", gezeichnet.
    31. /// Dadrüber wird der Rand mit der Farbe "br_col", an der Position
    32. /// (xpos|ypos) mit der Breite "width" und der höhe "height", gezeichnet.
    33. draw_set_alpha(1);
    34. draw_set_color(back_c);
    35. draw_rectangle(xpos,ypos,xpos+width,ypos+height,false);
    36. draw_set_color(br_col);
    37. draw_rectangle(xpos,ypos,xpos+width,ypos+height,false);
    38. // 2. Text Bearbeiten
    39. /// In diesem Schritt wird der Text ordnungsgemäß bearbeitet. Zu erst
    40. /// wird in der "Breiten Phase" die Text Breite ermittelt. Sollte der
    41. /// Text breiter sein als eine "Line", so wird bei dem nächst möglichen
    42. /// Leerzeichen (" ") ein "#" eingefügt. Somit wird ein Teil des Strings in
    43. /// der nächsten "Line" gezeichnet.
    44. /// In der zweiten Phase, der "Höhen Phase" wird überprüft ob der Text
    45. /// zu tief ist, also tiefer als die Messagebox. Sollte dies der Fall sein
    46. /// wird ein Abbild des vorher bearbeiteten Textes (argument4) mit allen
    47. /// voreinstellungen erneut an draw_messagebox geschickt. (Jedoch natürlich
    48. /// nur der vorher nicht gezeichnete Teil)
    49. var i, j;
    50. // 2.1 "Breiten Phase"
    51. for (i = 0; i < string_length(str); i += 1)
    52. {
    53. if (string_width(string_copy(str,0,i)) > width-(margin*2))
    54. {
    55. for (j = i; j > 0; j -= 1)
    56. {
    57. if (string_char_at(str,j) == " ")
    58. break;
    59. }
    60. if (j != 0)
    61. str = string_insert("#",str,j+1);
    62. else
    63. str = string_insert("#",str,i);
    64. }
    65. }
    66. // 2.2 "Höhen Phase"
    67. /// Anmerkung:
    68. /// Die Variable to_large nutz der Skript am Ende, um im Step 5. zu
    69. /// überprüfen, ob es weiteren Text gibt, den man mit einen Abbild von
    70. /// argument4 zeichnen muss, und somit die Funktion sich selbst neu aufruft
    71. var to_large;
    72. to_large = false;
    73. for (i = 0; i < string_length(str); i += 1)
    74. {
    75. if (string_height(string_copy(str,0,i)) > height-(margin*2))
    76. {
    77. to_large = true;
    78. str = string_delete(str,i,string_length(str)-i);
    79. break;
    80. }
    81. }
    82. // 3. Text Zeichnen
    83. /// Nun wird der passend, "skalierte" (bearbeitete) Text "str"
    84. /// mit einer Geschwindigkeit von "spd", und einen Alpha Wert von "alpha",
    85. /// und einen Abstand von "margin" zu allen vier Rändern hin, und der Farbe
    86. /// "col", gezeichnet.
    87. /// Weitere Bemerkung:
    88. /// Es gibt momentan zwei Vorgefertigte Text-Aktionen. Du darfst natürlich
    89. /// diese erweitern, bearbeiten, und verändern - passend zu deinem Spiel ;)
    90. i = 0;
    91. draw_set_color(col);
    92. draw_set_alpha(alpha);
    93. while (i < string_length(str))
    94. {
    95. // ANFANG - TEXT AKTIONEN - ANFANG
    96. if (string_char_at(str,i) == "§")
    97. {
    98. switch (string_copy(str,i,3))
    99. {
    100. case "§00":
    101. sleep(400);
    102. break;
    103. case "§01":
    104. str = string_insert("#",str,i+3);
    105. break;
    106. }
    107. // Diesen Befehl nur dann erweitern, falls die Text Aktionen
    108. // von "§00" bis "§99" vergeben sind.
    109. // Wer nicht so ganz auf die Übersichtlichkeit achtet, kann
    110. // auch noch von "§aa" bis "§zz" und von "§AA" bis "§ZZ" und
    111. // einen Groß- und Kleinschreibungs Mix machen (und das ganze
    112. // nochmal mit den Zahlen von 0-9 ... eine unmengen an
    113. // Text Aktionen können also so auch mit nur zwei Feldern
    114. // Definiert werden - zum schaden der Übersichtlichkeit.
    115. str = string_delete(str,i,3);
    116. }
    117. // ENDE - TEXT AKTIONEN - ENDE
    118. else
    119. {
    120. draw_text(xpos+margin,ypos+margin,string_copy(str,0,i));
    121. screen_refresh();
    122. sleep(100/spd);
    123. }
    124. i += 1;
    125. }
    126. // 4. Sonstiges
    127. /// Hier werden die alten Werte (Alpha / Color) zurückgesetzt, und
    128. /// außerdem kann (wie in diesem Beispiel) ein "Continue" (Fortsetzungs)
    129. /// Pfeil eingefügt werden, nachdem der ganze Text gezeichnet wurde.
    130. /// Zu schluss warten wir auf eine Reaktion des Spieler, der einen
    131. /// (bestimmten ?) Knopf drücken soll, um Fortzufahren mit den nächsten
    132. /// Text (falls to_large = true) / um die "Messagebox" zu beenden, nachdem
    133. /// lesen.
    134. draw_sprite(s_con_pfeil,0,xpos+(width/2),ypos+height-(margin/2));
    135. draw_set_color(o_col);
    136. draw_set_alpha(o_alpha);
    137. screen_refresh();
    138. keyboard_wait();
    139. // 5. "Outro"
    140. /// Hier wird nun überprüft, ob es weiteren Text gibt, der einfach "to_large"
    141. /// für die Messagebox war. Dies wird also mittels "to_large" überprüft, und
    142. /// falls es weiteren Text gibt, wird mithilfe des nicht bearbeiteten Textes
    143. /// argument4 ein Abbild erschaffen, das nicht mehr den Inhalt von dem
    144. /// Text String "str" enthält.
    145. if (to_large == false)
    146. return 1; // Die Messagebox gibt bei erfolgreichem Beenden eine 1 zurück
    147. str = string_replace_all(str,"#"," ");
    148. argument4 = string_replace(argument4,str,"");
    149. draw_messagebox(argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10);
    150. }
    Alles anzeigen


    Und das draw_event des Objekts "object0" (das einzigste Event vom einzigsten Objekt)
    Spoiler anzeigen

    GML-Quellcode

    1. draw_set_color(c_red);
    2. draw_circle(x,y,20,true);
    3. draw_text(10,10,string(distance_to_point(mouse_x,mouse_y)));
    4. if (distance_to_point(mouse_x,mouse_y) < 20)
    5. 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);
    6. // 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
  • Da ich gerade nix zu tun hatte, hab ich mal eben das Zeug debuggt.
    Dabei kam raus, dass der übeltäter screen_redraw(); ist, stattdessen
    screen_refresh(); und das script läuft.

    Aber deine Test Methode geht nicht, ich hab dazu einfach nen kleinen String zeichnen lassen.
    Allerdings wird dabei das letzte Zeichen verschluckt.
    Wenn ich also "Hello World" eintippe kommt nur "Hello Worl".
    Wenn ich deinen String zeichnen lassen will hängt sich das ding auf. Wohl ein Problem mit dem Parser.
    An der Sache musst du noch arbeiten ;)
    Face in the wind, we're riding the storm
    We'll stay our course whatever will come
    ~~ Stay (Running) Wild ~~
  • Vielen Dank Defmaster!

    Es war tatsächlich die screen_redraw(); Methode. Komisch nur, wenn ich screen_redraw(); wie jetzt im Skript fast am Ende tue, erhalte ich den gleichen Effekt, jedoch das es auch Funktioniert... - aber jetzt Funktioniert es ja ^^

    Außerdem habe ich nochmal ein bisschen mehr überarbeitet - die Messagebox hat ne mindest Tiefe und Breite da sonst auch hänger kämen, der Fehler mit den abgehackten Wörter wurde behoben (von deinen Beispiel ;) ), und der "Parser" für die Aktion Codes wurde etwas verändert, besser gesagt das rausnehmen des Befehls im Text str.

    Soweit habe ich nun keine Probleme mehr mit den Skript.

    draw_messagebox:
    Spoiler anzeigen

    GML-Quellcode

    1. {
    2. // draw_messagebox(xpos,ypos,width,height,str,col,back_c,br_col,spd,alpha,margin);
    3. // ==================================================================
    4. // Copyright Pascal 'Metalknight' Piduhn 2009
    5. // Credits wäre nett, ist aber kein muss ;)
    6. // ==================================================================
    7. // Special Thanks: Defmaster
    8. // Argumente werden in localen (!) Variablen gespeichert
    9. var xpos, ypos, width, height, str, col, back_c, br_col, spd, alpha, margin;
    10. xpos = argument0; // Die X-Position der Messagebox
    11. ypos = argument1; // Die Y-Position der Messagebox
    12. width = max(argument2,250); // Die relative Breite der Messagebox (relativ zu xpos)
    13. height = max(argument3,50); // Die relative Tiefe der Messagebox (relativ zu ypos)
    14. str= argument4; // Der Text, den die Messagebox beinhalten soll
    15. col= argument5; // Die Farbe, die der normale Messagebox-Text haben soll
    16. back_c = argument6; // Die Hintergrundsfarbe der Messagebox
    17. br_col = argument7; // Die Randfarbe der Messagebox
    18. spd= argument8; // Die Geschwindigkeit, mit der der Text in der Messagebox gezeichnet werden soll
    19. alpha = argument9; // Der Alpha Wert des Textes, der in die Messagebox geschrieben wird
    20. margin = argument10; // Der Abstand zwischen dem Text und dem Rand (da der Game Maker nur 10 Argumente
    21. // hat, kann man leider nur ein Margin für alle Randabstände einstellen - oder man editiert den Code unten!)
    22. // Erstelle zwei lokale Variablen, die die alte Farbe und den alten Alpha Wert speichern
    23. var o_col, o_alpha;
    24. o_col = draw_get_color();
    25. o_alpha = draw_get_alpha();
    26. // Screen einmal neu malen
    27. screen_refresh();
    28. // 1. Zeichne die Messagebox
    29. /// Die Messagebox wird nun zuerst mit einen Alpha Wert von 1
    30. /// und der Hintergrundsfarbe "back_c", an der Position (xpos|ypos)
    31. /// mit der Breite "width" und der höhe "height", gezeichnet.
    32. /// Dadrüber wird der Rand mit der Farbe "br_col", an der Position
    33. /// (xpos|ypos) mit der Breite "width" und der höhe "height", gezeichnet.
    34. draw_set_alpha(1);
    35. draw_set_color(back_c);
    36. draw_rectangle(xpos,ypos,xpos+width,ypos+height,false);
    37. draw_set_color(br_col);
    38. draw_rectangle(xpos,ypos,xpos+width,ypos+height,true);
    39. // 2. Text Bearbeiten
    40. /// In diesem Schritt wird der Text ordnungsgemäß bearbeitet. Zu erst
    41. /// wird in der "Breiten Phase" die Text Breite ermittelt. Sollte der
    42. /// Text breiter sein als eine "Line", so wird bei dem nächst möglichen
    43. /// Leerzeichen (" ") ein "#" eingefügt. Somit wird ein Teil des Strings in
    44. /// der nächsten "Line" gezeichnet.
    45. /// In der zweiten Phase, der "Höhen Phase" wird überprüft ob der Text
    46. /// zu tief ist, also tiefer als die Messagebox. Sollte dies der Fall sein
    47. /// wird ein Abbild des vorher bearbeiteten Textes (argument4) mit allen
    48. /// voreinstellungen erneut an draw_messagebox geschickt. (Jedoch natürlich
    49. /// nur der vorher nicht gezeichnete Teil)
    50. var i, j;
    51. // 2.1 "Breiten Phase"
    52. for (i = 0; i <= string_length(str); i += 1)
    53. {
    54. if (string_width(string_copy(str,0,i)) > width-(margin*2))
    55. {
    56. for (j = i; j > 0; j -= 1)
    57. {
    58. if (string_char_at(str,j) == " ")
    59. break;
    60. }
    61. if (j != 0)
    62. str = string_insert("#",str,j);
    63. else
    64. str = string_insert("#",str,i);
    65. }
    66. }
    67. // 2.2 "Höhen Phase"
    68. /// Anmerkung:
    69. /// Die Variable to_large nutz der Skript am Ende, um im Step 5. zu
    70. /// überprüfen, ob es weiteren Text gibt, den man mit einen Abbild von
    71. /// argument4 zeichnen muss, und somit die Funktion sich selbst neu aufruft
    72. var to_large;
    73. to_large = false;
    74. for (i = 0; i <= string_length(str); i += 1)
    75. {
    76. if (string_height(string_copy(str,0,i)) > height-(margin*2))
    77. {
    78. to_large = true;
    79. argument4 = string_copy(str,i,string_length(str));
    80. str = string_delete(str,i,string_length(str)-i+1);
    81. break;
    82. }
    83. }
    84. // 3. Text Zeichnen
    85. /// Nun wird der passend, "skalierte" (bearbeitete) Text "str"
    86. /// mit einer Geschwindigkeit von "spd", und einen Alpha Wert von "alpha",
    87. /// und einen Abstand von "margin" zu allen vier Rändern hin, und der Farbe
    88. /// "col", gezeichnet.
    89. /// Weitere Bemerkung:
    90. /// Es gibt momentan zwei Vorgefertigte Text-Aktionen. Du darfst natürlich
    91. /// diese erweitern, bearbeiten, und verändern - passend zu deinem Spiel ;)
    92. i = 0;
    93. draw_set_color(col);
    94. draw_set_alpha(alpha);
    95. while (i <= string_length(str))
    96. {
    97. // ANFANG - TEXT AKTIONEN - ANFANG
    98. if (string_char_at(str,i) == "§")
    99. {
    100. switch (string_copy(str,i,3))
    101. {
    102. case "§00":
    103. sleep(1500);
    104. str = string_replace(str,"§00","");
    105. break;
    106. case "§01":
    107. // Erweitere die Text Aktion doch =)
    108. str = string_replace(str,"§01","");
    109. break;
    110. }
    111. // Diesen Befehl nur dann erweitern, falls die Text Aktionen
    112. // von "§00" bis "§99" vergeben sind.
    113. // Wer nicht so ganz auf die Übersichtlichkeit achtet, kann
    114. // auch noch von "§aa" bis "§zz" und von "§AA" bis "§ZZ" und
    115. // einen Groß- und Kleinschreibungs Mix machen (und das ganze
    116. // nochmal mit den Zahlen von 0-9 ... eine unmengen an
    117. // Text Aktionen können also so auch mit nur zwei Feldern
    118. // Definiert werden - zum schaden der Übersichtlichkeit.
    119. }
    120. // ENDE - TEXT AKTIONEN - ENDE
    121. else
    122. {
    123. draw_text(xpos+margin,ypos+margin,string_copy(str,0,i));
    124. screen_refresh();
    125. sleep(300/spd);
    126. }
    127. i += 1;
    128. }
    129. // 4. Sonstiges
    130. /// Hier werden die alten Werte (Alpha / Color) zurückgesetzt, und
    131. /// außerdem kann (wie in diesem Beispiel) ein "Continue" (Fortsetzungs)
    132. /// Pfeil eingefügt werden, nachdem der ganze Text gezeichnet wurde.
    133. /// Zu schluss warten wir auf eine Reaktion des Spieler, der einen
    134. /// (bestimmten ?) Knopf drücken soll, um Fortzufahren mit den nächsten
    135. /// Text (falls to_large = true) / um die "Messagebox" zu beenden, nachdem
    136. /// lesen.
    137. draw_sprite(s_con_pfeil,0,xpos+(width/2),ypos+height-(margin/2));
    138. draw_set_color(o_col);
    139. draw_set_alpha(o_alpha);
    140. screen_refresh();
    141. keyboard_wait();
    142. screen_redraw();
    143. // 5. "Outro"
    144. /// Hier wird nun überprüft, ob es weiteren Text gibt, der einfach "to_large"
    145. /// für die Messagebox war. Dies wird also mittels "to_large" überprüft, und
    146. /// falls es weiteren Text gibt, wird mithilfe des nicht bearbeiteten Textes
    147. /// argument4 ein Abbild erschaffen, das nicht mehr den Inhalt von dem
    148. /// Text String "str" enthält.
    149. if (to_large == true)
    150. draw_messagebox(argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8,argument9,argument10);
    151. }
    Alles anzeigen


    Und ein Beispiel für ein Objekt, dass mit diesen Skript eine Messagebox erstellen soll / mit den man reden soll (Steuerung auf die Maus ausgelegt!):

    Create Event

    Spoiler anzeigen

    GML-Quellcode

    1. {
    2. talked = 0;
    3. }


    Draw Event
    Spoiler anzeigen

    GML-Quellcode

    1. draw_set_color(c_red);
    2. draw_circle(x,y,20,true);
    3. draw_text(10,10,string(distance_to_point(mouse_x,mouse_y)));
    4. if (talked == 0 && distance_to_point(mouse_x,mouse_y) < 20)
    5. {
    6. talked = 1;
    7. draw_messagebox(x,y,0,0,"Endlich Funktioniert der 'draw_messagebox' - Skript! Vielen dank nochmal an Defmaster, der mich auf den Fehler mit screen_redraw(); aufmerksam gemacht hat. Falls ihr diesen Skript in euren Spiel benutzt, waere ein Credit eintrag sehr nett, ist aber keine Pflicht :)#Mfg.,§00#Metalknight",c_black,c_white,c_gray,8,1,3);
    8. }
    9. // draw_messagebox(xpos,ypos,width,height,str,col,back_c,br_col,spd,alpha,margin);
    10. if (distance_to_point(mouse_x,mouse_y) > 20)
    11. talked = 0;
    Alles anzeigen


    Mfg.,
    Metalknight