Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Slash94

Pages: « Précédente 1 ... 3 4 [5] 6 Suivante »
61
Réseau / 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 !

62
Bonsoir  Laurent,
Comment faire pour vérifier si le problème vient bien de l'ouverture du port ? ( mon firewall est pourtant bien désactivé pour les essais )
Merci !

63
Salut à tous,

Alors voilà, j'ai développé une petite application permettant que 2 personnes puissent, depuis leur PC, déplacer un personnage animé avec les touches fléchées.

Le programme fonctionne parfaitement bien en local ou même en wifi avec mon PC de bureau - PC portable, avec l'ip de la box 168.0.0.25 ..

Néanmoins, après avoir renseigné mon adresse IP fixe pour que la connexion se fasse depuis l'extérieur, il ne se passe rien..

Lorsque j'envoi mon programme à un pote par email et que je lui demande de se connecter, il ne se passe rien, pourtant, j'ai ouvert le port que j'utilise ( 2000 ) depuis ma box SFR, mais impossible pour mon pote de se connecter lorsque je lance le serveur..

Merci à tous de bien vouloir m'éclairer sur ce problème.

Voici le code, sait-on jamais :

#include <iostream>

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

using namespace std;
using namespace sf;

int main()
{
    string ip = "85.***.**.**2";
    TcpSocket socket;

    cout << ip << endl;

    char connectionType;
    bool updateScreen;

        cout << "(s) pour serveur /  (c) pour client : ";
        cin >> connectionType;

    if (connectionType == 's')
    {
        TcpListener listener;
        listener.listen(2000);
        listener.accept(socket);
    }

    if (connectionType == 'c')
    {
        socket.connect(ip, 2000);
    }

    RenderWindow app(VideoMode(800,600,32),"SFML_Packets");

    Clock clock;

    Texture perso;
    perso.loadFromFile("mario.png");
    Sprite S1(perso), S2(perso);
    Vector2f prevPosition, p2Position;

    Vector2f position(800/2, 600/2);

    Vector2f anim, p2Anim;
    enum dir {up, right, down, left };
    enum p2Dir {up2, right2, down2, left2 };

    S1.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));
    S2.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));

    anim.x = 0;
    anim.y = down;

    p2Anim.x = 0;
    p2Anim.y = down2;

    float speed = 3;

    View view;

    socket.setBlocking(false);

    while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            if (event.type == Event::Closed)
                app.close();
            if (event.type == Event::GainedFocus)
                updateScreen = true;
            if (event.type == Event::LostFocus)
                updateScreen = false;
        }

        prevPosition = S1.getPosition();
        position.x = S1.getPosition().x + 12 - (800/2);
        position.y = S1.getPosition().y + 16 - (600/2);

        if (updateScreen)
        {
            if (Keyboard::isKeyPressed(Keyboard::Up) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(0, -speed);
                anim.y = up;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }
            if (Keyboard::isKeyPressed(Keyboard::Down) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(0, speed);
                anim.y = down;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }
            if (Keyboard::isKeyPressed(Keyboard::Left) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(-speed, 0);
                anim.y = left;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }
            if (Keyboard::isKeyPressed(Keyboard::Right) && clock.getElapsedTime().asMilliseconds()>100)
            {
                S1.move(speed, 0);
                anim.y = right;
                anim.x++;
                if (anim.x>2)
                    anim.x = 0;
                clock.restart();
            }

            if(Keyboard::isKeyPressed(Keyboard::Escape))
                app.close();

                S1.setTextureRect(IntRect(anim.x*24, anim.y*32, 24, 32));
        }

        Packet packet;

        if (prevPosition != S1.getPosition())
        {
            packet << S1.getPosition().x << S1.getPosition().y << anim.x << anim.y;
            socket.send(packet);
        }

        socket.receive(packet);

        if (packet >> p2Position.x >> p2Position.y >> p2Anim.x >> p2Anim.y )
        {
            S2.setPosition(p2Position);
            S2.setTextureRect(IntRect(p2Anim.x*24, p2Anim.y*32, 24, 32));
        }

        app.clear();

        view.reset(FloatRect(position.x, position.y, 800, 600));

        app.setView(view);

        app.draw(S1);
        app.draw(S2);

        app.display();
    }
}
 

64
Général / Triangles is not a type..?
« le: Janvier 02, 2017, 02:38:19 pm »
Salut à tous !

Cette fois-ci, je viens vous voir car je suis confronté à un problème bizarre, lorsque je crée un VertexArray dans mon main, il n'y a aucun problème, néanmoins, lorsque je décide de le déclarer dans le header d'une autre classe, j'ai l'erreur suivante :

'sf::Triangles' is not a type

Voici le code en question :

#ifndef PLANE_H_INCLUDED
#define PLANE_H_INCLUDED

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

class Plane{

protected:
    sf::VertexArray plane(sf::Triangles, 3);

public:
    Plane();
};

#endif // PLANE_H_INCLUDED
 

Merci à vous :-)

65
Merci à toi Laurent ;-)

66
Bon ben apparemment c'était mon checkeur de touche Escape qui faisait tout planter..

67
Salut à tous,

Je m'intéresse à la saisie clavier avec la SFML, mais lorsque je fais appel à l'événement concerné, tout ce que je récolte est la fermeture de ma fenêtre ..  >:(
Pourtant, sur des tutoriaux vus sur youtube, les types ont exactement placé le même code que moi et pourtant, lorsqu'ils saisissent des touches clavier, celles-ci s'écrivent sur la console..

Merci de bien vouloir m'éclaircir sur ce problème curieux :-)

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

#include <iostream>
#include <string>

using namespace std;
using namespace sf;

int main()
{

    int WIDTH = 800, HEIGHT = 600;

    RenderWindow app(VideoMode(WIDTH, HEIGHT, 32),"SFML Text Entered", Style::Titlebar);

    while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            switch(event.type){
            case Event::Closed:
                app.close();
                break;
            case Event::KeyPressed:
                if (Keyboard::Escape)
                app.close();
                break;
            case Event::TextEntered:
                cout << event.text.unicode;
                break;
            }
        }

        app.display();

    }
}
 

68
Génial ! J'ai trouvé !!!!

Suffisait simplement de passer en référence mon objet MapDisplay avec & !

Que suis-je c*n des fois...  ;D

Une fois de plus, si ma c**nerie peut en aider d'autres..  ::)

69
Général / Re : Erreur lorsque je lance l'exécutable de mon projet..
« le: Décembre 31, 2016, 04:28:00 pm »
Oui effectivement, mais je croyais que tout ce qui était inhérent à Code::Blocks était inclu exclusivement dans l'executable, la preuve, un simple .exe en mode console peut être distribué sans encombre contrairement à un .exe qui a été développé avec une librairie ajoutée ;D

70
Merci Laurent,

Effectivement, je ne me suis jamais réellement familiarisé avec le debugger, je me suis toujours contenté de corriger les erreurs une à une en fonction des erreurs du compilo..

Je crains de te faire piquer tes beaux yeux, Laurent, mais je vais poster ici l'intégralité de ma source :

main.cpp

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

#include "MapDisplay.h"
#include "EventGestion.h"

using namespace std;
using namespace sf;

int main()
{
    int WIDTH = 800, HEIGHT = 600;

    RenderWindow app(VideoMode(WIDTH, HEIGHT, 32),"SFML Editeur de Maps", Style::Titlebar);
    app.setFramerateLimit(60);

    Clock clock;

    MapDisplay MD(50,16,12);
    EventGestion EG(MD);

    while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            if (event.type == event.Closed || Keyboard::isKeyPressed(Keyboard::Escape))
                app.close();
        }

        app.clear();

        EG.ecouteClavier(app);
        EG.ecouteSouris(app);

        MD.afficherMapConsole();
        system("cls");

        cout << " cube size : " << MD.getCubeSize() << endl;
        cout << " Position souris x : " << MD.mouseX() << endl;
        cout << " Position souris y : " << MD.mouseY() << endl;

        if (MD.getCubeSize()>0)
        {
            MD.afficherMapWindow(app);
        }

        app.display();
    }

}
 

EventGestion.cpp

#include <SFML/Graphics.hpp>

#include "EventGestion.h"

#include <iostream>

using namespace std;
using namespace sf;

    EventGestion::EventGestion(MapDisplay Map) :
        MD(Map)
    {

    }

    void EventGestion::ecouteClavier(RenderWindow &app)
    {

    }

    void EventGestion::ecouteSouris(RenderWindow &app)
    {
        if (Mouse::isButtonPressed(Mouse::Left))
        {
            MD.ajouterBloc(app);
        }
    }
 

MapDisplay.cpp

#include <SFML/Graphics.hpp>

#include "MapDisplay.h"

#include <iostream>

using namespace std;
using namespace sf;

    MapDisplay::MapDisplay(int blocSize, int xMap, int yMap) :
        m_blocSize(blocSize), m_xMap(xMap), m_yMap(yMap)
    {
        mapArea[m_xMap][m_yMap];

        for (int y = 0 ; y < m_yMap ; y++)
        {
            for (int x = 0 ; x < m_xMap ; x++)
            {
                mapArea[y][x] = 0;
            }
        }
    }

    void MapDisplay::afficherMapConsole()
    {
        for (int y = 0 ; y < m_yMap ; y++)
        {
            for (int x = 0 ; x < m_xMap ; x++)
            {
                cout << mapArea[y][x];
            }
            cout << endl;
        }
    }

    void MapDisplay::ajouterBloc(RenderWindow &app)
    {
        position.x = Mouse::getPosition(app).x;
        position.y = Mouse::getPosition(app).y;

            for (int i = 0 ; i < m_yMap ; i++)
            {
                for (int c = 0 ; c < m_xMap ; c++)
                {
                    if ( i*50 == (position.y/m_blocSize)*m_blocSize
                        && c*50 == (position.x/m_blocSize*m_blocSize))
                        {
                            RectangleShape *b = new RectangleShape(Vector2f(50,50));
                            b->setPosition(Vector2f(c*50, i*50));
                            Cube.push_back(*b);
                        }
                }
            }
    }

    void MapDisplay::afficherMapWindow(RenderWindow &app)
    {
        for ( int i = 0 ; i < Cube.size() ; i++ )
        {
            app.draw(Cube[i]);
        }
    }

    int MapDisplay::getCubeSize() { return Cube.size(); }
    int MapDisplay::mouseX() { return position.x; }
    int MapDisplay::mouseY() { return position.y; }
 

Voilà, j'ai posté mes 3 fichiers CPP, je vous épargne les fichiers headers qui ne sont que de simples prototypes ainsi que les déclarations de mes variables utilisées dans mes méthodes.

Merci encore !!

71
Salut à tous,

Je bute sur un problème qui m'embête franchement depuis hier soir, alors voilà, j'ai une classe EventGestion qui contient une méthode ecouteSouris(RenderWindow &app)

Dans mon main, lorsque j'invoque cette méthode en lui passant la fenêtre de mon programme en argument, tout va bien mais... mon événement compris dans ma méthode ecouteSouris ( MD qui est donc une instance de ma classe MapDisplay que j'ai déclaré dans mon EventGestion.h ) semble ne pas prendre ce paramètre fenêtre en compte :

    void EventGestion::ecouteSouris(RenderWindow &app)
    {
        if (Mouse::isButtonPressed(Mouse::Left))
        {
            MD.ajouterBloc(app);
        }
    }

La méthode ajouterBloc(RenderWindow &app) de ma classe MapDisplay :

    void MapDisplay::ajouterBloc(RenderWindow &app)
    {
        position.x = Mouse::getPosition(app).x;
        position.y = Mouse::getPosition(app).y;
}

Lorsque je souhaite récupérer la position de ma souris avec des getters dans la boucle de mon Main, les coordonnées x et y restent à 0 comme si la fenêtre que j'ai tenté de passer en argument par l'intermédiaire de "ecouteSouris" n'était au final pas passée..

Merci [ Laurent ] & les autres de votre aide :-)

72
J'ai trouvé avec un TRES simple calcul ! :-D Si ça peut en aider certains.. ;-)

            position = Mouse::getPosition(app);
            box.setPosition(Vector2f((position.x/50)*50,0));
 

73
Salut à tous.
D'après-vous, comment pourrais-je m'y prendre afin d'avoir un cube qui suivrait la souris tous les 50 pixels ?
( Comme dans un éditeur de maps par exemple ), je voudrais que si mon cube est entre 0 et 50 qu'il soit en position X à 0, si il est entre 50 et 100, en position X à 50 etc... ? Pas de déplacement " fluide " quoi.

Des idées ? Merci à vous :-)

74
Général / Re : Erreur lorsque je lance l'exécutable de mon projet..
« le: Décembre 28, 2016, 10:50:10 pm »
Dieu merci, non, vous ne m'aviez pas donné toutes les solutions possibles car j'ai enfin trouvé comment résoudre ce problème au fin fond d'un lointain forum anglophone que j'ai trouvé par hasard sur google :-D

Merci quand même en tout cas.

Il suffisait simplement de copier-coller les DLL du répertoire "bin" de MinGW de Code::Blocks dans le dossier "bin" de mon projet ( au même endroit où sont placées les DLL SFML dont j'ai besoin pour le projet en cours en fait ).

75
Général / Re : Erreur lorsque je lance l'exécutable de mon projet..
« le: Décembre 26, 2016, 12:58:09 pm »
Salut les gars.. Je n'ai toujours pas trouvé de solution à ce problème...

Ma version de Code::Blocks : 16.01
Ma version de SFML : 2.4

Les projets se lancent sans aucun problème depuis l'IDE lorsque je les compile mais quand je veux lancer le même projet en passant par l'exécutable, rien ne va plus...

Voici concrètement le problème :

 

Merci à vous..

Pages: « Précédente 1 ... 3 4 [5] 6 Suivante »