IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SFML Discussion :

Créer des RectangleShape en temps réel en fonction du nombre de clients ?


Sujet :

SFML

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut Créer des RectangleShape en temps réel en fonction du nombre de clients ?
    Salut à tous,

    Alors voilà, j'essaie de faire du multi-clients avec la SFML, ça marche parfaitement pour envoyer / recevoir des données avec plusieurs clients, néanmoins, je suis confronté à un autre problème que je n'arrive pas à résoudre..

    J'aimerais que dés qu'un client se connecte au serveur, un rectangleshape supplémentaire soit crée sur chaque écran de chaque joueur et que l'on puisse voir chaque joueur / rectangle se déplacer sur la fenêtre en temps réel, alors oui les cubes s'additionnent quand des clients se connectent mais quand je veux positionner mon cube en fonction de la position de chacun, ça crash...

    Ça plante au niveau de box[idNumber]->setPosition(xe, ye); c'est uniquement cette ligne de code qui fait foirer mon programme..
    Merci à vous de bien vouloir m'éclairer sur cette erreur..

    La partie du code concernée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
            if (packet >> pseudo >> xe >> ye >> state_S >> sizeClients >> idNumber)
            {
                box[idNumber]->setPosition(xe,ye);
     
                if (compteur<sizeClients-1)
                {
                    i+=10;
                    RectangleShape *b = new RectangleShape(Vector2f(20,20));
                    b->setFillColor(Color::Red);
                    b->setPosition(xe+i, ye+i);
                    box.push_back(b);
                    compteur++;
                }
     
                cout << "Nbr objet box : " << box.size() << endl;
                cout << "Recu : " << xe << " , " << ye << " de " << pseudo << endl;
                cout << "Son numéro de client : " << idNumber << endl;
     
                if (!state_S)
                {
                    cout << pseudo << "s'est deconnecte." << endl;
                }
            }
    Merci à tous ;-)

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Vous faites le déplacement (setPosition) avant de rajouter un nouveau client. Du coup, si vous devez déplacer un nouveau client, l'index du tableau est invalide.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Merci beaucoup pour avoir déplacé mon sujet dans la section adéquate ( en effet, j'ignorais qu'il y avait une section SFML sur Developpez.net )

    Merci à vous, je vais aller y jeter un oeil avisé !

    Edit : Malencontreusement, cela plante toujours, je sais que c'est probablement du à un dépassement de tableau, mais là je ne vois pas comment je pourrais procéder dans ce cas de figure.

    Voici mon code client:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    #include <iostream>
    #include <vector>
     
    #include <algorithm>
     
    #include <SFML/Graphics.hpp>
    #include <SFML/Network.hpp>
     
    using namespace std;
    using namespace sf;
     
    int main()
    {
     
        string id;
        short int x = 0, y = 0;
     
        cout << "Pseudo : ";
        cin >> id;
     
        TcpSocket socket;
        int port = 2000;
        socket.connect("192.168.0.25", port);
     
        Packet sendPacket;
        sendPacket << id;
        socket.send(sendPacket);
     
        bool state = true;
        int i = 0;
     
        RectangleShape me(Vector2f(20,20));
        me.setFillColor(Color::Red);
     
        vector<int> idPlayers;
        vector<RectangleShape*>box;
     
        int compteur = 0;
     
        RenderWindow app(VideoMode(400,400,32),"SFML Multi Client test");
        app.setFramerateLimit(60);
     
        Clock clock;
     
        socket.setBlocking(false);
     
        while (app.isOpen())
        {
            Event event;
            while (app.pollEvent(event))
            {
                if (event.type == Event::Closed)
                    app.close();
            }
     
            Packet send;
     
            if (app.hasFocus())
            {
                if (Keyboard::isKeyPressed(Keyboard::Up))
                {
                    y--;
                    send << id << x << y << state;
                    socket.send(send);
                }
                if (Keyboard::isKeyPressed(Keyboard::Down))
                {
                    y++;
                    send << id << x << y << state;
                    socket.send(send);
                }
                if (Keyboard::isKeyPressed(Keyboard::Left))
                {
                    x--;
                    send << id << x << y << state;
                    socket.send(send);
                }
                if (Keyboard::isKeyPressed(Keyboard::Right))
                {
                    x++;
                    send << id << x << y << state;
                    socket.send(send);
                }
                if (Keyboard::isKeyPressed(Keyboard::Escape))
                {
                    state = false;
                    app.close();
                }
            }
     
            app.clear();
     
            Packet packet;
            socket.receive(packet);
     
            string pseudo;
            short int xe, ye;
            bool state_S;
            short int idNumber;
            int sizeClients;
     
            if (packet >> pseudo >> xe >> ye >> state_S >> sizeClients >> idNumber)
            {
                if (compteur<sizeClients-1)
                {
                    i+=10;
                    RectangleShape *b = new RectangleShape(Vector2f(20,20));
                    b->setFillColor(Color::Red);
                    b->setPosition(xe+i, ye+i);
                    box.push_back(b);
                    compteur++;
                }
     
                box[idNumber]->setPosition(xe,ye);
     
                cout << "Nbr objet box : " << box.size() << endl;
                cout << "Recu : " << xe << " , " << ye << " de " << pseudo << endl;
                cout << "Son numéro de client : " << idNumber << endl;
     
                if (!state_S)
                {
                    cout << pseudo << "s'est deconnecte." << endl;
                }
            }
     
            for (int i = 0 ; i < box.size() ; i++)
            {
                app.draw(*box[i]);
            }
     
            me.setPosition(Vector2f(x, y));
     
            app.draw(me);
     
            app.display();
        }
     
        }

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Avez-vous essayé l'exécution dans un débogueur, pour mieux comprendre où cela crash et surtout, comment l'ordinateur arrive à un tel crash ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    salut oui comme le mentionne Littlewhite c'est clairement un dépassement de tableau
    Donc il faudrait faire un petit contrôle si index >0 ou index<limite_tableau alors on agit sinon on ne fait rien
    Citation Envoyé par FrostfallDelphi Voir le message
    J'aimerais que dés qu'un client se connecte au serveur, un rectangleshape supplémentaire soit crée sur chaque écran de chaque joueur et que l'on puisse voir chaque joueur / rectangle se déplacer sur la fenêtre en temps réel, alors oui les cubes s'additionnent quand des clients se connectent mais quand je veux positionner mon cube en fonction de la position de chacun, ça crash...
    il faudrait nous détailler l'architecture client serveur de ton projet.
    Le multijoueur c'est complexe à gérer
    Est-ce que les rectangles sont crées côté client ou serveur ?
    Comment est-ce que chaque client sait qu'il doit créer un rectangle ?
    Ensuite pour chaque rectangle crée il faut le mettre dans une liste ou un tableau ; celui-ci est côté client ou serveur ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    LittleWhite > Effectivement, ça crash bel et bien au niveau du tableau mais pourtant il me semble bien ne pas le dépasser, c'est ça qui me turlupine..

    Mat.M > Alors en fait, le serveur accepte chaque connexion et range chaque socket propre à cette connexion dans un tableau de vector TcpSocket, ensuite, si le serveur reçoit des informations ( str / int / bool etc ), il les renvoi à tous les clients présents dans la partie sauf à l'émetteur de ces informations.

    Les rectangles sont crées côté client en fonction du nombre de personnes qu'il y a au total sur le serveur ( d'où la variable clientSize qui est envoyée depuis le serveur et réceptionnée côté client, qui est en fait la taille du tableau vector TcpSocket du serveur ).

    La variable idNumber, quant à elle, est le numéro qui identifie chaque client, ( lorsque le serveur enregistre une socket, il stock aussi le numéro de client dans un vector de int, le numéro est généré grace à la taille du vector TcpSocket à ce moment-là ).

    Dans mon client, si je décrémente 1 à la variable idNumber lorsqu'il s'agit de positionner les cubes des joueurs, c'est parce que je pars du principe que mon joueur que je dirige moi-même est déjà crée au début de mon programme et ne dépend pas des informations reçues du serveur.

    En définitive, voici mon code entier côté Client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    #include <iostream>
    #include <vector>
     
    #include <algorithm>
     
    #include <SFML/Graphics.hpp>
    #include <SFML/Network.hpp>
     
    using namespace std;
    using namespace sf;
     
    int main()
    {
     
        string id;
        short int x = 0, y = 0;
     
        cout << "Pseudo : ";
        cin >> id;
     
        TcpSocket socket;
        int port = 2000;
        socket.connect("192.168.0.25", port);
     
        Packet sendPacket;
        sendPacket << id;
        socket.send(sendPacket);
     
        bool state = true;
     
        RectangleShape me(Vector2f(20,20));
        me.setFillColor(Color::Red);
     
        vector<int> idPlayers;
        vector<RectangleShape*>box;
     
        int compteur = 0;
     
        RenderWindow app(VideoMode(400,400,32),"SFML Multi Client test");
        app.setFramerateLimit(60);
     
        Clock clock;
     
        socket.setBlocking(false);
     
        while (app.isOpen())
        {
            Event event;
            while (app.pollEvent(event))
            {
                if (event.type == Event::Closed)
                    app.close();
            }
     
            if (app.hasFocus())
            {
                if (Keyboard::isKeyPressed(Keyboard::Up))
                {
                    y--;
                }
                if (Keyboard::isKeyPressed(Keyboard::Down))
                {
                    y++;
                }
                if (Keyboard::isKeyPressed(Keyboard::Left))
                {
                    x--;
                }
                if (Keyboard::isKeyPressed(Keyboard::Right))
                {
                    x++;
                }
                if (Keyboard::isKeyPressed(Keyboard::Escape))
                {
                    state = false;
                    app.close();
                }
            }
     
            if (clock.getElapsedTime().asMilliseconds()>30)
            {
                Packet send;
                send << id << x << y << state;
                socket.send(send);
                clock.restart();
            }
            app.clear();
     
            Packet packet;
            socket.receive(packet);
     
            string pseudo;
            short int xe, ye;
            bool state_S;
            short int idNumber;
            int sizeClients;
     
            if (packet >> pseudo >> xe >> ye >> state_S >> sizeClients >> idNumber)
            {
                if (compteur<sizeClients)
                {
                    RectangleShape *b = new RectangleShape(Vector2f(20,20));
                    b->setFillColor(Color::Red);
                    b->setPosition(xe, ye);
                    box.push_back(b);
                    compteur++;
                }
     
                box[idNumber-1]->setPosition(xe,ye);
     
                cout << "Nbr objet box : " << box.size() << endl;
                cout << "Recu : " << xe << " , " << ye << " de " << pseudo << endl;
                cout << "Son numéro de client : " << idNumber << endl;
     
                if (!state_S)
                {
                    cout << pseudo << "s'est deconnecte." << endl;
                }
            }
     
            for (int i = 0 ; i < box.size() ; i++)
            {
                app.draw(*box[i]);
            }
     
            me.setPosition(Vector2f(x, y));
     
            app.draw(me);
     
            app.display();
        }
     
        }
    Mon code côté Serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #include <iostream>
    #include <vector>
     
    #include <SFML/Graphics.hpp>
    #include <SFML/Network.hpp>
     
    using namespace std;
    using namespace sf;
     
    int main()
    {
        TcpListener listener;
        SocketSelector selector;
     
        bool done = false;
     
        int port = 2000;
        vector<TcpSocket*>clients;
        vector<string>pseudos;
        vector<int>id;
     
        listener.listen(port);
        selector.add(listener);
     
        listener.setBlocking(false);
     
        while (!done)
        {
            if (selector.wait())
            {
            if (selector.isReady(listener))
                {
                    TcpSocket *socket = new TcpSocket();
                    listener.accept(*socket);
                    string nickname;
                    Packet packet;
                    if (socket->receive(packet) == Socket::Done)
                    {
                        packet >> nickname;
                        cout << nickname << " vient de se connecter." << endl;
                    }
                    selector.add(*socket);
                    clients.push_back(socket);
                    pseudos.push_back(nickname);
                    id.push_back(clients.size());
     
                } else {
     
                for (int i = 0 ; i < clients.size() ; i++)
                {
                    if (selector.isReady(*clients[i]))
                    {
                        Packet packet, sendPacket;
                        if (clients[i]->receive(packet) == Socket::Done)
                        {
                            string nickname;
                            short int x, y;
                            short int idNumber = id[i];
                            bool state;
                            packet >> nickname >> x >> y >> state;
                            sendPacket << nickname << x << y << state << clients.size() << idNumber;
                            cout << " recu du client " << nickname << " : " << x << ", " << y << endl;
                            cout << " son statut : " << state << endl;
                            cout << " son id Number : " << id[i] << endl;
     
                            if (!state)
                            {
                                cout << "Le client " << nickname << " vient de se deconnecter. " << endl;
                                clients.erase(clients.begin()+i);
                                pseudos.erase(pseudos.begin()+i);
                                id.erase(id.begin()+i);
                                cout << "Clients restants : " << clients.size() << endl;
                                cout << "Pseudos restants : " << pseudos.size() << endl;
                            }
     
                            for (int j = 0 ; j < clients.size() ; j++)
                            {
                                if (i!=j)
                                {
                                    clients[j]->send(sendPacket);
                                }
                            }
                        }
                    }
                }
            }
        }
    }
     
    }
    Merci infiniment pour votre précieuse aide..! :-]

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Si vous ne le dépassez pas, c'est que le pointer contenu dans le tableau est NULL (ou invalide).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Cimentage
    Inscrit en
    Septembre 2014
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Cimentage
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Septembre 2014
    Messages : 44
    Points : 30
    Points
    30
    Par défaut
    Salut Little White,

    Vu que mon vector de box commence par [0] et que mes idNumber commencent à 1, je me suis dit qu'il y avait un décalage, donc j'ai fait en sorte que le serveur envoi l'idNumber - 1 afin que box[0] corresponde à idNumber[0] , box[1] corresponde à idNumber[1] etc..

    Je croyais avoir trouvé la solution mais ça plante toujours, je suis perdu..

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/06/2008, 19h17
  2. Déplacer des objets en temps réel avec la souris.
    Par johnnyjohnny dans le forum MATLAB
    Réponses: 4
    Dernier message: 03/07/2007, 14h54
  3. Réponses: 20
    Dernier message: 30/03/2007, 15h01
  4. [MySQL] Est-ce possible de creer des champs en temps réel lors d'une requête SQL ?
    Par kaptnkill dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/09/2006, 19h18
  5. Réponses: 7
    Dernier message: 27/01/2006, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo