Raumname in Integer-Werte zerlegen

  • GM 8

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

  • Raumname in Integer-Werte zerlegen

    Moin,
    Ich habe derzeit ein Projekt am laufen, bei welchem ich Räume über ein 2D Array adressieren möchte.
    Realisieren möchte ich das Ganze einfach über den Raumnamen, welcher folglich aus 2 Zahlen, welche allerdings auch zweistellig sein können, besteht.

    Als Beispiel ist der Raum, der den Namen 00 trägt, der Links obere Eckpunkt, während Beispielsweise 99 der Eckpunkt unten rechts sein könnte.

    Jetzt stelle ich mir die Frage, ob es möglich ist den Raumnamen nach dem auslesen (über room_get_name()) so zu zerteilen,
    dass ich ihn anschließend in 2 Werte vom Typ integer (sollte ja per einfachem Typecast funktionieren) zwischenspeichern kann.

    EDIT:// quasi dieses Example in rückwärts.
    Spoiler anzeigen
    http://www.gm-d.de/wbb/index.php/Thread/18637/

    Mit freundlichen Grüßen,
    Yivo

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

  • Sorm schrieb:

    Suchst du vielleicht nach real(); ?

    GML-Quellcode

    1. roomname = "00";
    2. roomname_str = real(roomname);


    Das wandelt deinen String in einen Integer.

    -Sorm


    Zunächst danke für die schnelle Antwort.
    Schätze ich bin oben zu weit ausgeschwiffen.

    Ich habe kein Problem mit dem Typecast.
    Mein Problem ist eher das einlesen vom Raumname, bzw. das untertrennen.

    Wenn der Raum 00 heißt, möchte ich das 2 Werte, nennen wir sie mal roomX und roomY mit 0 und 0 gefüllt werden.

    EDIT:// Kein Problem ^^
  • Yivo schrieb:

    Wenn der Raum 00 heißt, möchte ich das 2 Werte, nennen wir sie mal roomX und roomY mit 0 und 0 gefüllt werden.

    Gerade wenn es darum geht Zahlen zu zerteilen kann dir Modulo hilfreich sein.

    Modulo (bzw. mod oder % in GML ist der ganzzahlige Divisionsrest)
    Wenn du also 23 mod 10 rechnest bekommst du 3 heraus, somit hättest du die Einerstelle.

    Bei so etwas wie "00" geht das natürlich nicht, aber wenn du die Variable vorerst als String beibehältst, hilft dir vielleicht
    string_char_at(str, index) weiter.

    Aus der Dokumentation:
    You can use this function to return a specific character at a specific position within a string, with the index starting at 1 for the first character. If no character is found or the string is shorter than the value given to index, an empty string "" is returned.
  • RLP schrieb:

    Yivo schrieb:

    Wenn der Raum 00 heißt, möchte ich das 2 Werte, nennen wir sie mal roomX und roomY mit 0 und 0 gefüllt werden.

    Gerade wenn es darum geht Zahlen zu zerteilen kann dir Modulo hilfreich sein.

    Modulo (bzw. mod oder % in GML ist der ganzzahlige Divisionsrest)
    Wenn du also 23 mod 10 rechnest bekommst du 3 heraus, somit hättest du die Einerstelle.

    Bei so etwas wie "00" geht das natürlich nicht, aber wenn du die Variable vorerst als String beibehältst, hilft dir vielleicht
    string_char_at(str, index) weiter.

    Aus der Dokumentation:
    You can use this function to return a specific character at a specific position within a string, with the index starting at 1 for the first character. If no character is found or the string is shorter than the value given to index, an empty string "" is returned.


    Das kommt schon näher an mein Problem..
    Ich suche mich gerade wie bekloppt durch die String API von Game Maker..
    Gibt es nicht einfach einen Befehl, womit man innerhalb eines String an einer bestimmten Stelle, nicht aber nach etwas bestimmten, suchen kann? Das quasi der Buchstabe, die Zahl oder was auch immer von einer bestimmten Stelle im String zurückgegeben wird?

    EDIT:// Ich schätze mein Problem ist noch immer nicht transparent genug. Der Raumname gibt 2 Koordinaten an. Als Raumname nehme ich nun z.B. XX_YY, wobei XX und YY jeweils die Koordinaten des Raumes beinhalten. Im Roomcreation Code möchte ich nun mein Script aufrufen, welches den Raum per 2D Array mit Inhalt füllt. Also möchte ich die X und Y Koordinate aus dem Raumnamen auslesen und dem Script mitgeben.

    Mit freundlichen Grüßen,
    Yivo

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

  • Einfach bei _ trennen?

    GML-Quellcode

    1. var xx, yy, pos, str;
    2. str = room_get_name(room);
    3. pos = string_pos("_", str);
    4. xx = real(string_copy(str, 1, pos - 1));
    5. yy = real(string_delete(str, 1, pos));

    © 2008 by Teamgrill Productions
  • Mit modulo den zweiten Teil rauskriegen. Kannst ja davor unterteilen wenn Zahl größer als 10, dann mit mod 10 arbeiten, denn wie oben schon gesagt bei 0 geht das nicht.
    Und den ersten Teil könnte man doch mit runden rausfinden. Natürlich musst man dann die letzten 00 am Ende "wegdividieren".
    GML lernen geht leicht :)
    1. http://www.gm-d.de/help/ (deutsch)
    2. gm-d.de/wbb/index.php/Thread/2270/ (Einsteiger-Referenz)
    3. docs.yoyogames.com/ (Hilfe auf Englisch von GM:S)
  • Ich habe letzte Nacht ein kleines Example gemacht wie ich mir das vorstelle.
    Nachdem ich MasterXYs Code gesehen habe erscheint mir meine Variante aber viel zu umständlich.^^
    Außerdem müssen am Ende des Roomnamens zwei Underscores sein, damit es funktioniert. Anders habe ich es nicht lösen können.
    Naja ich poste es mal rein.

    Hier nur der Code:
    Spoiler anzeigen

    GML-Quellcode

    1. rmname = room_get_name(0)
    2. positionscount = 0
    3. gruppenanzahl = 0
    4. //room-namensformat muss so aussehen: xxx_yyy_zzz__ dabei ist die anzahl und größe der parameter (x,y,z,etc.) egal,
    5. //zum schluss zwei underscores
    6. //ermittlung der gruppenanzahl (wieviele zifferngruppen gibt es die mit _ unterteilt sind)
    7. for (i=1; i<string_length(rmname); i+=1)
    8. {
    9. pos[i] = string_char_at(rmname,i)
    10. if pos[i] == "_"
    11. {
    12. gruppenanzahl += 1
    13. }
    14. }
    15. //zuweisung der einzelnen ziffern zu gruppen
    16. for (k=1; k<gruppenanzahl; k+=0)
    17. {
    18. for (i=1; i<string_length(rmname); i+=1)
    19. {
    20. if pos[i] != "_"
    21. {
    22. positionscount += 1
    23. }
    24. else
    25. {
    26. gruppe[k] = ""
    27. for (j=(i-1)-(positionscount-1); j<i; j+=1)
    28. {
    29. gruppe[k] += pos[j]
    30. }
    31. positionscount = 0
    32. if k < gruppenanzahl
    33. k+=1
    34. }
    35. }
    36. }
    37. //umwandlung der zifferngruppen in reals
    38. for (i=1; i<=gruppenanzahl; i+=1)
    39. {
    40. gruppe[i] = real(gruppe[i])
    41. }
    42. //kreierung der instanzen (ausgehend von den roomdimensionen)
    43. for (i=0; i<=gruppe[1]; i+=32) //ermitteln der x-koordinaten, 32 ist hier die breite des sprites des testobjektes
    44. {
    45. for (j=0; j<=gruppe[2]; j+=32) //ermitteln der y-koordinaten, 32 ist hier die höhe des sprites des testobjektes
    46. {
    47. instance_create(i,j,obj_test)
    48. }
    49. }
    Alles anzeigen


    Und im Anhang ist das Beispiel.
    Dateien
  • MasterXY schrieb:

    Einfach bei _ trennen?

    GML-Quellcode

    1. var xx, yy, pos, str;
    2. str = room_get_name(room);
    3. pos = string_pos("_", str);
    4. xx = real(string_copy(str, 1, pos - 1));
    5. yy = real(string_delete(str, 1, pos));



    "Einfach" trennen :)
    Wenn es mir so einfach fallen würde, hätte ich das Problem nicht, aber deine Methode ist perfekt für meinen Zweck, vielen Dank für die Antwort :)


    RLP schrieb:



    Ich habe letzte Nacht ein kleines Example gemacht wie ich mir das vorstelle.
    Nachdem ich MasterXYs Code gesehen habe erscheint mir meine Variante aber viel zu umständlich.^^
    Außerdem müssen am Ende des Roomnamens zwei Underscores sein, damit es funktioniert. Anders habe ich es nicht lösen können.
    Naja ich poste es mal rein.

    Hier nur der Code:
    Spoiler anzeigen

    GML-Quellcode

    1. rmname = room_get_name(0)
    2. positionscount = 0
    3. gruppenanzahl = 0
    4. //room-namensformat muss so aussehen: xxx_yyy_zzz__ dabei ist die anzahl und größe der parameter (x,y,z,etc.) egal,
    5. //zum schluss zwei underscores
    6. //ermittlung der gruppenanzahl (wieviele zifferngruppen gibt es die mit _ unterteilt sind)
    7. for (i=1; i<string_length(rmname); i+=1)
    8. {
    9. pos[i] = string_char_at(rmname,i)
    10. if pos[i] == "_"
    11. {
    12. gruppenanzahl += 1
    13. }
    14. }
    15. //zuweisung der einzelnen ziffern zu gruppen
    16. for (k=1; k<gruppenanzahl; k+=0)
    17. {
    18. for (i=1; i<string_length(rmname); i+=1)
    19. {
    20. if pos[i] != "_"
    21. {
    22. positionscount += 1
    23. }
    24. else
    25. {
    26. gruppe[k] = ""
    27. for (j=(i-1)-(positionscount-1); j<i; j+=1)
    28. {
    29. gruppe[k] += pos[j]
    30. }
    31. positionscount = 0
    32. if k < gruppenanzahl
    33. k+=1
    34. }
    35. }
    36. }
    37. //umwandlung der zifferngruppen in reals
    38. for (i=1; i<=gruppenanzahl; i+=1)
    39. {
    40. gruppe[i] = real(gruppe[i])
    41. }
    42. //kreierung der instanzen (ausgehend von den roomdimensionen)
    43. for (i=0; i<=gruppe[1]; i+=32) //ermitteln der x-koordinaten, 32 ist hier die breite des sprites des testobjektes
    44. {
    45. for (j=0; j<=gruppe[2]; j+=32) //ermitteln der y-koordinaten, 32 ist hier die höhe des sprites des testobjektes
    46. {
    47. instance_create(i,j,obj_test)
    48. }
    49. }
    Alles anzeigen


    Und im Anhang ist das Beispiel.


    Vielen Dank für die Mühe. Sowas ähnliches wie du hatte ich auch angefangen zu schreiben, bis ich auf den Gedanken kam, dass es bestimmt einfacher gehen würde ^^
    Leute die sich wegen kleinen Problemen so bemühen, sind der Grund warum ich dieses Forum ziemlich gerne mag, also nochmals danke dafür. :)

    EDIT:// MasterXY, das macht einen das Leben natürlich gleich viel leichter ^^ Deine Methode funktioniert perfekt, vielen Dank.

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