39dll unbegrenzt spieler

  • 39dll unbegrenzt spieler

    So, nachdem ich es nie wirklich mit den mplay_funktionen hinbekommen habe versuche ich es nun mit der 39dll (Extension). Ich habe ein Konzept aufgestellt, das meiner Meinung nach funktionieren müsste und dazu einen code geschrieben, der aber nicht wirklich das tut, was er soll. Der erste teil des Codes funktioniert, wenn ein spieler beitritt, werden die variablen richtig empfangen und jedes spielerobjekt bekommt eine variable zugewiesen zur unterscheidung. Die unterschiedlichen Spieler können sich auch bewegen, ausgetauscht wird die bewegung allerdings nicht, beim anderen bewegt sich der spieler nicht.
    Hier mal Konzept (Falls es daran liegt)
    Spoiler anzeigen
    Konzept
    =======

    spieler=1
    spieleranzahl=1

    Wenn spieler beitritt:
    Handlung bei Server:
    spieleranzahl+=1
    Spielerobjekt mit variable=spieleranzahl erstellen
    spieler in variable andererspieler[spieleranzahl] speichern
    für beigetretenen spieler spieleranzahl senden
    Handlung bei Client:
    spieler=spieleranzahl
    Schleife: a=1 a<=spieleranzahl
    in Schleife objekte mit variable=a erstellen

    Empfangen (Server)
    Schleife: b=1 b<=spieleranzahl
    Fall b=1 auslassen (da 1=Server)
    daten von andererspieler empfangen
    für alle spielerobjekte: wenn variable=b, daten ausgleichen

    senden (server)
    Schleife innerhalb b-Schleife:
    c=1 c<=spieleranzahl
    c steht nun für die Spielerdaten
    spieleranzahl senden (um cliant wissen zu lassen wie viele spieler)
    wenn c!=b ist, objekt suchen, dass variable=c hat und dessen
    koordinaten und derzeitigen stand von c an andererspieler senden

    Senden (client)
    Sendet Daten einfach an Server
    Empfangen Client
    Empfängt Daten vom Server, liest spieleranzahl aus,
    liest c aus
    führt für alle spielerobjekte datenabgleich wenn variable=c

    und hier der gml-code (nur der wichtige teil)
    Spoiler anzeigen

    GML-Quellcode

    1. // Beitritt
    2. if (master=1)
    3. {
    4. temp=dll39_tcp_accept(listen,2)
    5. if (temp<=0)
    6. exit
    7. else
    8. {
    9. spieleranzahl+=1
    10. andererspieler[spieleranzahl]=temp
    11. inst=instance_create(8,8,obj_spieler)
    12. inst.sp=spieleranzahl
    13. dll39_buffer_clear(0)
    14. dll39_write_byte(0,0)
    15. dll39_write_short(spieleranzahl,0)
    16. dll39_message_send(andererspieler[spieleranzahl],0,0,0)
    17. }
    18. }
    19. else
    20. {
    21. if (beitritt=1)
    22. {
    23. mes=dll39_message_receive(server,0,0)
    24. if (mes<0) exit
    25. mid=dll39_read_byte(0)
    26. if (mid=0)
    27. {
    28. spieleranzahl=dll39_read_short(0)
    29. spieler=spieleranzahl
    30. for (a=1; a<=spieleranzahl; a+=1)
    31. {
    32. inst=instance_create(8,8,obj_spieler)
    33. inst.sp=a
    34. }
    35. beitritt=0
    36. }
    37. }
    38. }
    39. // Datenübertragung
    40. if (master=1)
    41. {
    42. // Empfangen (Von allen Spielern)
    43. for (b=1; b<=spieleranzahl; b+=1)
    44. {
    45. if (b!=1)
    46. {
    47. mes=dll39_message_receive(andererspieler[b],0,0)
    48. if (mes<0) exit
    49. mid=dll39_read_byte(0)
    50. if (mid=0)
    51. {
    52. with (obj_spieler)
    53. {
    54. if (sp=b)
    55. {
    56. x=dll39_read_short(0)
    57. y=dll39_read_short(0)
    58. }
    59. }
    60. }
    61. // Senden (an alle Spieler alle daten jedes Spielers)
    62. for (c=1; c<=spieleranzahl; c+=1)
    63. {
    64. if (c!=b)
    65. {
    66. dll39_buffer_clear(0)
    67. dll39_write_byte(0,0)
    68. dll39_write_short(spieleranzahl,0)
    69. with (obj_spieler)
    70. {
    71. if (sp=c)
    72. {
    73. dll39_write_short(c,0)
    74. dll39_write_short(x,0)
    75. dll39_write_short(y,0)
    76. }
    77. }
    78. dll39_message_send(andererspieler[a],0,0,0)
    79. }
    80. }
    81. }
    82. }
    83. }
    84. else
    85. {
    86. // Senden (an Server)
    87. dll39_buffer_clear(0)
    88. dll39_write_byte(0,0)
    89. dll39_write_short(x,0)
    90. dll39_write_short(y,0)
    91. dll39_message_send(server,0,0,0)
    92. // Empfangen (Von allen Spielern)
    93. mes=dll39_message_receive(0,0,0)
    94. if (mes<0) exit
    95. if (mes=0)
    96. {
    97. show_message('Server beendet!')
    98. dll39_socket_exit()
    99. room_goto(room0)
    100. exit
    101. }
    102. mid=dll39_read_byte(0)
    103. if (mid=0)
    104. {
    105. spieleranzahl=dll39_read_short(0)
    106. p=dll39_read_short(0)
    107. if (p!=spieler)
    108. {
    109. with (obj_spieler)
    110. {
    111. if (sp=p)
    112. {
    113. x=dll39_read_short(0)
    114. y=dll39_read_short(0)
    115. }
    116. }
    117. }
    118. }
    119. }
    Alles anzeigen


    Der Beitritt-Teil funktioniert, daran liegts nicht. Achja, im konzept hab ich immer variable geschrieben damit ist hier sp gemeint.

    © 2008 by Teamgrill Productions
  • Ich glaub das liegt am Senden der Daten vom Server. :|
    Dein ganzes Konzept ist für mich ziemlich undurchsichtig und unverständlich.. :(

    Falls es dir helfen sollte, so ist es, wie ich es immer mache:
    Spoiler anzeigen
    Beitritt:

    GML-Quellcode

    1. // "Neuer Spieler" senden
    2. clearbuffer();
    3. writebyte(0); // Neuer Spieler
    4. writeushort(my_id);
    5. with (obj_otherplayer) {sendmessage(my_socket);}
    6. // Spielerinstance erstellen:
    7. with (instance_create(0,0,obj_otherplayer)) {
    8. my_id = global.counter;
    9. my_socket = new_socket; // Rückgabe von tcpaccept
    10. global.counter += 1;
    Alles anzeigen

    Spielerverwaltung:

    GML-Quellcode

    1. with (obj_otherplayer) while (1) {
    2. size = receivemessage(my_socket);
    3. if (!size) {break;} // Wenn nichts empfangen, nächster
    4. switch (readbyte()) {
    5. case 1: // Bewegen
    6. x = readushort();
    7. y = readushort();
    8. clearbuffer();
    9. writebyte(1); // Bewegen
    10. writeushort(my_id);
    11. writeushort(x);
    12. writeushort(y);
    13. with (obj_otherplayer) if (id != other.id) {
    14. // Nicht an sich selbst senden
    15. sendmessage(my_socket);
    16. }
    17. break;
    18. }
    19. }
    20. }
    Alles anzeigen

    Beim Spieler:

    GML-Quellcode

    1. while (1) {
    2. size = receivemessage(my_socket);
    3. if (!size) {exit;}
    4. switch (readbyte()) {
    5. case 0: // Neuer Spieler
    6. with (instance_create(0,0,obj_otherplayer) {
    7. my_id = readushort();
    8. }
    9. break;
    10. case 1: // Bewegen
    11. p_id = readushort();
    12. with (obj_otherplayer) if (my_id = other.p_id) {
    13. x = readushort();
    14. y = readushort();
    15. }
    16. break;
    17. }
    18. }
    Alles anzeigen

    (Von Hand geschrieben - alle Angaben ohne Pistole oder sonstige Schusswaffen ;) )
    Übrigens sind das so wie es aussieht nicht deine Befehle, bei mir heißen die halt so :P
  • Benutzer online 1

    1 Besucher