variablen zusammenfassen

  • GM 8
  • variablen zusammenfassen

    Hi,
    Ich würde gerne mehrere variablen zu einer zusammenfassen um sie dann per 39dll auf einmal zu verschicken also bsp aus x=1 ; y=3.445 und z=45.789 eine kette in der art von x1/y3.445/z45.789 zu machen und sie am ende auch wieder in die einzelnen variablen zu zerteilen gibt es dafür einen script?
    :rage:
  • Naja, es gibt mehrere Möglichkeiten.
    Du könntest sie natürlich als strings addieren (also aneinanderhängen) und dabei Trennzeichen einfügen, z.B. "|".
    Dann kannst du diesen String verschicken und mit Copy's nützlichem Skript "string_get" wieder teilen und it real() in Zahlen verwandeln: copy's nützliche Scripte

    Eine andere Möglichkeit wäre es die Zahlen als Zahlen zu lassen und mit der so genannten cantor'schen Funktion zu verbinden.
    Dazu habe ich mal zwei Skripte geschrieben:

    GML-Quellcode

    1. // cantor_merge(number 1, number 2)
    2. return(0.5*(argument0+argument1)*(argument0+argument1+1)+argument1);


    GML-Quellcode

    1. // cantor_split(mergednumber,which number 1 / 2 )
    2. // Ist das zweite Argument = 1 wird die erste der beiden Zahlen ausgegeben. = 2 um die zweite Zahl auszugeben.
    3. var t; t = floor((-1 + sqrt(1 + 8 * argument0))/2);
    4. if argument1-1
    5. return(argument0 - t * (t + 1) / 2)
    6. else return(t * (t + 3) / 2 - argument0);


    Wirklich empfehlen würde ich letztere Variante aber nur zum obfuscaten und sowas. Denn man spart keinen Speicher dabei ein (unter Umständen im Gegenteil).
    Strings sind für deinen Zweck wohl der bessere Weg..


    -$Marvin$- Hat aber auch recht! Wenn du Buffer benutzst, dann macht die 39 Dll dies quasi von selbst und das wahsrcheinlich deutlich schneller als in GML...

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

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

  • Du kannst es so machen:


    1te Version:
    Spoiler anzeigen

    GML-Quellcode

    1. //senden / Client
    2. clearbuffer()
    3. writebyte(MSG)
    4. writeushort(x)
    5. writeushort(y)
    6. writeushort(z)
    7. send_server()
    8. //Empfangen / Server
    9. xxx=readushort()
    10. yyy=readushort()
    11. zzz=readushort()
    12. clearbuffer()
    13. writebyte(MSG)
    14. writeushort(xxx)
    15. writeushort(yyy)
    16. writeushort(zzz)
    17. send_client(EVERYONE) //oder was auch immer ^^ Ich benutze EVERYONE für jeden, in jedem Raum und SAMEROOM für die Spieler die im selbem Raum sind
    18. //Empfangen und auslesen von Client / Client
    19. object.x=readushort()
    20. object.y=readushort()
    21. object.z=readushort()
    Alles anzeigen




    2te Version:
    Spoiler anzeigen

    GML-Quellcode

    1. //Senden / Client
    2. _var=string(x)+","+string(y)+","+string(z)
    3. clearbuffer()
    4. writebyte(MSG)
    5. writestring(_var)
    6. send_server()
    7. //Empfangen / Server
    8. _var=readstring()
    9. clearbuffer()
    10. writebyte(MSG)
    11. writestring(_var)
    12. send_client(EVERYONE)
    13. //Empfangen und auslesen von Client / Client
    14. _var=readstring()
    15. xxx=string_copy(_var,1,string_pos(",",_var)-1);
    16. txt=string_delete(_var,1,string_pos(",",_var));
    17. yyy=string_copy(txt,1,string_pos(",",txt)-1);
    18. txt=string_delete(txt,1,string_pos(",",txt));
    19. zzz=string_copy(txt,1,string_pos(",",txt)-1);
    20. txt=string_delete(txt,1,string_pos(",",txt)); //<-- ich glaube das hier ist nicht nötig ^^ außer du willst noch mehr variablen zusammenfügen.
    21. object.x=xxx
    22. object.y=yyy
    23. object.z=zzz
    Alles anzeigen




    Die erste Version ist wesentlich einfacher ;)

    Ich hoffe das dort kein Fehler ist...
  • normalerweise versende ich ja auch alles als byte das problem ist aber das es aus irgendeinem grund hier nicht klappt nicht klappt kann ja mal meinen code posten :

    GML-Quellcode

    1. if global.myid = 0
    2. {
    3. with(all)
    4. if(object_index = Fass_ph or object_index = kiste_ph)
    5. {
    6. clearbuffer()
    7. writebyte(17)
    8. sendmessage(global.clienttcp)
    9. }
    10. }
    Alles anzeigen



    kommt noch beim empfänger an






    GML-Quellcode

    1. if global.myid = 0
    2. {
    3. with(all)
    4. if(object_index = Fass_ph or object_index = kiste_ph)
    5. {
    6. clearbuffer()
    7. writebyte(17)
    8. writebyte(ep_body_get_x(global.world,body))
    9. writebyte(ep_body_get_x(global.world,body))
    10. writebyte(ep_body_get_xvel_center(global.world,body))
    11. writebyte(ep_body_get_yvel_center(global.world,body))
    12. writebyte(ep_body_get_rotvel(global.world,body))
    13. writebyte(ep_body_get_rot(global.world,body))
    14. writebyte(ep_body_get_inertia(global.world,body))
    15. sendmessage(global.clienttcp)
    16. }
    17. }
    Alles anzeigen

    so allerdings nicht mehr







    ich dachte jetzt das das vieleicht zu viele für eine nachricht sind und wollte es halt zu einem string oder short zusammenfassen.
    :rage:
  • Du wirst hier auch größere Werte rauskriegen, also ist byte wohl die falsche Größenordnung (Außer dein Raum ist nur 255 pixel breit bzw. hoch)
    Nutz writeshort, writefloat etc je nach Größe und Beschaffenheit der Zahlen.

    © 2008 by Teamgrill Productions
  • ich dachte jetzt das das vieleicht zu viele für eine nachricht sind und
    wollte es halt zu einem string oder short zusammenfassen.
    Die 39dll benutzt intern einen Buffer. Dieser Buffer erweitert sich immer dann wenn er voll ist. Wenn du nun einen string benutzt sind das intern auch wieder nur bytes (Pro Zeichen ein byte).
    Wenn wir nun die Zahl "255" speichern wohlen, haben wir schon 3 Bytes. Bei einem richtigen Byte nur einen. Strings sind also nur für Texte geeignet und nicht für Zahlen.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • ich muss grad mal testen weil mit writeshort funktionier es auch nicht
    welches ist denn jetzt noch mal für was?
    byte (-256) - 256

    short ?

    string text

    flow ?


    edit also alles geht mit short außer der inertia die muss anscheinend einen wert haben der nicht reinpasst
    :rage:

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