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.


Sujets - Slash94

Pages: [1] 2 Suivante »
1
Graphique / Comment modifier un sprite pixel par pixel ?
« le: Octobre 23, 2017, 03:50:54 pm »
Salut à tous ! :-]

Alors voilà, je désirerais modifier un sprite pixel par pixel car je travaille actuellement sur une projection de perspective de type Mode 7 ( dans le même principe que du floor casting, j'ai exploré plusieurs pistes qui étaient plus ou moins fonctionnelles mais toujours soumis à quelques problèmes particulièrement gênants.. ).

Si l'un d'entre vous pourrait m'expliquer comment procéder, j'aurais une excellente idée pour procéder à ma projection tant désirée une fois que j'aurais une idée sur la manière dont je pourrais procéder afin de modifier mes sprites dans les moindres détails.

Merci à vous ;-)

2
Salut à tous,

J'aimerais savoir quelle théorie / méthode / algorithme me permettrait de créer un système de rotation de plusieurs sprites comme si ils étaient solidaires les uns des autres ?

Comme cet exemple :

https://www.youtube.com/watch?v=zDdAC0ZnVy8

(On s'en fiche du zoom, je parle de la rotation là ).

Car bien évidemment, si je modifie l'angle de chaque sprite dans une boucle, ils tourneront tous depuis leur centre ( leur origin quoi ), ce qui est logique, mais j'aimerais qu'ils tournent tous ensemble telle que sur la vidéo du dessus, une idée de la manière dont je pourrais réaliser ceci ? Merci :-)

3
Graphique / Erreur d'affichage très étrange à cause de math.h
« le: Octobre 14, 2017, 01:28:41 pm »
Salut à tous,

Je conçois en ce moment un système de projection basé sur le Mode 7.

Lorsque je décide d'inclure la librairie <math.h>, j'ai une erreur d'affichage grotesque, il n'y a que la moitié de mon rendu qui s'affiche :



Alors que lorsque je retire "#include <math.h>", tout se redraw parfaitement..



Je ne comprends absolument pas l'erreur.. Voici mon code :

#include <math.h>
#include <iostream>

#include <SFML/Graphics.hpp>

int main()
{
    unsigned int WIDTHSCREEN = 800, HEIGHTSCREEN = 600;

    sf::RenderWindow app(sf::VideoMode(WIDTHSCREEN, HEIGHTSCREEN), "Rotozoom", sf::Style::Titlebar);
    app.setFramerateLimit(60);

    sf::RenderWindow render(sf::VideoMode(WIDTHSCREEN, HEIGHTSCREEN), "Render", sf::Style::Titlebar);
    render.setFramerateLimit(60);

    sf::Clock clock;

    std::vector<sf::VertexArray>vecLines;
    std::vector<sf::VertexArray>vecQuads;

    sf::Vector2f m_position = {100,100};
    float angle = 0.0f;

    double speedMove = 20;

    for (unsigned int i = 0 ; i < HEIGHTSCREEN ; i++)
    {
        sf::VertexArray line(sf::Lines, WIDTHSCREEN);
        for (unsigned int k = 0 ; k < WIDTHSCREEN ; k++)
            line[k].position = {0, i};
        vecLines.push_back(line);
    }

    std::vector<std::vector<unsigned int>>vecMap =
    {
        {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
        {0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0}


    };

    unsigned int blocSize = 32;

    for (unsigned int y = 0 ; y < vecMap.size() ; y++)
    {
        for (unsigned int x = 0 ; x < vecMap[y].size() ; x++)
        {
            if (vecMap[y][x])
            {
                sf::VertexArray quad(sf::Quads, 4);
                quad[0].position = {x*blocSize, y*blocSize};
                quad[1].position = {x*blocSize+blocSize, y*blocSize};
                quad[2].position = {x*blocSize+blocSize, y*blocSize+blocSize};
                quad[3].position = {x*blocSize, y*blocSize+blocSize};

                for (unsigned int c = 0 ; c < 4 ; c++)
                    x%2 ? quad[c].color = sf::Color::Red : quad[c].color = sf::Color::Blue;

                vecQuads.push_back(quad);
            }
        }
    }

    double scale = 200;

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

        render.clear();

        for (unsigned int y = 0 ; y < HEIGHTSCREEN ; y++)
        {
            unsigned int l = 0;
            for (unsigned int x = 0 ; x < WIDTHSCREEN ; x++)
            {
                for (unsigned int i = 0 ; i < vecQuads.size() ; i++)
                {
                    double xDistance = abs(WIDTHSCREEN/2-x);

                    if (x==vecQuads[i][0].position.x && y>=vecQuads[i][0].position.y && y<= vecQuads[i][3].position.y)
                    {
                        vecLines[y][l].position.x = WIDTHSCREEN/2;
                        vecLines[y][l].position.y = y/2;
                        vecLines[y][l].color = vecQuads[i][0].color;

                        if (x<WIDTHSCREEN/2)
                            vecLines[y][l].position.x = x - (y*xDistance/scale);
                        if (x>WIDTHSCREEN/2)
                            vecLines[y][l].position.x = x + (y*xDistance/scale);
                        l++;
                    }

                    if (x==vecQuads[i][1].position.x && y>=vecQuads[i][0].position.y && y<= vecQuads[i][2].position.y)
                    {
                        vecLines[y][l].color = vecQuads[i][1].color;
                        vecLines[y][l].position.y = y/2;
                        vecLines[y][l].position.x = WIDTHSCREEN/2;

                        if (x<WIDTHSCREEN/2)
                            vecLines[y][l].position.x = x - (y*xDistance/scale);
                        if (x>WIDTHSCREEN/2)
                            vecLines[y][l].position.x = x + (y*xDistance/scale);
                        l++;
                    }
                }
            }
        }

        app.clear();

        for (auto& vvec : vecQuads)
            app.draw(vvec);

        for (auto& vvec : vecLines)
            render.draw(vvec);

        app.display();

        render.display();
    }
}
 

Si je retire le "math.h", ça projette sans problème ma perspective, si je l'inclu, la moitié ne s'affiche plus du tout..

Merci à vous !

4
Réseau / Détecter la déconnexion d'un client.
« le: Septembre 21, 2017, 07:20:50 pm »
Salut à tous !

Alors voilà, depuis un bon moment déjà, j'utilise une technique qui fonctionne mais qui n'est pas fiable :

Lorsque le client se déconnecte, il envoi un packet pour en avertir le serveur et celui-ci agit en conséquence, néanmoins... si le client se déconnecte " salement " ( genre il ferme le programme via le processus ou le quitte en fermant la console d'un coup ou encore si sa connexion internet a soudainement un problème ), évidemment, la détection ne se fait pas.

Il y a plusieurs mois de cela, j'avais testé une méthode qui fonctionnait à merveille avec sf::Socket::Status mais impossible de retrouver le lien du topic et depuis une petite heure, j'essaye de retrouver la méthode, en vain.

J'ai essayé comme ceci, mais si je ferme le client d'un coup, le serveur ne détecte rien, hors, je sais que c'est parfaitement possible pour l'avoir expérimenté quelques mois auparavant grâce à la méthode énoncée dans ce fameux topic introuvable..

void Network::receiveData()
{
    ///SI UN CLIENT SE DECONNECTE///
    if (m_vecTempSocket.size()>0)
    {
        for (unsigned int i = 0 ; i < m_vecTempSocket.size() ; i++)
        {
            sf::Packet exitPacket;
            if (m_vecTempSocket[i]->receive(exitPacket) == sf::Socket::Status::Disconnected)
            {
                std::cout << "Le client est parti." << std::endl;
                m_vecTempSocket.erase(m_vecTempSocket.begin()+i);
            }
        }
    }
}
 

Je vous pose donc la question, ayant perdu de vue cette méthode qui était par ailleurs très simple.. c'est très frustrant !

Merci à vous ;-)

5
Salut à tous :-]

Depuis environ 3 semaines, je travaille de A à Z à la construction d'un moteur de raycasting, actuellement j'ai déjà terminé les choses suivantes, comme je l'ai mentionné dans le descriptif de ma vidéo :

-Ombrages des côtés latéraux
-Correction de la distorsion visuelle "Fisheye effect"
-Amélioration de la résolution des textures (64*64 au lieu de 32*32)
-Ouverture / Fermeture dynamique des portes
-Affichage de sprites simples & de sprites multifaces sur 8 angles différents

Le FPS oscille entre 55 et 60 , la capture vidéo l'a un peu saccadé mais IRL c'est parfaitement fluide.

Comme pour mon précédent projet, Zelda Arena Online, le jeu sera jouable à 4 en chacun pour soi / en deathmatch.

Voici mon projet au stade où il en est actuellement :

https://www.youtube.com/watch?v=0JzpYtnkdV4

J'ai tout septembre en vacances, donc je devrais devoir avancer le projet assez vite, je vous tiendrais au courant ici au fur & à mesure de l'avancement :-)

Si vous avez des idées / suggestions, n'hésitez pas !

6
Projets SFML / Série de tutoriaux sur le Raycasting avec la SFML.
« le: Septembre 04, 2017, 10:34:26 am »
Salut à tous !

J'ai publié ce matin le premier volet d'une série de plusieurs vidéos qui seront dédiées au Raycasting, n'ayant moi-même trouvé aucun tuto en français là-dessus, j'ai décidé de franchir le cap et d'en produire si ça peut intéresser & aider des gens ici :-]

https://www.youtube.com/watch?v=F-Z3qLSLOOw

Si vous avez des questions, je suis là pour ça !

7
Projets SFML / [Vidéo]Zelda Arena Online 2D
« le: Août 15, 2017, 12:32:48 pm »
Salut à tous :-)

Voici mon projet jouable à 4 : https://www.youtube.com/watch?v=qPgxeJA-l20&t=5s

Je compte l'améliorer ultérieurement, il est fonctionnel dans l'ensemble, si vous voulez les sources, n'hésitez pas à me demander !

Merci de me dire ce que vous en pensez :-)

8
Graphique / Besoin d'aide pour un calcul d'intersection..
« le: Juillet 23, 2017, 01:21:48 pm »
Salut à tous :-)

Je viens vous voir car j'aimerais que vous me donniez la logique qui me permettrait de détecter si un carré est dans un champ de ligne..

Je m'explique, je souhaiterais faire en sorte que lorsque le rayon passe par le carré, que celui-ci devienne rouge et qu'il redevienne blanc lorsque ce n'est plus le cas, cela me semblait d'une simplicité enfantine à mettre en place, d'ailleurs ça doit être le cas sur le plan pratique, mais sur le plan calcul, je suis un peu perdu..

Idée du rendu que j'aimerais obtenir en collision ( mon code ne marche pas, j'ai colorié en rouge sur paint pour vous donner l'idée )



Hors collision :



Voici mon code ( il est dégueulasse et en un seul bloc, c'est juste un code de test à l'arrache pour trouver cet algo, justement !)

#include <iostream>
#include <math.h>
 
#include <SFML/Graphics.hpp>
 
const float PI = 3.14;
 
int main()
{
    sf::RenderWindow renderWindow(sf::VideoMode(800,600,32),"Raycasting Attempt", sf::Style::Titlebar);
    renderWindow.setFramerateLimit(60);
 
    ///COORDONNEES DU TRIANGLE///
    float pic = 15;
 
    ///VITESSE DE DEPLACEMENT///
    float speed = 3;
 
    ///POSITION DU TRIANGLE ET SON DIFFERENTIEL
    sf::Vector2f tPos;
    sf::Vector2i diff;
 
    sf::ConvexShape triangle(3);
 
    triangle.setPoint(0, sf::Vector2f(pic,NULL));
    triangle.setPoint(1, sf::Vector2f(pic*2,pic*2));
    triangle.setPoint(2, sf::Vector2f(NULL,pic*2));
 
    triangle.setOrigin(sf::Vector2f(pic, pic));
 
    ///LA LIGNE DE PROJECTION///
    sf::Vertex lineProjLeft[] =
    {
        sf::Vertex(sf::Vector2f(0,0)),
        sf::Vertex(sf::Vector2f(150,150))
    };
 
    ///LE CARRE DE TEST///
    sf::ConvexShape quad(4);
 
    quad.setPoint(0, sf::Vector2f(0,0));
    quad.setPoint(1, sf::Vector2f(25,0));
    quad.setPoint(2, sf::Vector2f(25,25));
    quad.setPoint(3, sf::Vector2f(0,25));
 
    quad.setPosition(sf::Vector2f(200,200));
 
    while (renderWindow.isOpen())
    {
        sf::Event event;
        while (renderWindow.pollEvent(event))
        {
            switch(event.type)
            {
            case sf::Event::Closed:
                renderWindow.close();
                break;
            case sf::Event::KeyReleased:
                if (event.key.code == sf::Keyboard::Escape)
                    renderWindow.close();
            break;
            }
        }
 
        ///DEPLACEMENT FLECHES///
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            tPos.y-=speed;
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
            tPos.y+=speed;
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
            tPos.x-=speed;
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
            tPos.x+=speed;
 
        lineProjLeft[0].position.x = tPos.x;
        lineProjLeft[0].position.y = tPos.y;
 
        triangle.setPosition(tPos);
 
        ///CALCUL DU DIFFERENTIEL POUR L'ANGLE///
        diff.x = sf::Mouse::getPosition(renderWindow).x - tPos.x;
        diff.y = sf::Mouse::getPosition(renderWindow).y - tPos.y;
 
        float angle = (atan2(diff.x, diff.y)) * 180 / PI;
 
        triangle.setRotation(-(angle+180));
 
        lineProjLeft[1].position.x = sf::Mouse::getPosition(renderWindow).x;
        lineProjLeft[1].position.y = sf::Mouse::getPosition(renderWindow).y;
 
        if (lineProjLeft[1].position.x > quad.getPosition().x && lineProjLeft[0].position.x < quad.getPosition().x
            && lineProjLeft[1].position.y > quad.getPosition().y && lineProjLeft[0].position.y < quad.getPosition().y +25)
        {
            quad.setFillColor(sf::Color::Red);
        } else {
            quad.setFillColor(sf::Color::White);
        }
 
        renderWindow.clear();
 
        renderWindow.draw(triangle);
        renderWindow.draw(lineProjLeft, 2, sf::Lines);
        renderWindow.draw(quad);
 
        renderWindow.display();
    }
}

La longueur de la ligne dépend de la position de la souris, si vous avez AUSSI une idée également de comment stopper la longueur de la ligne dés qu'il rencontre le cube, je suis preneur, mais ce n'est pas ma préoccupation première ( celle-ci étant celle que j'ai mentionné au début ! )

Merci à vous pour votre précieuse aide :-)

9
Réseau / Problème de réception de données côté Client..
« le: Juin 29, 2017, 10:13:42 pm »
Salut à tous !

Alors voilà, je viens vous voir car j'ai un soucis particulièrement agaçant et je n'arrive absolument pas à en identifier la cause, en effet, lorsque j'envoi une information au serveur depuis mon Client, elle arrive parfaitement à destination.

Je procède de la sorte :

if (structData.xPos != m_mainPlayer.getPosition().x)
{
structData.xPos = m_mainPlayer.getPosition().x;
sf::Packet sendPacket;
sendPacket << DATA::XPOS << structData.xPos;
m_socket.send(sendPacket);
}

Le serveur reçoit parfaitement ma variable " structData.xPos " et bien entendu, grâce à l'enum DATA::XPOS préfigurant dans le packet, il identifie clairement à quoi correspond cette donnée.

Je réceptionne le packet comme suit :



    for (UINT i = 0 ; i < Clients.size() ; i++)
    {
        if (Clients[i].getIdNumber() != 0)
        {
            if (m_socketSelector.isReady(*Clients[i].getSocket()))
            {
                sf::Packet receivePacket;

                 if (Clients[i].getSocket()->receive(receivePacket) == sf::Socket::Done)
                {
                    UINT checkData;
                    receivePacket >> checkData;
                       
                    switch(checkData)
                    {
                    case DATA::XPOS:
                    {
                        float xPos;
                        receivePacket >> xPos;
                        Clients[i].setxPos(xPos);
                        std::cout << "xPos vaut : " << xPos << std::endl;
                        sf::Packet sendPacket;
                        sendPacket << INFO << "Le serveur a reçu votre position X ! ";
                        Clients[i].getSocket()->send(sendPacket);
                    }
                    break;
                    }
                }
            }
        }
    }

 

Et ça marche sans aucun problème si je renvoi l'information au client TOUT DE SUITE après grâce à mon packet sendPacket, le client reçoit bien la phrase "Le serveur a reçu votre position X ! ".

MAIS car oui il y a un MAIS, si je veux envoyer DIRECTEMENT une information à mon client sans que celui-ci m'est au préalablement envoyé un paquet comme par exemple :

sf::Packet sendPacket;
sendPacket << DATA::INFO << "Salut!";
Clients[i].getSocket()->send(sendPacket);
 

Mon client ne reçoit pas la phrase :-( il reçoit bien l'énumération qui indique qu'il s'agit de DATA::INFO mais la string sensée recevoir "Salut !" est vide....

Et pareil avec un booléen, un entier ou autre...
Pourquoi cette perte de données soudaine ?

Donc mes questions sont les suivantes :

-Comment je pourrais faire afin d'envoyer une information à un Client sans que celui-ci m'est envoyé d'abord un packet ?

-Pourquoi mon Client reçoit-il correctement l'énumération mais pas son contenu, alors que lorsque je procède à un renvoi direct après une réception, cela fonctionne ?


Merci infiniment car là, je suis complètement largué pour le coup.... ça me semble illogique comme problème...

10
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;
    }
}
 

11
Graphique / Problème de taille de caractère lors de l'affichage..
« le: Avril 22, 2017, 02:15:07 pm »
Salut à tous !

Alors voilà, j'essaie de faire un système de bulle de dialogue qui s'adapte à la longueur de mon texte..

Lorsqu'il s'agit de la lettre a, c'est parfait, l'alignement des lettres et l'écartement de la bulle de dialogue restent parfaits !

Néanmoins, lorsque j'emploi la lettre i, la bulle de dialogue grandit beaucoup plus qu'il ne le faudrait et à l'inverse, la lettre w a tendance à très vite dépasser la bulle hors de ses zones...

Voici une illustration afin de poser le problème ici concrètement :



Je suis totalement conscient que chaque lettre est entourée d'un rectangle invisible qui définit ses bordures mais j'aimerais garder un espacement identique pour chaque lettre de l'alphabet de manière à ce que ça ne foire pas mon calcul de taille de bulle... Comment pourrais-je m'y prendre ? Quelle(s) portion(s) de code appartenant à sf::Text pourrait m'aider ?

PS : J'ai cru comprendre que sf::Glyph pourrait m'aider mais aucune idée de son utilisation pour résoudre mon problème..

Merci à tous & Salut à Laurent au passage ;-)

12
Général / Besoin de conseils pour protéger mes fichiers maps.
« le: Mars 29, 2017, 09:42:27 pm »
Salut à tous :-]

Alors voilà, mon projet avance à grands pas et j'aimerais que vous me donniez des solutions afin de protéger ( au mieux, du moins ) mes fichiers maps de manière à ce qu'ils ne soient pas facilement modifiables.

Si j'ai un fichier .map avec, admettons, l'architecture suivante :

00 42 00 48 00 48 48 48 00
00 14 00 17 00 00 00 52 52

Ou chaque nombre représenterait un tile différent.

Le joueur pourrait très aisément modifier la map à sa guise.

Donc dans un premier temps, que me conseillerez-vous pour la rendre illisible ? Je dis par là, la crypter.
Un cryptage xor ? Sinon j'ai entendu parler d'un module "regex", ça pourrait être intéressant à utiliser ?

Ensuite, je ferais en sorte que lorsque le client se connecte au jeu et qu'il change de map, que le nombre de caractères soit vérifié par rapport à une base de données dans laquelle je stockerais les différentes tailles de chaque fichier map comme suit par exemple:

Map1 : 64
Map2 : 47
Map3 : 58

etc.. ( en Octets, du coup ! )

Si ce nombre est modifié d'un seul iota, le programme retéléchargera la map sur un serveur FTP incognito pour remettre la map d'origine dans le répertoire /maps, bonne idée ou pas ?

Comment sécuriser au mieux mes maps ? Même si c'est pas infaillible et ultra-complexe mais déjà, rendre la tâche plus difficile aux petits malins du dimanche.

Merci à vous tous !
( Salut à toi Laurent, au passage :-) )

13
Réseau / Serveur / Client.. Comment faire une bonne gestion ?
« le: Mars 17, 2017, 04:00:35 pm »
Salut à tous,

Je viens vous voir car j'aurais besoin de renseignements sur le déroulement d'un bon système de gestion de serveur/clients.

Alors voilà, j'ai un serveur qui peut accueillir, admettons 8 clients, bon, ce n'est pas la question, mais voilà, je voudrais savoir s'il est plus judicieux que chaque client possède dans un sous dossier les maps à charger et que ce soit le client qui gère les collisions, la lecture des fichiers MAPS etc ou bien si il serait plus avantageux que ce soit le serveur qui calcule tout ça et qui renverrait les informations propres à chaque client

collison : OUI / NON
envoi sous forme de boucle (x/y) les coordonnées de la map aux clients pour l'affichage des tiles

etc.

Quelle serait la manière la plus optimisée et la plus intelligible selon vous ?

Merci !

14
Graphique / Besoin d'aide pour un simple calcul de pourcentage..
« le: Mars 09, 2017, 02:59:57 pm »
Salut à tous :-)

Je viens à vous car j'aimerais faire quelque chose qui, je pense, paraîtra particulièrement simple pour la plupart d'entre vous..

Par exemple, admettons que j'ai une barre de vie sous forme d'un RectangleShape qui fasse 40 pixels de longueur.
Ma vie, elle, est à ... disons 140 HP.

Si je prends 12 points de dégâts, nous sommes d'accord qu'il ne me restera plus que 128 HP..
Mais comment faire pour que ma barre de vie qui fait 40 pixels diminue EN FONCTION des dégâts reçus en ayant pour référence ma vie maximale ( soit 140 HP ) J'aimerais que ma barre de vie diminue en fonction de ces paramètres pour que ça soit cohérent..

Merci à vous :-)

15
Salut à tous,

Alors voilà, j'ai un problème [TRES] simple à priori, ( sur la forme du moins )....

J'ai une classe "player" qui contient une texture     sf::Texture texSoldier; dans mon fichier prototype, je load la texture dans mon constructeur, tout s'affiche très bien une fois exécuté... mais voilà, dés que je crée une SECONDE texture dans mon prototype, genre sf::Texture texAim; et que je charge une image sur cette texture, plus rien ne s'affiche lorsque j'exécute mon programme... Ni même mon sprSoldier avec sa texture..
Là je dois avouer ne pas du tout comprendre ce qui peut bien se passer...
Idem lorsque je souhaite charger plus d'une texture dans une autre classe, mon sprite soldier ne s'affiche pas non plus !!

Merci de votre précieuse aide..

EDIT : Même problème avec les sprites..

Pages: [1] 2 Suivante »