Explode-Skript

    • Skript

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

    • Explode-Skript

      Eines Tages wollte ich einen Levelcode machen, und da muss man ja oft die Strings an Zeichen trennen, um an die einzelnen Variablen zu kommen. Also ging ich auf Scripts/Import Scripts, nur um zu sehen, dass ich mein jahrelang genutztes Explode-Skript von Bottleneck verloren habe!
      Also was jetzt? Google beförderte ein paar Scripts an den Tag, die entweder nicht mit meinem Zeug funzten oder ich nicht wusste, wie man sie benutzt/ein wenig umbaut. Also habe ich kurzerhand mein eigenes erstellt.

      SCRIPT
      Spoiler anzeigen

      GML-Quellcode

      1. /*
      2. Superyoshi's Explode-Skript
      3. Benutze es so:
      4. explode_script(arrayname,string,teiler,löschen,limit)
      5. arrayname: Name des Arrays, in dem die Teile gespeichert werden (arrayname[0] = erster Teil)
      6. globalarray: 0 (false) wenn das Array lokal sein soll, 1 (true) für ein globales Array
      7. string: der String, der geteilt werden soll
      8. teiler: String, an dem geteilt werden soll
      9. löschen: 1 (true) oder 0 (false), ob der Teiler gelöscht werden soll. Wenn er nicht gelöscht wird, ist der Teiler im Teil davor mit drin
      10. limit: Wie viele Teile geteilt werden, der Rest bekommt einen eigenen Index. 0 um alles zu teilen
      11. Return:
      12. 0 wenn keine Teilung stattfand, ansonsten wie viele Teile es gibt
      13. */
      14. var arrayname,globarr,meinstring,teiler,loeschen,limit,meinstring2,vorkommen,sooft;
      15. //Argumente zu Variablen
      16. arrayname = argument0
      17. globarr = argument1
      18. meinstring = argument2
      19. teiler = argument3
      20. loeschen = argument4
      21. limit = argument5
      22. //wie oft kommt der Teiler im String vor
      23. vorkommen = string_count(teiler,meinstring)
      24. if (limit == 0 || vorkommen < limit) { //wenn Limit aus ist oder der Teiler weniger oft vorkommt als das Limit
      25. sooft = vorkommen //vorkommen-mal "explodieren"
      26. } else {
      27. sooft = limit //limit-mal "explodieren"
      28. }
      29. if (vorkommen == 0) { //wenn es nie vorkommt, gleich so lassen
      30. if (globarr == 1) {
      31. variable_global_array_set(arrayname,0,meinstring)
      32. } else {
      33. variable_local_array_set(arrayname,0,meinstring)
      34. }
      35. return 0
      36. exit
      37. }
      38. for (i=0; i<sooft; i+=1) {
      39. meinstring2 = meinstring //Kopie anlegen
      40. position = string_pos(teiler,meinstring) //wo ist der Teiler
      41. if (loeschen == 1) { //wird der Teilere gelöscht?
      42. meinstring = string_delete(meinstring,position,9999999) //Teiler und alles dahinter raus
      43. } else {
      44. meinstring = string_delete(meinstring,position+string_length(teiler),9999999) //alles hinter dem Teiler raus
      45. }
      46. if (globarr == 1) {
      47. variable_global_array_set(arrayname,i,meinstring)
      48. } else {
      49. variable_local_array_set(arrayname,i,meinstring)
      50. }
      51. meinstring = string_copy(meinstring2,position+string_length(teiler),9999999) //meinstring beinhaltet nun den alten String ohne das Rausgeschnittene und Teiler
      52. letzteid = i //der wievielte Durchlauf
      53. }
      54. if (meinstring == "" || meinstring == " ") {
      55. return sooft //wenn alles weg ist, sind wir fertig
      56. } else { //sonst muss noch der Rest it ins Array
      57. if (globarr == 1) {
      58. variable_global_array_set(arrayname,letzteid+1,meinstring)
      59. } else {
      60. variable_local_array_set(arrayname,letzteid+1,meinstring)
      61. }
      62. return sooft+1
      63. }
      Alles anzeigen


      BEISPIEL-CODE
      object0:

      GML-Quellcode

      1. string1 = "rofl,lol,xD,wut,lmao,omfg"
      2. string2 = "A-B-C-D-E-F-G"
      3. string3 = "omnomnomnomnom"
      4. string4 = "Test:;Trenner:;mit:;mehr:;als:;einem:;Zeichen"
      5. return1 = explode_script("array1",0,string1,",",1,0)
      6. return2 = explode_script("array2",0,string2,"-",1,3)
      7. return3 = explode_script("array3",1,string3,"m",0,0)
      8. return4 = explode_script("array4",0,string4,":;",1,0)


      Ergibt im Debug-Mode:



      Natürlich bin ich immer offen für Vorschläge, Kommentare und Kritik!
      Getestet auf GM7 Pro.
      <Irrenhaus3>wenn [zensiert] erstmal das sabbeln anfängt, wird sogar ne Sinuskurve linear, um schneller abzuhauen
      <Irrenhaus3>da geht alles in Deckung

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

    • Ich habs jetzt leider noch nicht testen können, aber sieht ganz gut aus.
      Nen String Tokenizer ist sowieso eins der Features die ich im GM schon immer vermisst habe. So ne Funktion hätte ich mir auch im GM8 gewünscht, aber man kanns ja, wie du, auch einfach selbst implementieren :)

      btw. Kanns sein, dass du nen PHP Programmierer bist? :P
      Warum die PHP Leute nen Tokenizer explode nennen war mir schon immer nen Rätsel, da explodiert doch nix oder check ich den Witz dahinter nur nich?
    • Ja, in PHP heißt die Funktion auch explode(). Keine Ahnung warums so heißt, aber ich vermute, die "sprengen" den Text, die einzelnen Strings sind Stahlbalken und die Trennzeichen poröser Beton oder so.

      Ich arbeite grade daran, den Code zu kommentieren.

      EDIT: Ups, hab noch nen Bug mit Teilern > 1 Zeichen gefunden... Fix in wenigen Minuten!
      <Irrenhaus3>wenn [zensiert] erstmal das sabbeln anfängt, wird sogar ne Sinuskurve linear, um schneller abzuhauen
      <Irrenhaus3>da geht alles in Deckung

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

    • Zitat von maxda:

      maxda schrieb:

      Und du solltest alle Variablen, die nur im Script benutzt werden local machen (mit var).
      Wurde nun gemacht ^^
      Kommentiert wurde es auch, und Teiler mit mehr als einem Zeichen gehen nun auch. Siehe neues Beispiel.
      <Irrenhaus3>wenn [zensiert] erstmal das sabbeln anfängt, wird sogar ne Sinuskurve linear, um schneller abzuhauen
      <Irrenhaus3>da geht alles in Deckung