Erstmal Hallo Community,
Ich arbeite zurzeit an meiner Multiplayer Engine, die teilweise Probleme aufzeigt. Bei dieser .gmk handelt es sich um einen Server und Client zugleich.
Die Engine verfolgt das Prinzip, wenn gehostet wird, erstellt sie einen Client, der dann direkt zum Server verbindet. Somit hat man die Verbindungsart, wie sie in den meisten Spielen ist(Wie auch oft in Strategiespielen).
Die Clients senden oder empfangen nichts oder der Server sendet oder empfängt nicht.
1. Problem der Spieler kann nie den Namen andere Clients sehen (Keine Ahnung warum?)
2. Problem der Spieler kann nicht alle Clients sehen (Der Erste sieht nur den Zweiten usw. Manchmal sieht keiner mehr alles was nach Client ID 2 kommt)
Hier ein Bid von dem Problem:

Es soll gesagt sein, dass alle Objekte auf persistent sind.
In meiner .gmk gibt es insgesamt 6 Obkete:
Einemal:
'obj_control_menu' <- Menu, das nur dafür sorgt ob du mit 'H' hostest oder mit 'J' joinen kann.
Serverseitig:
'obj_server_control' <- Startet einen Server und wartet auf Clients.
Spoiler anzeigen
'obj_server_client' <- versendet Daten weiter an Clients (Mögl. Problem, kann sein, dass er das nicht tut.)
Spoiler anzeigen
Clientseitig: 'obj_client_control' <- Baut Verbindung auf, versendet(Mögl. Problem, kann ebenfalls sein, dass er das nicht tut) und emfängt Daten und erstellt gebenfalls Instanzen.
Spoiler anzeigen
'obj_client_player' <- Wiederspiegelt das Spielerobjekt des Clients.
Spoiler anzeigen
'obj_client_other' <- Wiederspiegelt die Spielerobjekte der anderen Clients.
Spoiler anzeigen
Lade noch die .gmk hoch;) Hoffe jemand findet Zeit mir dabei zu helfen.
--------------------------------------------------------------
Edit: Oh man ist mir das peinlich. Ich hab mit "127.1.1.0" verbunden, statt mit "127.0.0.1" Problem gelöst, kann gern geschlossen werden.
Ich arbeite zurzeit an meiner Multiplayer Engine, die teilweise Probleme aufzeigt. Bei dieser .gmk handelt es sich um einen Server und Client zugleich.
Die Engine verfolgt das Prinzip, wenn gehostet wird, erstellt sie einen Client, der dann direkt zum Server verbindet. Somit hat man die Verbindungsart, wie sie in den meisten Spielen ist(Wie auch oft in Strategiespielen).
Die Clients senden oder empfangen nichts oder der Server sendet oder empfängt nicht.
1. Problem der Spieler kann nie den Namen andere Clients sehen (Keine Ahnung warum?)
2. Problem der Spieler kann nicht alle Clients sehen (Der Erste sieht nur den Zweiten usw. Manchmal sieht keiner mehr alles was nach Client ID 2 kommt)
Hier ein Bid von dem Problem:

Es soll gesagt sein, dass alle Objekte auf persistent sind.
In meiner .gmk gibt es insgesamt 6 Obkete:
Einemal:
'obj_control_menu' <- Menu, das nur dafür sorgt ob du mit 'H' hostest oder mit 'J' joinen kann.
Serverseitig:
'obj_server_control' <- Startet einen Server und wartet auf Clients.
-> Create:
Alles anzeigen
-> Step:
Alles anzeigen
GML-Quellcode
GML-Quellcode
- stcp = tcpaccept(servertcp,true);
- if(stcp)
- {
- for(b=1;b<256;b+=1)
- {
- if(clients[b] == -1)
- {
- clients[b] = 1;
- client_id = b;
- break;
- }
- }
- client = instance_create(0,0,obj_server_client);
- client.x = random(room_width-32);
- client.y = random(room_height-32);
- client.tcp = stcp;
- client.client_id = client_id;
- clients[client_id] = client;
- setnagle(client, false);
- clearbuffer();
- writebyte(CLIENT_LOGIN);
- writebyte(client_id);
- writeshort(client.x);
- writeshort(client.y);
- with(obj_server_client)
- {
- if(id != other.id)
- {
- sendmessage(tcp);
- }
- }
- with(obj_server_client)
- {
- if(id != other.client)
- {
- clearbuffer();
- writebyte(CLIENT_LOGIN);
- writebyte(client_id);
- writeshort(x);
- writeshort(y);
- writestring(nickname, true);
- sendmessage(other.stcp);
- }
- }
- }
-> Step:
Alles anzeigen
GML-Quellcode
- while(1)
- {
- size = receivemessage(tcp);
- if(size<0) break;
- if(size==0)
- {
- instance_destroy();
- break;
- }
- timeout = 0;
- mid = readbyte();
- switch(mid)
- {
- case CLIENT_NICKNAME:
- nick = readstring();
- clearbuffer();
- writebyte(CLIENT_NICKNAME);
- writebyte(client_id);
- writestring(nick, true);
- with(obj_server_client)
- {
- if(id != other.id)
- {
- sendmessage(tcp);
- }
- }
- break;
- }
- }
-> Create:
Alles anzeigen
-> Step:
Alles anzeigen
-> Draw:
GML-Quellcode
- nickname = get_string("Enter your name:","USER");
- tcp = tcpconnect("127.1.1.0",76765,1)
- if(!tcp)
- {
- show_message("Couldn't join a server");
- }
- else
- {
- show_message("Could join a server");
- setnagle(tcp,false);
- for(a=1;a<256;a+=1)
- {
- clients[a] = -1;
- }
- client_id = 0;
- clearbuffer();
- writebyte(CLIENT_NICKNAME);
- writestring(nickname);
- sendmessage(tcp);
- color = c_white;
- }
-> Step:
GML-Quellcode
- while(1)
- {
- size = receivemessage(tcp);
- if(size < 0) break;
- if(size == 0)
- {
- game_restart();
- break;
- }
- mid = readbyte();
- switch(mid)
- {
- case CLIENT_LOGIN:
- if(client_id == 0)
- {
- client_id = readbyte();
- x = readshort();
- y = readshort();
- client = instance_create(x,y,obj_client_player);
- client.client_id = client_id;
- client.nickname = nickname;
- }
- else
- {
- _client_id = readbyte();
- _x = readshort();
- _y = readshort();
- clients[_client_id] = instance_create(_x,_y,obj_client_other);
- clients[_client_id].client_id = _client_id;
- }
- break;
- case CLIENT_NICKNAME:
- player = clients[readbyte()];
- player.nickname = readstring();
- break;
- }
- }
-> Draw:
'obj_client_player' <- Wiederspiegelt das Spielerobjekt des Clients.
-> Draw:
Alles anzeigen
GML-Quellcode
- switch(client_id)
- {
- case 1: color = c_blue break;
- case 2: color = c_red break;
- case 3: color = c_green break;
- case 4: color = c_yellow break;
- case 5: color = c_orange break;
- case 6: color = c_purple break;
- case 7: color = c_aqua break;
- case 8: color = c_teal break;
- case 9: color = c_fuchsia break;
- case 10: color = c_lime break;
- }
- draw_set_color(color);
- draw_circle(x,y,16,false);
- draw_set_color(c_black);
- draw_set_halign(fa_center);
- draw_text(x,y-32,"["+string(client_id)+"] ["+nickname+"]");
'obj_client_other' <- Wiederspiegelt die Spielerobjekte der anderen Clients.
-> Create:
-> Draw:
Alles anzeigen
-> Draw:
GML-Quellcode
- switch(client_id)
- {
- case 1: color = c_blue break;
- case 2: color = c_red break;
- case 3: color = c_green break;
- case 4: color = c_yellow break;
- case 5: color = c_orange break;
- case 6: color = c_purple break;
- case 7: color = c_aqua break;
- case 8: color = c_teal break;
- case 9: color = c_fuchsia break;
- case 10: color = c_lime break;
- }
- draw_set_color(color);
- draw_circle(x,y,16,false);
- draw_set_color(c_black);
- draw_set_halign(fa_center);
- draw_text(x,y-32,"["+string(client_id)+"] ["+nickname+"]");
Lade noch die .gmk hoch;) Hoffe jemand findet Zeit mir dabei zu helfen.
--------------------------------------------------------------
Edit: Oh man ist mir das peinlich. Ich hab mit "127.1.1.0" verbunden, statt mit "127.0.0.1" Problem gelöst, kann gern geschlossen werden.
Mono C# / SFML.Net 

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Xable ()