[39dll] image_blend senden geht nicht

  • GM 8
  • [39dll] image_blend senden geht nicht

    Hallo Leute,

    Ich wollte mich an der 39dll Probieren und komme momentan mehr oder weniger gut damit zurecht.
    Nutze Sie seit ca. 2 Arbeitsstunden also nicht gerade sehr lange.

    Ich habe eine Verbindung aufgebaut und einen Master Inklusive Slave.
    Der Slave kann garnichts, er dient nur dazu, dass Andere Spieler sich gegenseitig sehen.
    Das zusenden der Koordinaten X,Y und den Sprite_Index, etc... bekomm ich wunderbar hin.

    Damit Ihr es wisst, Ich nutze einen seperaten Server auf dem die Clienten verbinden.

    Mein Problem ist es jetzt, das ich das "image_blend" nicht gesendet bekomme. Wenn ich es
    senden und empfangen möchte, hängt das Spiel ODER es werden keine Koordinaten der
    Spieler mehr übersendet. Ich zeige Euch mal den von mir genutzten Code und Ihr könnt
    ja vll. mit Eurem geschulten 39dll Auge sehen wo der Fehler liegen soll :P

    Alarm Event des Master / Player_Self :

    GML-Quellcode

    1. clearbuffer();
    2. writebyte(1);
    3. writebyte(global.myid);
    4. writeshort(x); // X Koordinate
    5. writeshort(y); // Y Koordinate
    6. writeshort(sprite_index);
    7. writeshort(image_speed);
    8. writeshort(image_index);
    9. writeshort(image_blend);
    10. sendmessage(global.clienttcp);
    11. alarm[0] = 1; // Schleifensenden
    Alles anzeigen


    Hier das "Client Objekt" im Server:

    GML-Quellcode

    1. messid = readbyte();
    2. switch(messid)
    3. {
    4. case 1:
    5. var player, value;
    6. value = readbyte();
    7. player = global.players[value];
    8. player.x = readshort();
    9. player.y = readshort();
    10. player.sprite_index = readshort();
    11. player.image_speed = readshort();
    12. player.image_index = readshort();
    13. player.image_blend = readshort();
    14. clearbuffer();
    15. writebyte(2);
    16. writebyte(value);
    17. writeshort(player.x);
    18. writeshort(player.y);
    19. writeshort(player.sprite_index);
    20. writeshort(player.image_speed);
    21. writeshort(player.image_index);
    22. writeshort(player.image_blend);
    23. with(obj_client)
    24. {
    25. sendmessage(tcp);
    26. }
    27. break;
    Alles anzeigen


    Und hier das "Client Objekt" im Client

    GML-Quellcode

    1. case 2:
    2. value = readbyte();
    3. player = players[value];
    4. player.x = readshort();
    5. player.y = readshort();
    6. player.sprite_index = readshort();
    7. player.image_speed = readshort();
    8. player.image_index = readshort();
    9. player.image_blend = readshort();
    10. break;


    --------------------------------------------

    Bevor Ich es teste frag ich es nochmal nach, und zwar, kann es sein, dass
    die Farben als String gesendet werden, der Server es aber als Real einliest
    und deswegen alles abkackt? Ist es so simpel?

    Naja vielleicht habt Ihr eine Lösung, ich wüsste nicht was hier dran falsch sein
    soll. Ich versteh nicht, warum es nicht funktioniert, zumal der Rest des
    Sendesn ja einwandfrei funktioniert.

    Danke schonmal :)

    MfG. Kirby

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

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

  • ne, der Fehler liegt wo anders, bin was die DLL angeht ein Noob, aber hab gleich im Tut dies hier gefunden:


    We have used the data type "short" because a short can be any number between
    -32000 to +32000.
    Der GM nutzt als Farben allerdings viel größere Zahlen. Du musst einen anderen message-Typ verwenden um die farbe zu schicken.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Du meinst also das zusenden der Farbcodes sprich meinetwegen "65365" geht nicht da
    es maximal bis 32000 geht? Das macht natürlich Sinn. Und die Lösung wäre jetzt das Limit
    zu erhöhen oder ist es eher ein Fixwert?

    MfG.

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Es ist ein fixwert da dieses Writeshort scheinbar auf 2 Bytes beschrenkt ist, dies bedeutet 2 * 2^8 Möglichkeiten = 65536.
    Das würde bedeuten dass die Zahl maximal 32768 und minimal -32768 betragen darf.

    Lies die Tuts... sind nicht umsonst da ;)

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Hej, ein Minikrieg der Datentypen :D

    Also, ich empfehle short. Gan einfach:

    Senden von jedem Farbwert: 1 byte pro farbe (da 256 werte pro Kanal), sind 3 bytes.
    Senden als string: 1 byte pro ziffer (da es in ASCII 255 zeichen gibt), sind 5 bytes.
    Senden als int: ein int ist 4 byte und geht von -2.147.483.648 bis 2.147.483.648.
    Senden als short:ein short ist 2 byte groß und geht von -32.768 bis 32.768.

    Also, am besten ist short. Dafür musst du allerdings erst ein mal den Farbwert 32768 entziehen und es am anderen ende wieder addieren.

    MfG SDX
  • SDX: nicht ganz...

    Mann kann auch einen drei Zeichen langen String nehmen, da wie du selbst gesagt hast ein Zeichen 255 Möglichkeiten hat...

    Man braucht auf jedenfall 3 Bytes... ich weiß aber nicht wie das da mit den Datentypen geregelt ist...

    Gibt es nicht sowas wie Char (ein Byte) bei c++ ( :love: )?

    maxda
  • Virus27 schrieb:

    mach es einfach zu einem string und sende es dann

    string(image_blend) --->macht image blend zu einem string
    real(string_von_image_blend) ---->macht es wieder zu einer zahl
    string() geht nur in Verbindung einer Variable.
    Genauso wie auch real()

    Es müsste also zB. heißen:

    GML-Quellcode

    1. wPcol = image_blend;
    2. s_wPcol = string(wPcol);
    3. writeshort(s_wPcol);


    GML-Quellcode

    1. rPcol = real(s_wPcol)
    2. player.image_blend = readshort();


    Glaube aber nicht das das ganze so hinhaut wie ich das will.
    Dann eventuell doch in Farben zerlegen.

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Kirby4tw schrieb:

    Virus27 schrieb:

    mach es einfach zu einem string und sende es dann

    string(image_blend) --->macht image blend zu einem string
    real(string_von_image_blend) ---->macht es wieder zu einer zahl
    string() geht nur in Verbindung einer Variable.
    Genauso wie auch real()

    Es müsste also zB. heißen:

    GML-Quellcode

    1. wPcol = image_blend;
    2. s_wPcol = string(wPcol);
    3. writeshort(s_wPcol);


    GML-Quellcode

    1. rPcol = real(s_wPcol)
    2. player.image_blend = readshort();

    ?( brauchst doch dazu keine extra Variable. Außerdem wie wärs jetzt mit writeint()? Damit kannst du die komplette Farbe senden.

    © 2008 by Teamgrill Productions
  • Da wird man ja ganz matsch in der Birne. Scheinbar hast du nicht mal das mit den Datentypen verstanden. Wie kommst du dazu, den Farbwert zu einem String zu casten (kann man das so unter GM nennen?) und dann als short zu senden?

    zum senden:

    GML-Quellcode

    1. writeshort(image_blend-32768 );

    zum empfangen:

    GML-Quellcode

    1. player.image_blend = readshort()+32768 ;


    Ich habe zwar noch nie die 39dll zwischen den Fingern gehabt, aber sowas sollte für einen Experten selbstverständlich sein.

    MfG SDX
  • Ich wollte den Misst nie als String senden, dass haben mir deine Kollegen geraten.
    Natürlich ist das völliger Schwachsinn. Verfolge doch mal die Posts, habe nie nen Vorschlag
    unterbreitet sowas als String zu versenden. Habe nur auf etwas geantwortet.

    Wegen deiner Birne tut mir aufrichtig leid :/
    Vll. solltest dir ein Kochforum suchen :P

    MfG.

    Izzyshooter - echt zum schießen

    [Aktuelle Version: 3.3]

  • Benutzer online 2

    2 Besucher