Problem mit Dialog von NPCs in GM:S

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

  • Problem mit Dialog von NPCs in GM:S

    Hallo Leute,
    ich bin neu hier im Forum und hab auch direkt ein Problem bei dem ich dringend Hilfe bräuchte, da ich schon regelrecht verzweifle...

    Es geht um ein Programmierproblem bei einem Dialogsystem. Um es möglichst kurz zu machen:
    Ich habe einen NPC und ein Schild erstellt. Diese befinden sich im selben Raum. Der NPC soll anfangen seinen Text zu sprechen, wenn der Spieler eine bestimmte Taste drückt, beim Schild das gleiche. Beide Objekte besitzen den gleichen Code.
    Das Problem besteht darin, dass der Text zwar angezeigt wird, aber dieser vom Text des anderen Objektes überlappt wird. Im Klartext: Beide Objekte führen ihren Code zur selben Zeit aus und ich kriege einfach nicht raus warum...ich befasse mich seit ner Woche mit nichts anderem, aber ich kriegs nicht raus. Ich denke, dass es etwas mit dem Step-Event zu tun hat, aber ich wüsste nicht was. Vielleicht hab ich da nen Logikfehler, da ich mich auch noch nicht soo lange mit dem GameMaker befasse.

    Der Code befindet sich im Spoiler:

    // Create Event
    Spoiler anzeigen

    Quellcode

    1. textbox_en = false;
    2. message[0] = "Hello there!";
    3. message[1] = "I'm a NPC!";
    4. message[2] = "I'm here go going on your nerves every time you talk to me.";
    5. message[3] = "Have fun!";
    6. message[4] = "And don't forget to change your underwear!";
    7. message_current = 0; //0 is the first number in our array, and the message we are currently at
    8. message_end = 5; //6 is the last number in our array
    9. message_draw = ""; //this is what we 'write' out. It's blank right now
    10. increase = 1; //the speed at which new characters are added
    11. characters = 0; //how many characters have already been drawn
    12. hold = 0; //if we hold 'Z', the text will render faster
    13. message_length = string_length(message[message_current]); //get the number of characters in the first message
    Alles anzeigen



    // Step Event

    Spoiler anzeigen

    Quellcode

    1. if(global.input == 0 && global.status_en == false)
    2. {
    3. if(keyboard_check(vk_space) && distance_to_object(obj_player) < 4 && textbox_en == false)
    4. {
    5. if (!instance_exists(obj_textbox))
    6. {
    7. instance_create(view_xview[0]+238, view_yview[0], obj_textbox);
    8. }
    9. if (instance_exists(obj_textbox))
    10. {
    11. global.move = false;
    12. textbox_en = true;
    13. obj_textbox.visible = true;
    14. }
    15. }
    16. if (textbox_en == true)
    17. {
    18. if (characters < message_length) //if current character count is less than the amount in current message*
    19. {
    20. hold = keyboard_check(ord('X')); //hold is true or false if 'X' is hold or not
    21. characters += increase * (1 + hold); //increase speed based on hold
    22. message_draw = string_copy(message[message_current], 0, characters); //copy string to current character
    23. }
    24. else { //if current character is more than the amount in the current message
    25. if (keyboard_check_pressed(ord('X'))) //if we press X...
    26. {
    27. if (message_current < message_end) //if there are more messages left to show
    28. {
    29. message_current += 1; //increase the message by 1
    30. message_length = string_length(message[message_current]); //get the new character length for message
    31. characters = 0; //set the characters back to 0
    32. message_draw = ""; //clear the drawn text
    33. }
    34. else
    35. {
    36. if (keyboard_check_pressed(ord('X')))
    37. {
    38. if (message_current >= message_end) //if the messages are done
    39. {
    40. characters = 0;
    41. message_draw = "";
    42. message_length = string_length(message[message_current]);
    43. obj_textbox.image_index = 0;
    44. obj_textbox.visible = false;
    45. textbox_en = false;
    46. with (obj_textbox) instance_destroy(); //destroy the object
    47. global.move = true;
    48. }
    49. }
    50. }
    51. }
    52. }
    53. }
    54. }
    Alles anzeigen



    // Draw Event
    Spoiler anzeigen

    Quellcode

    1. draw_self();
    2. if(textbox_en == true && instance_exists(obj_textbox))
    3. {
    4. draw_sprite(obj_textbox.sprite_index, 0, view_wview[0]/2 - 10, view_yview[0]);
    5. draw_set_colour(c_white);
    6. draw_set_halign(fa_left);
    7. draw_set_valign(fa_top);
    8. draw_text_ext(view_xview[0]+80, view_yview[0]+15, message_draw, 5, 320); //draw the text at the coordinates
    9. }



    Vielen Dank im Voraus :)

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

  • Spontan könnte ich jetzt auch nichts finden. Das einzige was in deinem code verhindert, dass der Code für alle Instanzen ausgeführt werden ist das Prüfen von distance_to_object(). Daher würde ich da ansetzen den Fehler zu suchen.
    Btw. Du solltest deinen Code etwas besser formatieren ;) ist schwer zu sehen wie die Klammern gepaart sind.
  • Der Code soll ja nicht für alle Instanzen bzw. Objekte ausgeführt werden, jedenfalls nicht zur selben Zeit, deswegen ist die Abfrage nach der Distanz ja da XD In RPGs ist das ja so, dass jeder NPC seinen eigenen Text hat und das versuche ich da zu programmieren. Das einzige Problem ist eben, dass die den Code zeitgleich ausführen und dadurch der Text überlappt, was aber nur ein Nebeneffekt ist. Jeder einzelne NPC oder Schild oder sonstwas soll seinen "Text sprechen" wenn der Spieler nah genug dran ist und eine Taste drückt. Sorry, falls ich mich missverständlich ausgedrückt habe ^^

    Danke für den Hinweis. Ich dachte eigentlich, dass der Code lesbar genug wäre XD Ich habe das Step-Event noch etwas eingerückt. Das ist ja das komplexeste Stück daran. Ich hoffe, dass es nun lesbarer ist ^^
    NPC und Schild stehe übrigens zu Testzwecken jeweils am anderen Ende des Raumes, dessen "Maße" 640 x 480 sind. An der Distanz kann es schon mal nciht liegen...
  • Ich hab deine frage schon verstanden ;) ich hab ja nur gesagt, dass dein distanzcheck das einzige an deinem code ist das dies verhindert. Denn jedes deiner npc/text objekte prüft auf die Eingabe des Spielers. Ich persönlich steuer sowas lieber zentral und spreche dann die entsprechende instanz des Objekts an, anstatt alle :)

    Wie gesagt, im code konnte ich spontan nichts finden. Ich würde aber einfach mal in den einzelnen objekten die Distanz zum Spieler als debug message ausgeben.

    wenn du die abfrage nach der distanz entfernst, dann wird dein code definitiv für alle Instanzen ausgeführt. der fehler kann ME nur dort liegen.