Forum de la communauté SFML

Aide => Réseau => Discussion démarrée par: Slash94 le Janvier 22, 2017, 09:00:48 pm

Titre: Créer des RectangleShape en fonction du nombre de clients..
Posté par: Slash94 le Janvier 22, 2017, 09:00:48 pm
Salut à tous,

Alors voilà, je suis confronté à un problème, je n'arrive pas, depuis des heures, à mettre en oeuvre un système ou chaque nouveau client connecté créerait un RectangleShape supplémentaire sur chaque fenêtre de chaque client, ensuite j'aimerais que leurs déplacements soient perçus, évidemment, par tous les clients.

Voici mon code du serveur qui renvoi aux autres clients l'ID de chaque client ( vector d'int ), le pseudo ( vector de string ) et sa position en X.

#include <iostream>
#include <vector>

#include <SFML/Network.hpp>
#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;

int main()
{

    bool done = false;

    TcpListener listener;
    SocketSelector selector;
    vector<TcpSocket*>clients;
    vector<string>pseudos;
    vector<int>idNumber;
    int port = 2000;

    listener.listen(port);
    selector.add(listener);

        while (!done)
        {
            if (selector.wait())
            {
                if (selector.isReady(listener))
                {
                    TcpSocket *socket = new TcpSocket;
                    listener.accept(*socket);
                    Packet packet, sendPacket;
                    string id;
                    if (socket->receive(packet) == Socket::Done)
                         packet >> id;
                    cout << id << " vient de se connecter. " << endl;
                    clients.push_back(socket);
                    pseudos.push_back(id);
                    idNumber.push_back(clients.size());
                    selector.add(*socket);

                } else {
                    for (int i = 0 ; i < clients.size(); i++)
                    {
                        if (selector.isReady(*clients[i]))
                        {
                            Packet packet, sendPacket;
                            if (clients[i]->receive(packet) == Socket::Done)
                            {
                                int x;
                                packet >> x;
                                string pseudo = pseudos[i];
                                cout << x << " recu de " << pseudo << endl;
                                sendPacket << x << pseudo << idNumber[i] << clients.size();

                                for (int j = 0 ; j < clients.size() ; j++)
                                {
                                   if (i!=j)
                                    {
                                        clients[j]->send(sendPacket);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

 

Et voici mon client, qui est sensé créer un RectangleShape à chaque connexion d'un nouveau client, mais lorsque je lance un autre client, mon programme plante, je présume qu'il s'agirait d'un dépassement de vecteur, mais je suis paumé, je ne sais plus trop où me donner la tête ( et puis l'énervement qui va avec n'arrange rien !)

Merci à vous de bien pouvoir m'éclairer afin de parvenir à réussir à gerer plusieurs RectangleShape de plusieurs clients simultanément sans crash...

#include <iostream>
#include <vector>

#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>

using namespace std;
using namespace sf;

int main()
{
    int WIDTH = 800, HEIGHT = 600;
    RenderWindow app(VideoMode(WIDTH, HEIGHT, 32),"SFML Client Game", Style::Titlebar);
    app.setFramerateLimit(60);

    RectangleShape internBox(Vector2f(50,50));
    internBox.setFillColor(Color::Red);

    string ip = "192.168.0.25";
    int port = 2000;
    TcpSocket socket;

    socket.connect(ip, port);

    vector<RectangleShape*>players;

    socket.setBlocking(false);

    string id;
    cin >> id;

    Packet sendPacket;

    sendPacket << id;
    socket.send(sendPacket);

    int x = 0, y = 0;

    int xrecu = 0;
    string pseudo;
    int idNumber = 0;
    int localCheck = 1;
    int nbrClients = 0;

    while(app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            switch (event.type)
            {
            case Event::Closed:
                    app.close();
                break;
            case Event::KeyPressed:
                if (event.key.code == Keyboard::Escape)
                    app.close();
                break;
            }
        }

    Packet sendPacket;

    if (app.hasFocus())
    {
            if (Keyboard::isKeyPressed(Keyboard::Right))
        {
            x++;
            sendPacket << x;
            socket.send(sendPacket);
        }

            if (Keyboard::isKeyPressed(Keyboard::Left))
        {
            x--;
            sendPacket << x;
            socket.send(sendPacket);
        }
    }

    Packet packet;
    socket.receive(packet);


    if (packet >> xrecu >> pseudo >> idNumber >> nbrClients)
    {
        if (localCheck < nbrClients-1)
        {
            RectangleShape *box = new RectangleShape();
            box->setFillColor(Color::Red);
            box->setSize(Vector2f(50,50));
            players.push_back(box);
            localCheck+=1;
        }

        players[idNumber]->setPosition(xrecu,0);

        cout << "Vector players : " << players.size() << endl;
        cout << "Le serveur a " << nbrClients << " clients." << endl;
        cout << "La variable localCheck est a " << localCheck << endl;
        cout << "" << endl;
        cout << pseudo << " a son X a " << xrecu << " son idNumber est le " << idNumber << endl;
    }

    internBox.setPosition(Vector2f(x, internBox.getPosition().y));

    app.clear();

    for ( int i = 0 ; i < players.size() ; i++)
    {
        app.draw(*players[i]);
    }

    app.draw(internBox);

    app.display();

    }
}
 

Merci à vous !
Titre: Re : Créer des RectangleShape en fonction du nombre de clients..
Posté par: Laurent le Janvier 23, 2017, 06:24:25 am
Avant toute chose, utilise ton debugger, il te dira très précisément ce qui ne va pas.