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 - Thall206

Pages: [1]
1
Réseau / Paquet TCP incomplet
« le: Juin 01, 2019, 04:51:13 pm »
Bonjour,

Je me casse les dents sur un petit soucis, j'aimerais un simple programme serveur-client qui permet d'envoyer des messages, et afin de m'entraîner, j'utilise aussi le multi-threading c++11.

Seulement, voilà, pour je ne sais quel raison, les paquets reçus par le client sont incomplets (voir screen), après quelques recherches, je me rend compte que ça vient peut-être des paquets envoyés. Apparemment, lorsque que je fais
packet << cmd;
avec cmd qui est un string, le paquet ne contient pas tout le string contenu dans cmd.

Par le plus grand des hasards, quand je rajoute la ligne
std::cout << "Message original: " << cmd << std::endl;
juste avant, cela fonctionne, mais sans cette ligne, les messages reçus sont parfois incomplets, pourquoi?

Code du serveur émettant:

#include <SFML/Network.hpp>
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <stdlib.h>
#include <thread>



void sendString(const std::string &msg, std::unique_ptr<sf::TcpSocket> &client)
{
    sf::Packet packet;
    packet << msg;
    client->send(packet);
    packet.clear();

}


void thread_function(std::string *cmd)
{
    while(*cmd != "close")
    {
        if(*cmd == "")
        {
            std::cout << "Entrez votre commande: ";
            getline(std::cin, *cmd);
        }
    }
}


int main()
{
    std::string cmd = ""; //Gere les commandes

    sf::TcpListener listener;
    std::vector<std::unique_ptr<sf::TcpSocket>> clients;

    int iClient = 0;

    sf::Socket::Status status;

    clients.push_back(std::unique_ptr<sf::TcpSocket>(new sf::TcpSocket()));
    listener.listen(53000);
    listener.accept(*clients[iClient]);
    std::cout << "Connexion " << iClient+1 << " reussie !" << std::endl;
    sendString("Connexion reussie !", clients[iClient]);

    listener.setBlocking(false);


    std::thread threadObj(thread_function, &cmd);//Thread gerant les commandes de son côté

    clients.push_back(std::unique_ptr<sf::TcpSocket>(new sf::TcpSocket()));
    iClient++;

    while(cmd != "close")
    {

        if(listener.accept(*clients[iClient]) == sf::Socket::Done)
        {
            clients.push_back(std::unique_ptr<sf::TcpSocket>(new sf::TcpSocket()));
            sendString("Connexion reussie !", clients[iClient]);
            iClient++;
            std::cout << "Connexion " << iClient << " reussi !"<< std::endl;
        }

        if(cmd != "")
        {
//            std::cout << "Message original: " << cmd << std::endl; // <------ Ligne qui résout le soucis

            for(int i = 0; i < clients.size()-1; i++)
            {
                sf::Packet packet;
                packet << cmd;
                status = clients[i]->send(packet);
            }
            cmd = "";
        }

    }




    for(int i = 0; i < clients.size()-1; i++)
        sendString("Connexion over", clients[i]);

    threadObj.join(); //Attend que l'autre thread est fini avant de fermer le programme
    return 0;
}


 

Code du client recevant:

int main(){
    sf::TcpSocket socket;
    socket.connect("127.0.0.1", 53000);
    std::string msgrecu;


    while(msgrecu != "over")
    {
        sf::Packet packet;
        if(socket.receive(packet) == sf::Socket::Done)
        {
            packet >> msgrecu;
            std::cout << packet.getDataSize() << " : " << msgrecu << std::endl;
            packet.clear();

        }

    }

}

Merci bien de m'avoir lu, en espérant que j'ai été clair,

Bonne journée


2
Bonjour,

en programmant tranquillement, je me suis aperçu que certains de mes sprites dont leur texture sont tirés d'un fichier commun, et défini à l'aide d'un ".setTextureRect" avaient des "artefacts", des glitchs trainant sur le bord, et faisant apparaître des pixels situés en dehors du rectangle de texture. En faisant des tests, je suis tombé sur la conclusion que l'antialiasing créait ces petits pixels de trop lorsque le sprite subit une rotation (logique, faut bien avoir une diagonale pour avoir l'antialiasing opérant):



#include <SFML/Graphics.hpp>

#include <iostream>


int main()
{
    sf::Sprite sprite;

    sf::Texture texture;
    texture.loadFromFile("test.png");


    sprite.setTexture(texture);
    sprite.setTextureRect(sf::IntRect(21,21,21,21));


    sprite.setScale(15,15);
    sprite.setPosition(300,120);


    sf::ContextSettings settings;
    settings.antialiasingLevel = 8;

    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML works!", sf::Style::Default, settings);


    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
            sprite.setRotation(sprite.getRotation() + 0.1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
            sprite.setRotation(sprite.getRotation() - 0.1);
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
            sprite.setRotation(0);

        window.clear();
        window.draw(sprite);
        window.display();
    }

    return 0;
}
 



J'ai mis le code source ainsi que la texture utiliser pour les tests.
On peut voir que normalement, en position setRotation(0), la fenêtre est bien noire, mais quand on effectue une rotation sur le sprite, on voit apparaître des bords de pixel possédants la couleur des carrés adjacents au rectangle de texture défini.

Ma question finale est: Est-ce que j'ai mal fait quelque chose? Est-ce un bug connu ? (une fonctionnalité désirée comme j'ai pu lire pour d'autres sujets à propos de glitchs visuels)

Cordialement,
Merci de m'avoir lu, bonne journée !

3
Graphique / Carré blanc et changement d'adresse?
« le: Novembre 09, 2016, 01:46:22 am »
Bonjour, je pense que la réponse est simple, mais je ne suis pas sûr de comprendre entièrement mon erreur:

J'ai le problème du carré blanc, à l'affichage d'un sprite, l'erreur vient du fait que l'adresse de la texture bouge (et non détruite).

Dans mon objet (un tiles), on initialise le membre sf::Texture m_texture, qu'on applique directement au membre sf::Sprite m_sprite.
Sauf qu'à l'affichage de ce dit sprite, j'obtiens un carré blanc, l'erreur est vite corrigée si je réinitialise mon sprite dans le getter du sprite.

Ma question est simple: Pourquoi l'adresse de mon membre m_texture bouge d'une fonction à une autre ?(Dans le constructeur, c'est une certaine adresse, et dans mon getter, voire ailleurs, c'est une autre adresse, qui a l'air définitive)

Bien à vous, bonne soirée !

4
Général / Cinématiques?
« le: Octobre 23, 2013, 02:28:57 pm »
Bonjour ! Avec un ami, on compte se lancer dans un projet de jeux vidéos. Pour le moment, nous sommes à la conception sous forme d'idées, mais nous sommes bloqués sur "Comment faire pour les cinématiques" ? Vaut-il mieux utiliser un logiciel tier, et ensuite incorporer au jeu? Si oui, avec quel logiciel? Ou bien tout coder de A à Z avec des sprites?

Et par extention, pour les animations des personnages en général, vaut-il mieux coder le mouvement, ou bien faire une image avec différente position du sprite en mouvement?

Voilà, merci de m'avoir lu !

ps: C'est un jeu en 2D, donc aucune animation avec Blender ou Studio Max

5
Graphique / [Résolu] Crash avec utilisation de sf::Text et sf::Font
« le: Août 28, 2013, 07:32:17 pm »
Bonsoir, je code depuis quelque jour avec SFML, et jusqu'à maintenant, je n'ai eu aucun problème insolvable, mais là, je dois vous avouer que je bloque:

Pour des tests réseaux, j'ai besoin d'utiliser et sf::Text, donc je cours lire le tutoriel de la SFML en question, et malheureusement, j'ai beau appliqué à la lettre ce que je lis, je tombe irrémédiablement sur un crash ou une erreur:

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

using namespace std;
using namespace sf;


int main()
{
    RenderWindow fenetre(VideoMode(800,600), "Test");
    fenetre.setFramerateLimit(30);

    Font font;
    if(!font.loadFromFile("arial.ttf"))
    {
        cerr << "Erreur";
        exit(001);
    }

    Text text;
    text.setFont(font);
    text.setString("test");

    while(fenetre.isOpen())
    {
        Event event;
        while(fenetre.pollEvent(event))
        {
            if(event.type == Event::Closed)
                fenetre.close();
        }

        fenetre.clear(Color::White);
        fenetre.draw(text);
        fenetre.display();
    }

    return 0;
}
 

avec erreur de debugger:

Citer
#0 66A9909E   std::vector<unsigned char, std::allocator<unsigned char> >::_M_fill_insert(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned int, unsigned char const&) () (F:\Coding\C___CO~1\SFML\TESTRE~1\Client\bin\Debug\sfml-graphics-2.dll:??)

J'ai lu quelques sujets ayant un problème plus ou moins similaire, et aucun ne me ravi,
merci de m'avoir lu.

Pages: [1]
anything