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

31
Graphique / Petite question sur la boundingbox des sprite.
« le: Août 27, 2013, 06:12:24 pm »
Salut,
J'ajoute en fait les tiles dans une grille en fonction des 4 coins du sprite, si par exemple, un coin du sprite est dans une cellule de la grille, j'ajoute le sprite dans la cellule. (un même sprite peut être dans plusieurs case de ma grille à la fois.)

Mais lors d'une rotation ou d'un changement d'échelle la position des 4 coins du sprite changent de place.

Ma question est, est ce que le globalBound se remet bien à jour dans ce cas là ?



32
Salut,

j'ai une classe EntitéDessinable qui hérite de sf::Drawable et sf::Transformable.
De là en dérive une classe Tile qui contient et sprite et d'autres classes.

Je voudrai faire en sorte qu'on puisse modifier la géométrie à partir de cette classe EntitéDessinable et faire un draw directement sur un objet de type EntitéDessinable afin d'éviter de devoir à chaque fois vérifier le type d'entité et de faire un cast avant de dessiner.

Je voudrais aussi éviter de devoir modifier mon code, c'est à dire remplacer mon sf::Sprite par un sf::VertexArray.

Mais je n'ai trouvé aucune moyen de redéfinir la méthode draw en appliquant une transformation directement à un sprite, j'ai essayé ceci mais ça ne marche pas :

void Tile::draw (RenderTarget &target, RenderStates states) const {
    states.transform = getTransform();
    target.draw(sprite, states);
}
 

Même en appelant setPosition dans le constructeur de ma classe tile pour mettre à jour la position du sprite dans la classe sf::Transformable, le sprite ne s'afficher pas.

Que dois je faire ???

33
Général / Classe dérivant de Socket ?
« le: Août 25, 2013, 11:16:19 am »
Salut je voudrais juste savoir si ce serait possible de faire une classe SocketSSL dérivant de la classe Socket dans mon projet ???

Merci.

PS : si oui je crois que je vais copier sur la classe TcpSocket mais en utilisant en plus le chiffrement SSL.

Bien que avec la dérivation de la classe sf::Packet et de onSend et onReceive se sera peut être pas nécessaire, je sais pas vraiment ce qu'il est mieux de faire. :/ (Un type de socket par protocol ou un type de paquet par protocol ??? )

34
Général / [SFML2.1] Erreur en compilation.
« le: Août 14, 2013, 09:26:21 pm »
Salut, dès que je suis passé à la SFML 2.1 j'ai une belle erreur en compilation :
obj\Debug\GraphicEngine\qSFMLcanvas.o:qSFMLcanvas.cpp:(.rdata$_ZTV11QSFMLCanvas[__ZTV11QSFMLCanvas]+0x138)||undefined reference to `non-virtual thunk to sf::RenderWindow::getSize() const'|
obj\Debug\GraphicEngine\qSFMLcanvas.o:qSFMLcanvas.cpp:(.rdata$_ZTV11QSFMLCanvas[__ZTV11QSFMLCanvas]+0x13c)||undefined reference to `non-virtual thunk to sf::RenderWindow::activate(bool)'|
||=== Build finished: 2 errors, 39 warnings (0 minutes, 48 seconds) ===|
Y'a t'il encore des choses qui ont changée niveau implémentation ?
Je pensais que c'était juste une correction de bug.

35
Salut,

Je développe actuellement un projet, basé sur un frawework que je gère grâce à la SFML, Qt, openssl, gmp, boost et d'autres librairies. (Le framework possèdera un petit éditeur de jeux RPG en 2D dimétrique.
Le moteur graphique du jeux est en 2D dimétrique pour être correct. (3D isométrique par abu de langage.)

Mon framework possède les avantages suivants :

-Un moteur de lumière et d'ombre.
-Une grille pour stocker et récupérer toutes les entités qui sont dans la partie du monde qui est visible à l'écran de manière rapide.
-Un design de code bien conçu : (Des conteneurs pour accéder aux systèmes et aux composants, des systèmes pour mettre à jour les composants et charger ou libérer des ressources, des composants et des entités qui peuvent hériter de une ou plusieurs interfaces si elles sont dessinable, transformable, etc...)
-Le framewok utilise les avantages du c++11. (multi-threadé utilisant les primitives de syncrhronisation du c++11 avec un thread pour la mise à jour des entités animées ainsi que pour la récupération de tout ce qui est visible à l'écran, un thread pour l'affichage et la gestion d'évènement (le main à cause des limitations de l'os), un thread pour l'IA et la physique et un dernier pour la communciation réseau.)
-La synchronisation verticale pour éviter de bouffer trop de CPU et d'avoir un effet de tiring.
-Un éditeur de map qui possèdera en plus (quand j'aurai le temps de le faire.) un éditeur d'animation, un éditeur de quêtes, un éditeur de sors, etc...
-Et pleins d'autres avantages que vous découvrirai par vous même.

J'ai encore quelques petites choses à améliorer au niveau du code pour que ce soit vraiment parfait.

Le projet en est plus au moins à la moitié il reste à améliorer un peu le design du code pour vraiment profiter de toutes les nouveautés de la SFML2, car, j'ai commencé le projet avec la SFML1.6 donc...
Et encore quelques petites choses à rajouté au niveau du gameplay (les quêtes, les objets/l'équipement, les compétences, le tchat et la minimap.) ainsi que le son que je n'ai pas encore testé avec la SFML mais que je ne vais pas tarder à tester.

Je déciderai en fonction de ma situation financière si je peux le rendre opensource ou si je rend commercial pour essayer de percer dans le monde professionnel. (Vente, pub, etc...)

J'ajouterai quelques images et vidéos par la suite avec le FPS en haut de l'écran pour prouver mes dires. :) (Mais il faut que je trouve un bon logiciel pour filmer qui ne saccade pas trop on verra si ça va mieux maintenant que j'ai passé ça en multi-thread.  :) )

Mais au niveau des graphismes je sèche pas mal vu que ce n'est pas vraiment mon domaine, mon point fort c'est plutôt le côté tehncique donc, ne vont attender pas à des personnages, monstres et animations formidables. :/

36
Général / SFML et thread du c++11.
« le: Août 11, 2013, 10:15:29 pm »
Salut, j'ai testé un code pour faire l'affichage et gestion d'évènement dans un thread, et le rendu dans un autre thread, avec les thread du c++11, mais celà ne marche pas, voici le code :

Thread d'affichage :
#ifndef DISPLAYER
#define DISPLAYER
#include "updater.h"
#include <iostream>
class RenderComponent {
public :
    RenderComponent();
    void start();
    void run();
    void setActive(bool b);
private :
    sf::RenderWindow window;
    std::thread m_thread;
    Updater updater;
    bool running;
};
#endif // DISPLAYER
 
#include "displayer.h"
using namespace std;
using namespace sf;
RenderComponent::RenderComponent () : updater(*this), window (sf::VideoMode(800, 600), "My window") {
    running = false;
}
void RenderComponent::setActive(bool b) {
    window.setActive(b);
}
void RenderComponent::start() {
    updater.start();
    running = true;
    m_thread = thread (&RenderComponent::run, this);
}
void RenderComponent::run() {
     // création de la fenêtre

    while (running) {
        // on fait tourner le programme tant que la fenêtre n'a pas été fermée
        while (window.isOpen())
        {
            // on traite tous les évènements de la fenêtre qui ont été générés depuis la dernière itération de la boucle
            sf::Event event;
            while (window.pollEvent(event))
            {
                // fermeture de la fenêtre lorsque l'utilisateur le souhaite
                if (event.type == sf::Event::Closed) {
                    window.close();
                    running = false;
                    m_thread.join();
                }
            }

            // effacement de la fenêtre en noir
            /*unique_lock<mutex> locker(g_lock_update_component);
            g_signal.wait(locker, [&](){return !updater.isGDone();});*/


            window.clear(sf::Color::Black);
            window.draw(updater.getRectangle());
            window.display();
        }
    }
}
 
Thread de rendu :
#ifndef UPDATER
#define UPDATER
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <thread>
#include "globals.h"
#include <random>
class RenderComponent;
class Updater {
public :
    Updater(RenderComponent &renderComponent);
    void start();
    void stop ();
    void run();
    bool isGDone();
    sf::RectangleShape getRectangle ();
private :
    std::thread m_thread;
    sf::RectangleShape rectangle;
    bool running, gDone;
    RenderComponent &renderComponent;
};
#endif // UPDATER

[code=cpp]
#include "updater.h"
#include "displayer.h"
using namespace std;
using namespace sf;
Updater::Updater(RenderComponent &renderComponent) : renderComponent (renderComponent) {
    rectangle = RectangleShape(Vector2f(0, 0));
    rectangle.setSize(Vector2f(100, 100));
    running = gDone = false;
}
bool Updater::isGDone() {
    return gDone;
}
void Updater::start() {
    running = true;
    m_thread = thread (&Updater::run, this);
}
void Updater::stop() {
    running = false;
    m_thread.join();
}
void Updater::run() {
    while (running) {
        /*renderComponent.setActive(false);
        unique_lock<mutex> locker(g_lock_update_component);*/

       renderComponent.setActive(false);
        gDone=false;

        int posX = rand() % 800;
        int posY = rand() % 600;
        rectangle.setPosition(posX, posY);
        gDone = true;
        renderComponent.setActive(true);
       // g_signal.notify_one();
    }
}
RectangleShape Updater::getRectangle () {
    return rectangle;
}
 
Et le main :
#include "displayer.h"
#include <random>
#include <ctime>
int main () {
    srand(time(NULL));
    RenderComponent renderComponent;
    renderComponent.start();
    return EXIT_SUCCESS;
}
 

Il m'affiche le message suivant en console : Failed to activate the window's context.


37
Suggestions de nouvelles fonctionnalités / setPosition et setCenter ?
« le: Août 05, 2013, 09:06:23 am »
Salut,
j'ai besoin de positionner la tile parfois à partir du coin supérieur gauche, et parfois à partir de son origine, j'ai donc fait une classe Tile qui contient une variable membres sprite et fait ceci :

void Tile::setPosition(Vec2f pos) {
    Entity::setPosition(Vec2f(pos.x, pos.y));
    sprite.setPosition(Vec2f(sprite.getPosition().x - this->getSize().x * 0.5f, sprite.getPosition().y - this->getSize().y * 0.5f));
}
void Tile::setCenter(Vec2f center) {
    Entity::setCenter(center);
    sprite.setPosition(Vector2f(center.x, center.y));
}
 

Donc je ne peux pas utiliser sf::transormable en interne vu que elle ne possède qu'une méthode pour positionner la tile à partir de son origine.
Dans mon cas c'est simple vu que l'origine c'est le centre de la tile. (Mais ça ne pourrait pas toujours être le cas.)

Serait il possible de rajouter une telle méthode qui positionne les entité à partir de leur coin supérieur gauche, ou bien, dois je utiliser la classe sf::Transform en interne ?

PS : par contre pour les get, pas de problème, vu que y'a getGlobalBounds.  :D

38
Général / SFML et mingw4.8.1
« le: Juillet 30, 2013, 11:15:28 am »
J'ai enfin réussi a compiler mon projet avec mingw4.8.1, mais, maintenant, j'ai un crash à l'exécution :

#0 0043AD2B sf::SocketSelector::SocketSelector() () (??:??)
#1 004290A4 SrkServer::SrkServer(this=0x1444b40, nbChannels=1) (D:\Projets-c++\SorrokSrv\NetworkEngine\srkserveur.cpp:8)
#2 004D4E83 Network::getServerInstance() (D:/Projets-c++/SorrokSrv/NetworkEngine/network.h:45)
#3 00421008 __static_initialization_and_destruction_0(__initialize_p=1, __priority=65535) (D:\Projets-c++\SorrokSrv\NetworkEngine\network.cpp:7)
#4 00421070 _GLOBAL__sub_I__ZN7Network2dbE() (D:\Projets-c++\SorrokSrv\NetworkEngine\network.cpp:608)
#5 004CCD6A __do_global_ctors () (??:??)
#6 40000060 ?? () (??:??)
#7 00000031 ?? () (??:??)
#8 01443960 ?? () (??:??)
#9 755F33AA KERNEL32!BaseCleanupAppcompatCacheSupport() (C:\Windows\syswow64\kernel32.dll:??)
#10 0028FFD4 ?? () (??:??)
#11 76ED9EF2 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#12 7EFDE000 ?? () (??:??)
#13 76ED9EC5 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#14 004014E0 WinMainCRTStartup () (??:??)
#15 7EFDE000 ?? () (??:??)
#16 ?? ?? () (??:??)

Je ne sais pas si tu as déja testé la SFML avec mingw4.8.1 mais chez moi ça ne tourne pas.

39
Système / Comment bien utiliser les mutex ?
« le: Juillet 24, 2013, 01:05:00 pm »
Salut,

il y a un crash avec les sf::thread lorsque l'on récupère des variables dans le constructeur d'une classe qui instancie un sf::thread mais le problème ne survient qu'avec des méthodes statique qui renvoie une variable qui doit être partagée entre plusieurs thread.

SrkChannel::SrkChannel(SrkServer &server, string name) : server(server), name (name), thread (&SrkChannel::run, this)
{
    this->map = World::getMap("Map test");
    ...
}
 

Ca plante dans la fonction exécutée par mon thread, le débugueur ne me donne pas plus d'infos que ça, il me dis juste que ça plante lorsque le sf::thread exécute la fonction, lorque je veux utiliser la variable, ça plante dans la fonction entryPoint du fichier ThreadImpl.
#0 00436578 CellMap::getCenter(this=0xabababab) (D:\Projets-c++\SorrokSrv\world\mapCell.cpp:91)
#1 00434A8C GridMap::getPath(this=0x2f700e0, startPos=..., finalPos=...) (D:\Projets-c++\SorrokSrv\world\gridMap.cpp:425)
#2 00422FED SrkChannel::run(this=0x3014c28) (D:\Projets-c++\SorrokSrv\NetworkEngine\srkchannel.cpp:77)
#3 004CE8CD sf::priv::ThreadMemberFunc<SrkChannel>::run(this=0x2f7f220) (C:/SFML-2.0/include/SFML/System/Thread.inl:58)
#4 004A0297 sf::priv::ThreadImpl::entryPoint () (??:??)
#5 75861287 msvcrt!_itow_s() (C:\Windows\syswow64\msvcrt.dll:??)
#6 75861328 msvcrt!_endthreadex() (C:\Windows\syswow64\msvcrt.dll:??)
#7 749633AA KERNEL32!BaseCleanupAppcompatCacheSupport() (C:\Windows\syswow64\kernel32.dll:??)
#8 06EBFFD4 ?? () (??:??)
#9 77189EF2 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#10 00DE70D0 ?? () (??:??)
#11 77189EC5 ntdll!RtlpNtSetValueKey() (C:\Windows\system32\ntdll.dll:??)
#12 758612E5 msvcrt!_endthreadex() (C:\Windows\syswow64\msvcrt.dll:??)
#13 ?? ?? () (??:??)

Y'a moyen de contourner le bug en récupérant l'objet dans une autre fonction que celle qui instancie le thread.

Bref faudrait que je poste ça dans les rapports de bugs avec un code tout bête qui reproduit le bug, peut être que certains pourront le corriger, moi, je pencherai plutôt pour une mauvaise initialisation de variables statiques partagées entre plusieurs threads.
PS : je pense que j'avais déjà eu ce bug plus tôt.
PS 2 : je voulais même passé au c++11 à cause de ça mais bon j'arrive pas à le faire marcher.

40
Discussions générales / Juste une question.
« le: Juillet 11, 2013, 11:19:12 am »
L'argent des dons, il sert à quoi ? Financer l'hébergement du site ?
Ça m'étonnerait que la somme soi assez important pour payer des développeurs pros.

41
Voila je voudrais savoir si il serait possible (vu que tu utilises opengl) de faire comme le fait opengl c'est à dire définir un ordre d'affichage par vertex pour que certaines tiles d'une tilemap soient affiché avant ou après certaines tiles d'une autre tilemap.

Merci de votre réponse.

42
Salut,
Les appels successif à Draw saccadent à mort l'affichage de mes animations surtout.
Cela fait longtemps que je cherche une méthode pour faire l'équivalent de ce que font les VertexArray ou encore les vertex buffer objects avec openGL mais en vain, la tilemap dans l'exemple de la SFML permet de faire la même chose mais avec un seul tilset hors moi, mes tiles sont répartie sur plusieurs tilesets différents.

Au sinon, je dois faire, une tile map par couche mais bon il se pourra surement que plus tard j'utilise plusieurs tileset par couche, je ne sais pas...
Il n'y a pas moyen de faire une genre de méthode bindTexture pour chaque quad du tableau de  vertex comme le fait openGL ?

PS : les rendertexture sont bien mais le problème c'est qu'il faut aussi faire plusieurs appel à draw et passé les états opengl à chaque fois ce qui rend le code source hyper lent!

Merci d'avance pour votre réponse.

43
Salut, j'ai fait un test avec du code, mais j'ai toujours un caractère en trop au début du paquet que j'envoie, voici ce que je fait dans la fonction onSend :
 const char* datas = static_cast<const char*> (getData());
    buffer.assign(datas, datas + getDataSize());
    vector<char>::iterator it;
    string message;
    for (it = buffer.begin(); it != buffer.end(); it++)
         message += *it;
    cout<<"Message : "<<message<<endl;
    for (unsigned int i = 0; i < message.size(); i++)
        buffer.push_back(message.at(i));
    dataSize = buffer.size();
    return &buffer[0];
 
Lorsque j'affiche le message en console il me rajoute à chaque fois un caractère en trop dans le début du message.

44
Réseau / Problème avec les sélectors.
« le: Juin 18, 2013, 04:08:39 pm »
Salut, alors je vais mettre un code simple et minime cette fois : lorsque j'exécute ça côté serveur :
code du serveur :
if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(listener);
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(listener)) {

                TcpSocket *client = new TcpSocket();
                if (listener.accept(*client) == Socket::Done) {
                    cout<<"Client connected"<<endl;
                    selector.add(*client);
                    clients.push_back(client);
                }
            } if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    socketUDP.send(packet, IpAddress::LocalHost, 4569);
                }
            }
            for (unsigned int i = 0; i < clients.size(); i++) {
                if (selector.isReady(*clients[i])) {
                    Packet packet;
                    if (clients[i]->receive(packet) == Socket::Done) {
                        string message;
                        packet>>message;
                        cout<<"Received from client (TCP) : "<<message<<endl;
                        packet.clear();
                        message = "Ceci est un message TCP!";
                        packet<<message;
                        clients[i]->send(packet);
                    }
                } else {
                    selector.remove(*clients[i]);
                    vector<TcpSocket*>::iterator it;
                    for (it = clients.begin(); it != clients.end();)
                        if (*it ==clients[i])
                            it = clients.erase(it);
                        else
                            it++;
                }
            }
        }
    }
}
 
Lorsque j'envoie un message UDP suivit d'un message TCP avec le client, seul le message UDP est reçu par le serveur.
Code côté client :
#include <SFML/Network.hpp>
#include <iostream>
#include <sstream>
using namespace std;
using namespace sf;
int main () {
    TcpSocket clientTCP;
    UdpSocket socketUDP;
    SocketSelector selector;
    if (clientTCP.connect(IpAddress::LocalHost, 4567) == Socket::Done && socketUDP.bind(4569) == Socket::Done);
        cout<<"Ok"<<endl;
    selector.add(clientTCP);
    selector.add(socketUDP);
    Packet packet;
    string message = "";
    stringstream ss;
    ss<<"Ceci est un message pour test le protocole TCP avec la SFML."<<endl;
    message += ss.str();

    packet<<message;
    clientTCP.send(packet);
    packet.clear();
    message = "Ceci est un message UDP!";
    packet<<message;
    socketUDP.send(packet,IpAddress::LocalHost,4568);
    while (true) {
        if (selector.wait()) {
            packet.clear();
            message = "";
            IpAddress address;
            unsigned short int port;
            if (selector.isReady(clientTCP)) {
                if (clientTCP.receive(packet) == Socket::Done) {
                    packet>>message;
                    cout<<"Received from server (TCP) : "<<message<<endl;
                }
            }
            if (selector.isReady(socketUDP) == Socket::Done) {
                if (socketUDP.receive(packet, address, port) == Socket::Done) {
                    packet>>message;
                    cout<<"Received from server (UDP) : "<<message<<endl;
                }
            }
        }
    }

    return 0;
}
 
Quand je mets des else if au lieu des if côté serveur dans la boucle ça va déja mieux mais lorsque je ferme et que je relance le client, le serveur ne reçoit juste qu'un message UDP et le client ne reçoit plus rien, bref, j'ai des ennuis avec ça dans mon plus gros projet, parfois , j'ai des messages qui n'arrivent pas et ça fait carrément planté le programme. :/
Voici la version avec les else if.
code côté serveur :
#include "server.h"
using namespace std;
using namespace sf;
void Server::launch() {
    if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
        cout<<"Ok"<<endl;
    selector.add(listener);
    selector.add(socketUDP);
    while (true) {
        if (selector.wait()) {
            if (selector.isReady(listener)) {

                TcpSocket *client = new TcpSocket();
                if (listener.accept(*client) == Socket::Done) {
                    cout<<"Client connected"<<endl;
                    selector.add(*client);
                    clients.push_back(client);
                }
            }  else if (selector.isReady(socketUDP)) {
                Packet packet;
                IpAddress address;
                unsigned short int port;
                if (socketUDP.receive(packet,address, port) == Socket::Done) {
                    string message;
                    packet>>message;
                    cout<<"Received from client (UDP) : "<<message<<endl;
                    packet.clear();
                    message = "Ceci est un message UDP!";
                    packet<<message;
                    socketUDP.send(packet, IpAddress::LocalHost, 4569);
                }
            } else {
                for (unsigned int i = 0; i < clients.size(); i++) {
                    if (selector.isReady(*clients[i])) {
                        Packet packet;
                        if (clients[i]->receive(packet) == Socket::Done) {
                            string message;
                            packet>>message;
                            cout<<"Received from client (TCP) : "<<message<<endl;
                            packet.clear();
                            message = "Ceci est un message TCP!";
                            packet<<message;
                            clients[i]->send(packet);
                        }
                    } else {
                        selector.remove(*clients[i]);
                        vector<TcpSocket*>::iterator it;
                        for (it = clients.begin(); it != clients.end();)
                            if (*it ==clients[i])
                                it = clients.erase(it);
                            else
                                it++;
                    }
                }
            }
        }
    }
}
 
code côté client.

Le même que celui ci-dessus.

PS : la méthode close() est en protected, on a plus besoin de le faire ça, la sfml le fait automatiquement ?

45
Réseau / Réception des packets en TCP.
« le: Juin 15, 2013, 08:38:20 pm »
La réception des paquets ne se fait pas toujours correctement en TCP, la taille des messages est aussi limitée, j'ai l'impression que il n'y a pas de différence entre TCP et UDP, je ne sais pas quelle librairie dépende tu utilises pour la gestion du réseau mais elle ne semble pas très bien fonctionner surtout pour le TCP, bref c'est pas grave j'ai fais un test moi même à chaque fois que je reçois des données pour savoir si je les ai bien reçues ou alors si je ne les ai pas reçus je demande au serveur de les re-renvoyées mais bon je ne m'attendat pas à devoir faire ça en TCP. :/

anything