Bekannte Bugs - Eventuell Lösungen

    • GM 8

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

    • Bekannte Bugs - Eventuell Lösungen

      Hallo Comunity,

      mit diesem Thread befolge ich mal MewXs Idee und erstelle einen Thread wo jeder der will bekannte Bugs in den GameMaker Versionen besprechen kann.

      Definition von einem solchen "Bug": 4-8 Beine, Schale, eklig, klein.. ehh..
      Fehler die nicht am eigenen Code zu liegen (scheinen). Also Probleme die von Fehlern im Runner des Game Makers selbst herrühren.

      Es sollte nach Möglichkeit auch darauf hinauslaufen dass Workarounds oder externe Lösungen angeboten werden, sofern dies möglich ist.

      Anmerkung: Keine Bugs aus dem GM-Studio bitte, denn dieses wird im moment dauernd überarbeitet und mit dessen Bugs könnte man wohl einen Roman füllen.


      Hiermit fange ich mal an:

      ------------------------------------------------------------

      Version: GM 8.1
      Art: String-vergleich oder ord() Funktion fehlerhaft
      Beschreibung:
      Es geht darum dass das Umwandeln von Zeichen in Zahlen und die Umkehrung davon nicht ganz korekt abzulaufen scheint. Hier ein Stück komentierten Code dessen ursprünglicher Zweck es war zwecks Komprimierung Farben in einen dreistelligen String umzuwandeln:
      Spoiler anzeigen

      GML-Quellcode

      1. k1 = ansi_char(200); // Zahlen zum Umwandeln (Können z.B. Farbwerte (RGB) sein. )
      2. k2 = ansi_char(255); // SIe werden in einzel-Strings (Zeichen) gespeichert.
      3. k3 = ansi_char(150);
      4. kk = k1+k2+k3; // die drei Einzel-Zeichen werden zu einem String adiert. Der sich ergebende Gesamt-String kann z.B. übertragen werden)
      5. kk1 = string_char_at(kk,1); // Nun werden die Einzelzeichen wieder ausgelesen
      6. kk2 = string_char_at(kk,2);
      7. kk3 = string_char_at(kk,3);
      8. show_message("Zeichen sind equivalent: "+string(k1 == kk1)); // Es wird jeweils verglichen ob das ursprüngliche Zeichen VOR dem
      9. show_message("Zeichen sind equivalent: "+string(k2 == kk2)); // zusammenfassen (k1/k2/k3) zu einem String, mit den neuen Zeichen
      10. show_message("Zeichen sind equivalent: "+string(k3 == kk3)); // (kk1/kk2/kk3) übereinstimmt.
      11. // Diese messages werden immer "Zeichen sind equivalent: 1 " ausgeben.
      12. show_message(string(ord(k1))+" --> "+string(ord(kk1)))
      13. show_message(string(ord(k2))+" --> "+string(ord(kk2)))
      14. show_message(string(ord(k3))+" --> "+string(ord(kk3)))
      15. // Trotzdem zeigen diese Messages dass die jeweiligen Ergebnisse aus der "ord()" Funktion, NICHT übereinstimmen!
      16. // Merkwürdiger Weise ergibt der zweite Teil immer 239.
      Alles anzeigen

      Lösung: Anstelle von string_char_at() und ord() muss man string_byte_at verwenden! Dies funktioniert dann problemlos.
      Mag sein dass dies so gedacht ist. Trotzdem ist es verwirrend dass beim direkten Vergleich (in den ersten Messages) rauskommt dass die Zeichen gleich wären obwohl sie beim Umwandeln in Zahlen trotzdem was anderes ergeben.


      ------------------------------------------------------------

      Version: GM 8.1
      Art: display_set_size - Funktion führt zum Absturz
      Beschreibung:
      Selbst einfach

      GML-Quellcode

      1. display_set_size(display_get_width(),display_get_height());
      scheint nicht zu funktionieren und wirft eine Adress-violation Meldung (manchmal kann es auch zum einfachen Blockieren führen - scheint auf das Event anzukommen).
      Lösung: Keine. Es könnte aber über eine DLL gelöst werden (die diese Funktion einfach ersetzt). Mir ist aber leider noch keine bekannt. (In der Gmtoolbox findet sich zwar eine die es ermöglichen könnte, aber der Link führt zu einem gelöschten Thread.)


      EDIT: 1.3.2013 ------------------------------------------------------------

      Version: GM 8.1
      Art: string_byte_at - Funktion führt bei leerem string zu Fehlermeldung oder Event-Abbruch
      Beschreibung:
      Übergibt man der Funktion string_byte_at(str,pos) ausversehen einen leeren String, dann bricht das gesamte Event einfach ab(!) _oder_ es erscheint ein adress-violation error (bei mir nur wenn der Code im create-event ausgeführt wurde).
      Lösung: Einfach verhindern dass ein leerer String übergeben wird...

      ------------------------------------------------------------



      So, das wars erstmal von mir. Hoffe jemand anderes kann weiter machen.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von DragonGamer () aus folgendem Grund: Bug hinzugefügt

    • Nichts schlimmes, ist mir aber aufgefallen:

      Version: GM 8.1
      Art: object_name - unbekannte Variable
      Beschreibung: Es existiert im GM eine Variable object_name, die nicht in der Hilfe-Datei und
      in den eingebauten Variablen aufgelistet ist und Fehlermeldungen hervorruft.
      Laut dem Variablenamen glaube ich mal, sie sollte den Namen des Objects zurückgeben
      Vielleicht eine W.I.P Variable ?

      GML-Quellcode

      1. show_message(object_name); // Fehler

      Lösung:

      GML-Quellcode

      1. show_message(object_get_name(object_index));


      EDIT: Und tolle Idee, dieser Thread ^^

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

    • Zum String-Problem:
      Strings werden vermutlich, um Speicherplatz zu sparen, in verschiedenen Formaten abgespeichert, wobei string_char_at immer die kleinere Variante zurückgibt. Das ist ärgerlich, aber reduziert in anderen Umgebungen den benutzten Speicher. Das ist wohl so gedacht, auch wenn es unschön ist. Ob sich das tatsächlich lohnt ist eine andere Sache. In anderen Programmiersprachen sind Strings aber viel schlimmer, versprochen.
      Aber ja, könnte man mal nachfragen.

      Zum Display-Problem:
      Ich gehe mal davon aus, dass aktuelle Grafikkarten-Treiber (oder Windows) das so nicht mehr mit sich machen lassen. In Studio gibt es die Funktion auch nicht mehr. Vielleicht haben sie die Funktion auch zerschossen, weil sie Studio-Code im GM8.1 eingecheckt haben. Halte ich sogar für wahrscheinlicher.

      object_name:
      Vermutlich veraltet und keiner hat es entfernt. Könnte vermutlich auch raus.
    • MewX schrieb:

      Zum Display-Problem:
      Ich gehe mal davon aus, dass aktuelle Grafikkarten-Treiber (oder Windows) das so nicht mehr mit sich machen lassen. In Studio gibt es die Funktion auch nicht mehr. Vielleicht haben sie die Funktion auch zerschossen, weil sie Studio-Code im GM8.1 eingecheckt haben. Halte ich sogar für wahrscheinlicher.
      Das Problem ist scheinbar (wie immer) eher der GM.
      Hab grade eine DLL zusammengeschustert (naja, eher zusammenkopiert) die die Auflösung verändern kann.
      Immerhin bleibt damit Windows verwendbar aber die Fehlermeldung erscheint trotzdem und im GM bricht irgendwas zusammen. Code und events werden zwar weiter ausgeführt und z.B. sowas wie show_message scheint zu funktionieren. Der rest des Fensters ist und bleibt aber schwarz --> kein rendern des Bildes mehr.
      Übrigens, wenn man die Auflösung durch windows verändern lässt geschieht genau das selbe.

      Offensichtlich haben die irgendwas verändert was das Ändern der Auflösung nicht mehr erlaubt...

      EDIT: Umgehen würde ich das Problem durch einen Neustart des Spiels... Was natürlich nicht allzuhandlich ist.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)

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

    • Version: GM 8.1.141
      Art: Anti-Aliasing funktioniert nicht/führt zum Absturz

      Beschreibung:
      Das starten der Anti-Aliasing funktion mit

      GML-Quellcode

      1. display_reset(aa);//aa steht für die AA stufe

      Hat entweder keinen Effekt (AA wird nicht initialisiert) oder die Anwendung schmiert schlicht und einfach ab.

      Lösung:
      Nach dem Aufruf von

      GML-Quellcode

      1. display_reset(aa);//aa steht für die AA stufe

      muss man sofort eine temporäre Surface erstellen, diese mit

      GML-Quellcode

      1. surface_set_target(surface);

      als Zeichenziel festlegen und wieder mit

      GML-Quellcode

      1. surface_reset_target();
      die aktion abbrechen.
      AA wird dannach wie erwartet funktionieren.

      Das würde dann wie folgt ausschauen:

      GML-Quellcode

      1. display_reset(4); //4-faches AA
      2. //vermeidet den Absturz/löst den Bug
      3. var surf;
      4. surf = surface_create(1,1);//temporäre surface
      5. surface_set_target(surf);//muss aufgerufen werden
      6. surface_reset_target();
      7. surface_free(surf);//lösche die surface


      Entdeckt wurde der fix von einem Member der Englischen GMC.
      Link: Gm 8.1.141 AA fix

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