Variable in einem Queue-Befehl ändern?

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

  • Variable in einem Queue-Befehl ändern?

    Hallo miteinander,

    Mein Problem ist folgendes:
    Ich habe mir ein kleines Textsystem mit einer queue aufgebaut.

    Im Create Event werden sämtliche Mitteilungen als Strings mithilfe von ds_queue_enqueue eingelesen und der eigentlichen Queue angefügt.
    Bsp:
    message_queue = ds_queue_create();
    ds_queue_enqueue(message_queue, "I need more beer!");
    message_current = ds_queue_dequeue(message_queue);



    In einem Draw_GUI Event wird der String dann mithilfe eines Draw_text Events angezeigt.
    Bsp:
    if is_string(message_current) {
    while(i <= string_length(message_current) and i <= cutoff)
    { <-------------------------i und cutoff sind bereits vordefinierte variablen die getrost ignoriert werden können.
    draw_text(xx, yy, string_char_at(message_current, i));
    }

    } else {
    message_current = ds_queue_dequeue(message_queue);
    }


    Das funktioniert auch alles prima. Nur wenn ich jetzt anstatt einen String eine Variable mit neuem Wert in einen enqueue Befehl im Create Event einsetze, wie zB hier:
    ds_queue_enqueue(message_queue, meine_variable = 1); <-------------------------die Variable ist standardmäßig auf 0.

    ...wird diese schlichtweg ignoriert.
    Eigentlich sollte an dieser Stelle bei dem ds_dequeue Befehl die Variable dann auf 1 gesetzt werden, was aber nicht passiert.

    Ich habe jetzt fast 2 Tage rumgetüftelt und nach einer Lösung gesucht, aber keine finden können.
    Habt ihr vielleicht eine Idee? ?(
  • Hi willkommen im Forum :)
    Sieht der Befehl genauso aus?

    GML-Quellcode

    1. ​ds_queue_enqueue(message_queue, meine_variable = 1);
    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 :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hi, danke für die Antworten.

    An BladeRunner:
    Nein, der Sinn der Sache ist ja, dass die Variable erst an dieser Stelle der Queue entsprechend zugewiesen wird.

    An Husi:
    Eig nicht. Er sieht so aus:

    GML-Quellcode

    1. scr_q_portrait(actor1 = 1);


    Das Skript sieht dann so aus:

    GML-Quellcode

    1. ds_queue_enqueue(message_queue, argument0);

    Aber im Prinzip ist das Ergebnis ja das gleiche.
    Ich habe die Zeile auch schon mit "ds_queue_enqueue(message_queue, meine_variable = 1); " ausgetauscht, hat aber nicht viel geholfen.
  • Ist eig auch ganz logisch.
    Wenn actor1 den Wert 1 besitzt, wird der Wert 1 in der queue abgespeichert. Wenn es ein anderer Wert ist, dann 0.

    In GameMaker ist es so, dass der Vergleichungsoperator == auch möglich mit nur einem = ist.

    Eine Queue ist ja eine "Warteschlange", bei der du nur einen Wert hinten anstellst. Einen bestimmten Wert kannst du so aber nicht ändern.
    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 :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Ansonsten kannst du ja auch einfach das Skript so schreiben:

    GML-Quellcode

    1. ​ds_queue_enqueue(message_queue, argument0);
    2. return argument0;

    dann kannst gibt es den angegebenen Wert wieder zurück:

    GML-Quellcode

    1. ​variable = deinSkript(1);
    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 :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Die Sache ist die, wenn ich die Variable mit dem neuen Wert in die Liste setze, ändert GM mir die Variable direkt. Der Befehl "ds_queue_enqueue(message_queue, meine_variable);" gäbe dann einfach nur die Variable aus.

    Okay, ich habe die Sache nun anders gelöst. Ist etwas komplex aber läuft zumindest. Also ich habe einen Switch gebastelt, der mit einem Sonderzeichen aktiviert wird. Dazu noch die jeweilige Zahl. Je nach Zahl wird nun die Variable geändert. also:

    GML-Quellcode

    1. scr_q_portrait(\1);


    Und jetzt weiß mein Skript jedes mal wann es sich wie zu ändern hat.
    Aber trotzdem heißen Dank an euch beide. ;)
  • Ich hab immer noch das dumpfe Gefühl dass wir hier meilenweit aneinander vorbeireden. Kannst Du, damit wir anderen es auch verstehen, konkreter werden weshalb diese Variable da eingespeichert / ausgegeben wird, wann sie ihren Wert verändern soll und warum eine vorherige Zuweisung nicht möglich ist.

    Es ist schön dass Du eine Lösung hast, nur könnte es anderen helfen sie ebenso zu verstehen .... UND ich habe das Gefühl dass Du dich zu einem Kunstgriff genötigt siehst der entweder so nicht nötig ist oder gar auf einem missverstandenen Paradigma fusst.
  • Ja mein komplettes Projekt ist ein Kunstgriff. :D
    Aber anders gehts halt nicht, wenn man sich mit bescheidenem Programmierverständnis zu seinem Ziel tüfteln muss.

    Kannst Du, damit wir anderen es auch verstehen, konkreter werden weshalb diese Variable da eingespeichert / ausgegeben wird, wann sie ihren Wert verändern soll und warum eine vorherige Zuweisung nicht möglich ist.

    Ich versuchs mal:
    Es geht um die Charakterportraits. Die verschiedenen Sprites sind in Arrays gespeichert. Je nach dem Wert der zu ändernden Variable wird ein anderes Sprite ausgegeben. Je nachdem welcher Charakter spricht, muss der Wert geändert werden. Dieselbe Variable in der Queue Liste zuweisen geht also nicht.

    Ich habe gemerkt, dass man mit dem enqueue Befehl nur fest definierte Variablen ausgeben könnte, wie zB: Charakter1; (welches immer = 1 ist) Charakter2; (welches immer = 2 ist) usw...
    Da mein (Text) Skript aber eh auf Strings geeicht ist, war es sinnvoller eine Funktion einzubauen die Sonderzeichen erkennt und je nach dem Wert der hinter diesen steht per switch den entsprechenden Fall auszuführen.
    Bsp: (/ ist das Sonderzeichen) /1 entspräche per Switch dann Charakter1.
    Ich hätte es ehrlichgesagt auch mit der Methode da oben lösen können, aber für meinen Fall ist es so vllt. effektiver.

    Also für Leute die ebenfalls über Queues die Werte von Variablen ändern wollen, nehmt lieber Variablen mit festen Werten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Bob_der_Baumeister ()