Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Créer des RectangleShape en fonction du nombre de clients..  (Lu 1467 fois)

0 Membres et 1 Invité sur ce sujet

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Créer des RectangleShape en fonction du nombre de clients..
« 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 !

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Créer des RectangleShape en fonction du nombre de clients..
« Réponse #1 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.
Laurent Gomila - SFML developer