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
und hier der gml-code (nur der wichtige teil)
Spoiler anzeigen
Alles anzeigen
Der Beitritt-Teil funktioniert, daran liegts nicht. Achja, im konzept hab ich immer variable geschrieben damit ist hier sp gemeint.
Hier mal Konzept (Falls es daran liegt)
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
=======
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)
GML-Quellcode
- // Beitritt
- if (master=1)
- {
- temp=dll39_tcp_accept(listen,2)
- if (temp<=0)
- exit
- else
- {
- spieleranzahl+=1
- andererspieler[spieleranzahl]=temp
- inst=instance_create(8,8,obj_spieler)
- inst.sp=spieleranzahl
- dll39_buffer_clear(0)
- dll39_write_byte(0,0)
- dll39_write_short(spieleranzahl,0)
- dll39_message_send(andererspieler[spieleranzahl],0,0,0)
- }
- }
- else
- {
- if (beitritt=1)
- {
- mes=dll39_message_receive(server,0,0)
- if (mes<0) exit
- mid=dll39_read_byte(0)
- if (mid=0)
- {
- spieleranzahl=dll39_read_short(0)
- spieler=spieleranzahl
- for (a=1; a<=spieleranzahl; a+=1)
- {
- inst=instance_create(8,8,obj_spieler)
- inst.sp=a
- }
- beitritt=0
- }
- }
- }
- // Datenübertragung
- if (master=1)
- {
- // Empfangen (Von allen Spielern)
- for (b=1; b<=spieleranzahl; b+=1)
- {
- if (b!=1)
- {
- mes=dll39_message_receive(andererspieler[b],0,0)
- if (mes<0) exit
- mid=dll39_read_byte(0)
- if (mid=0)
- {
- with (obj_spieler)
- {
- if (sp=b)
- {
- x=dll39_read_short(0)
- y=dll39_read_short(0)
- }
- }
- }
- // Senden (an alle Spieler alle daten jedes Spielers)
- for (c=1; c<=spieleranzahl; c+=1)
- {
- if (c!=b)
- {
- dll39_buffer_clear(0)
- dll39_write_byte(0,0)
- dll39_write_short(spieleranzahl,0)
- with (obj_spieler)
- {
- if (sp=c)
- {
- dll39_write_short(c,0)
- dll39_write_short(x,0)
- dll39_write_short(y,0)
- }
- }
- dll39_message_send(andererspieler[a],0,0,0)
- }
- }
- }
- }
- }
- else
- {
- // Senden (an Server)
- dll39_buffer_clear(0)
- dll39_write_byte(0,0)
- dll39_write_short(x,0)
- dll39_write_short(y,0)
- dll39_message_send(server,0,0,0)
- // Empfangen (Von allen Spielern)
- mes=dll39_message_receive(0,0,0)
- if (mes<0) exit
- if (mes=0)
- {
- show_message('Server beendet!')
- dll39_socket_exit()
- room_goto(room0)
- exit
- }
- mid=dll39_read_byte(0)
- if (mid=0)
- {
- spieleranzahl=dll39_read_short(0)
- p=dll39_read_short(0)
- if (p!=spieler)
- {
- with (obj_spieler)
- {
- if (sp=p)
- {
- x=dll39_read_short(0)
- y=dll39_read_short(0)
- }
- }
- }
- }
- }
Der Beitritt-Teil funktioniert, daran liegts nicht. Achja, im konzept hab ich immer variable geschrieben damit ist hier sp gemeint.

© 2008 by Teamgrill Productions