Strings aufgrund einer gewissen Breite splitten.

  • GM 8

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

  • Strings aufgrund einer gewissen Breite splitten.

    Hejho Community!

    Da es schon spät ist möchte ich mein Problem so kurz und knapp erklären. Ich habe eine Chat Box in dem Nachrichten ausgegeben werden. Eig. funktioniert alles so wie es ca. funktionieren sollte, leider klappt es aber nicht 100%ig. Ich habe einen String (Bsp: "Dieses Forum hilft mir immer. Die Hilfe finde ich wirklich toll."). Und eine Breite, sagen wir mal 320px. Und jetzt möchte ich den String so oft in eine Line teilen bis es nicht mehr geht. sprich der String soll umknacken. Eig. sollte es kein Problem sein, ABER ich möchte nicht mitten in einem Wort splittem, also falls er im Wort "immer" splitten will, soll das GANZE Wort in die nächste Zeile. Hab das auch schon, aber mein Code ist recht seltsam und klappt auch nicht ganz, da er ab und zu ein Wort splittet das nicht gesplittet gehört. Falls jemand eine Idee hätte wie ich es besser machen könnte, bzw. einen Fehler in meinen Code gefunden hat, wäre ich sehr erfreut über Auskunft.

    huch 8o. Fast meinen Code vergessen

    Spoiler anzeigen

    GML-Quellcode

    1. buffer = "";
    2. line_counter = 0;
    3. for(line_counter = 0;line_counter < line_quantity;line_counter+=1) {
    4. line = "";
    5. while(string_width(line) < length_max) {
    6. if(string_length(buffer) == string_length(text)) {
    7. break;
    8. } else {
    9. line += string_char_at(text,string_length(buffer)+1);
    10. buffer+=" ";
    11. }
    12. }
    13. char = string_char_at(text,string_length(buffer)+1);
    14. char = ord(char);
    15. if((char >= ord("a") && char <= ord("z")) || (char >= ord("A") && char <= ord("Z")) || (char >= ord("0") && char <= ord("9"))) {
    16. length = 0;
    17. do {
    18. length += 1;
    19. c = string_char_at(text,string_length(buffer)-length);
    20. } until (c == " ");
    21. buffer = string_delete(buffer,string_length(buffer)-length,length);
    22. line = string_delete(line,string_length(line)-length,length+1);
    23. }
    24. show_message(line);
    25. }
    Alles anzeigen

    Kurze Erklärung noch dazu:
    line_quantity: Anzahl wie oft gesplittet werden soll
    length_max: Maximale Breite einer Line
    text: Der zu splittende Text

    restlichen Variablen sollten hoffentlich klar sein. Falls nicht, versuche ich sie zu erklären.
    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • xxskxx schrieb:

    Ich bin mir zwar nicht ganz sicher , aber ich glaube was du suchst ist doch

    GML-Quellcode

    1. draw_text_ext( x, y, string, sep, w );

    Mit w gibst du an wie "breit" der String in Pixel maximal sein darf.

    MfG xxskxx

    Das Problem an dieser Funktion ist, das bei einem langen Wort z.B.
    nicht die Zeile unterbrochen wird(?)
    :saint:
  • xxskxx schrieb:


    Ich bin mir zwar nicht ganz sicher , aber ich glaube was du suchst ist doch








    GML




    1



    draw_text_ext( x, y, string, sep, w );





    Mit w gibst du an wie "breit" der String in Pixel maximal sein darf.

    MfG xxskxx


    Omg. Ich glaub ich träum ^^ Ich versuch da ewig rumzuspielen und das geht so einfach :DD Schön welche Funktionen es so gibt xD Dankeschönn :thumbsup:
    @Tice: Also er trennt ab dem Wort, dass nicht mehr reinpasst.
    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Das hab ich nicht bedacht, dass würde bei meinem Script aber auch ein Problem hervorrufen. Mal schaun ob ich das verbessern kann. Melde mich falls ich ein Problem habe, bzw. wenn ich es gelöst habe.

    MfG Rodrog
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Ich habe dir schnell ein Skript geschrieben, welches dieses Problem lösen sollte. Die Anwendung sollte selbsterklärend sein:

    Spoiler anzeigen

    GML-Quellcode

    1. // string_split_ext ([in, string] string to split,
    2. // [in, int] maximum width of a line,
    3. // [out, ds_list] result);
    4. var string_to_split, line_width, output_list, working_position, working_line;
    5. string_to_split = argument0;
    6. line_width = argument1;
    7. output_list = argument2;
    8. working_position = 1;
    9. while (string_width(string_delete(string_to_split, 1, working_position)) > line_width) {
    10. working_line = "";
    11. while (string_width(working_line + string_char_at(string_to_split, working_position)) < line_width) {
    12. working_line += string_char_at(string_to_split, working_position);
    13. working_position += 1;
    14. }
    15. if (string_pos(" ", working_line) > 1) {
    16. while (string_char_at(string_to_split, working_position) != " ") {
    17. working_line = string_copy(working_line, 1, string_length(working_line) - 1);
    18. working_position -= 1;
    19. }
    20. }
    21. ds_list_add(output_list, working_line);
    22. }
    23. ds_list_add(output_list, string_delete(string_to_split, 1, working_position));
    Alles anzeigen