Salut à tous !
Alors voilà, je développe un petit jeu en ligne qui avance à vitesse grand V, néanmoins, pour les échanges réseaux, je procède de la sorte ( bon, je vulgarise ça un petit peu pour poster ma question ici ) :
sendPacket << username << x << y << state << mapzone << level;
Et bien entendu, de l'autre côté, on reçoit tout dans le même ordre, ça fonctionne parfaitement mais en fait, ça ne m'enchante pas de devoir tout renvoyer à chaque fois.. Ca bouffe de la bande passante et par conséquent, plus il y a de joueurs présents en ligne, plus ça lag..
Admettons que le personnage se déplace sur l'axe Y, j'aimerais que UNIQUEMENT la valeur de la variable Y soit envoyée et traitée de l'autre côté..
Comment donc pourrais-je m'y prendre pour que de l'autre côté, le serveur se dise
" ÇA, c'est pour la variable Y ! "J'ai tenté de faire un Packet différent pour chaque donnée envoyée et un packet de réception différent pour chaque réception mais ça arrive dans le désordre le plus total et puis ça me semble inutile, farfelu et complètement à côté de la plaque comme méthode..
Comment m'y prendre ?
Merci à tous, les amis :-]
PS : J'ai tenté de faire un petit code en guise de test avant de vouloir m'occuper de mon projet, mais c'est absolument pas fonctionnel du tout, lol.
Côté Serveur :
( J'ai crée un Packet pour recevoir les int X, Y et un autre Packet pour recevoir les strings mais cette méthode est complètement nulle et non fonctionnelle.. )
#include <iostream>
#include <vector>
#include <SFML/Network.hpp>
using namespace std;
using namespace sf;
int main()
{
int port = 2000;
bool done = false;
TcpListener listener;
SocketSelector selector;
if (listener.listen(port) == Socket::Done)
cout << "Serveur lance sur le port " << port << endl;
else
cout << "Impossible de lancer le serveur sur le port " << port << endl;
listener.setBlocking(false);
selector.add(listener);
vector<TcpSocket*>clients;
while (!done)
{
if (selector.wait())
{
if (selector.isReady(listener))
{
TcpSocket* socket = new TcpSocket;
listener.accept(*socket);
clients.push_back(socket);
selector.add(*socket);
Packet receivePacket;
string pseudo;
if (socket->receive(receivePacket) == Socket::Done)
{
receivePacket >> pseudo;
cout << pseudo << " vient de se connecter." << endl;
}
} else {
for (int i = 0 ; i < clients.size() ; i++)
{
if (selector.isReady(*clients[i]))
{
Packet receivePacket, receivePacket2, sendPacket;
string str;
if (clients[i]->receive(receivePacket) == Socket::Done)
{
int x, y;
if (receivePacket >> x >> y)
{
cout << "recu de " << clients[i]->getRemoteAddress().getPublicAddress()
<< " : x : " << x << " , y : " << y << endl;
sendPacket << x << y;
}
for (int j = 0 ; j < clients.size() ; j++)
{
if (i!=j)
clients[j]->send(sendPacket);
}
}
if (clients[i]->receive(receivePacket2) == Socket::Done)
{
string str;
if (receivePacket2 >> str)
{
cout << "recu de " << clients[i]->getRemoteAddress().getPublicAddress()
<< " : str = " << str << endl;
sendPacket << str;
}
for (int j = 0 ; j < clients.size() ; j++)
{
if (i!=j)
clients[j]->send(sendPacket);
}
}
}
}
}
}
}
}
Mon Client de test :
(Quand on appui sur X ou Y ça incrémente les variables en question et quand on appuie sur S c'est censé envoyer la chaîne de caractère ).
#include <iostream>
#include <sstream>
#include <conio.h>
#include <SFML/Network.hpp>
using namespace std;
using namespace sf;
int main()
{
bool done = false;
string ip = "192.168.0.25";
int port = 2000;
TcpSocket socket;
string pseudo;
cout << "Votre pseudo : ";
getline(cin,pseudo);
if (socket.connect(ip, port) == Socket::Done)
{
cout << "connexion reussie ! " << endl;
Packet sendPacket;
socket.setBlocking(false);
sendPacket << pseudo;
socket.send(sendPacket);
} else {
cout << "echec de connexion... " << endl;
exit(0);
}
int x = 0, y = 5;
Clock clockSend;
while (!done)
{
Packet sendPacket, sendPacket2;
if (clockSend.getElapsedTime().asMilliseconds()>50)
{
if (_kbhit())
{
switch (_getch())
{
case 'x':
x++;
sendPacket << x << y;
socket.send(sendPacket);
break;
case 'y':
y++;
sendPacket << x << y;
socket.send(sendPacket);
break;
case 's':
sendPacket2 << "Lol!";
socket.send(sendPacket2);
break;
}
}
clockSend.restart();
}
system("cls");
cout << " x : " << x << " , y : " << y << endl;
}
}