Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Framework  (Lu 57107 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #30 le: Décembre 03, 2013, 08:24:59 am »
Ouais tu as raison d'ailleurs il y a des développeurs qui utilise mumble donc je suis ok, en plus, j'ai mumble.  :D

Bref il faut que je regarde le fonctionnement de ton framework et que l'ont fasse un tri.

Je vais juste te répondre :

Citer
J'ai dit quelque part que ton projet était brouillon (j'espère que tu l'as pas mal pris :) ), ce que je voulais dire par là, c'est qu'il est très très complets et que je devrais mettre plusieurs jours afin de réellement comprendre tous tes concepts. Ensuite oui si tu utilises MinGW 4.8 tu as donc les pointeurs intelligents que tu n'utilises pas mais ça c'est pas le plus important pour le moment.
Ensuite ce code : me parait complexe aux 1er abords.

C'est sûr que pour afficher juste une tile, ce code est trop complexe, mais je l'ai juste mis histoire d'avoir juste un aperçu de l'utilisation "globale" du framework, mais pour afficher juste une tile, il y a moyen de faire plus simple sans passer par les classe World et Map. :)
Ce qui rend le code moins complexe, et c'est ça l'intérêt du framework.

Ce code est juste à utiliser lorsqu'on veut dessiner pleins de choses, comme par exemple, dans ce cas-ci :

Vector2f v2 (view.getCenter().x - view.getSize().x * 0.5f, view.getCenter().y - view.getSize().y * 0.5f);
    //Rendu des ombres.
    Sprite spriteShadows;
   
    renderTextShadows.setView(view);
    renderTextShadows.clear(Color::White);

    if (day) {

        RectangleShape rect;
        rect.setPosition(Vector2f(v2.x, v2.y));
        rect.setFillColor((Color(100, 100, 100, 128)));
        rect.setSize(Vector2f (view.getSize().x, view.getSize().y));

        vector<Shadow*> visibleShadows = World::getCurrentMap()->getVisibleShadows();

        for (unsigned int i = 0; i < visibleShadows.size(); i++) {
                renderTextShadows.draw(*visibleShadows[i]);
                //draw(*visibleShadows[i]->getShadow());
        }

        renderTextShadows.draw(rect, RenderStates(BlendAdd));
        renderTextShadows.display();
        //draw(rect, RenderStates(BlendAdd));
    }



    //Rendu des lumières.
    renderTextLights.clear(ambientColor);
    if (!day) {

        vector<DrawableEntity*> visibleLights = World::getCurrentMap()->getVisibleEntities("E_LIGHT");

        for (unsigned int i = 0; i < visibleLights.size(); i++) {

            renderTextLights.draw(*visibleLights[i], RenderStates(BlendAdd));
        }
        renderTextLights.display();
    }

    //Rendu de la map. (partie visible à l'écran.)
    clear();
    setView(view);
    vector<DrawableEntity*> visibleTiles = World::getCurrentMap()->getVisibleEntities("E_GROUND+E_DECOR");

    bool shadowRendered = false;

    for (unsigned int i = 0; i < visibleTiles.size(); i++) {

         if (day && !shadowRendered && visibleTiles[i]->getZOrder() >= DEFAULT_SHADOW_Z_ORDER) {
             Sprite shadows (renderTextShadows.getTexture());
             shadows.setPosition(v2.x, v2.y);
             draw (shadows, RenderStates(BlendMultiply));
             shadowRendered = true;
         }
         draw(*visibleTiles[i]);
    }
    if (!day) {
        Sprite lights (renderTextLights.getTexture());
        lights.setPosition(v2.x, v2.y);
        draw (lights, RenderStates(BlendMultiply));
    }
 

Mais ce code est encore un peu brouillon comme tu dis, il faudrait que je définisse une fonction draw dans la classe map et un conteneurs de tiles dans la classe tGround pour dessiner toute la map avec un seul appel à draw. (Ainsi il n'y aura même plus besoin de se soucier des rendertextures. :))
Et on pourra écrire directement :
currentMap->applyView(currentView);
draw(*currentMap)

Donc je pense que je vais modifier ça. :P

Je préfère par contre laisser le soin à l'utilisateur d'utiliser la fonction currentMap->checkVisibleEntities(viewRect) que lorsqu'il en a besoin (par exemple lorsqu'on se déplace dans le monde uniquement) car c'est celle là qui bouffe le plus de perfs.

Bref je vais m'occuper de la partie graphique je pense.  :)

Les pointeurs intelligents pour information je n'ai pas besoin de les utiliser, car, je développe en c++ depuis bien longtemps, j'ai suivis des cours, etc..., on utilisait pas les pointeurs intelligent, on a appris à gérer nous même la mémoire en c++ donc..., je n'ai jamais eu besoin d'utiliser les pointeurs intelligent qui gère la mémoire tout seul.
Donc si on ne les utilise pas c'est moins grave, car, on peut s'en passer.
Je dois juste encore rendre certaines classes non copyable, et voir pour les const et puis bien sûr générer la doc à la fin.
Pour mumble je suis là le soir vers 18h ça me va. (Juste le temps que je regarde tout code)

PS : ha oui je dois aussi faire des classes template pour les vecteur et les matrices pour que l'on puisse aussi travailler avec des int, des double, etc... et pas que des flottants.
« Modifié: Décembre 03, 2013, 08:56:47 am par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #31 le: Décembre 03, 2013, 09:53:04 am »
Bon j'ai regardé ton code et ça m'a l'air pas mal du tout.  :)

Je pense que je vais reprendre ton système de commande pour lier des actions au player et ton système de gui. :)

Il me faudra juste le temps maintenant pour lier tout ça à mon projet actuel. ^^

PS : et je vais également m'inspirer de ton resourcemanager pour stocker les shaders, les sons, les textures, etc..., car le mien pour le moment ne s'occupe que des textures, il me faut également rajouté une classe pour géré les game-states (qualité des lumières, etc...)







« Modifié: Décembre 03, 2013, 11:05:53 am par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #32 le: Décembre 03, 2013, 12:12:55 pm »
Bon je pense que je vais créer 2 fichiers .cpp et .h (Game et GameStates), pour rendre le code moins brouillons, et ensuite je m'occuperai des GUI et du système de commandes.

PS : il faut juste pas oublié que on doit pouvoir aussi utiliser la renderwindow dans un QWidget. :)
« Modifié: Décembre 03, 2013, 12:27:48 pm par Lolilolight »

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Framework
« Réponse #33 le: Décembre 03, 2013, 01:21:19 pm »
Si je dis pas de bêtises, sa façon de gérer les événements et les ressources vient tout droit du Livre "SFML Game Develpment", si tu veut plus d'infos dessus je te conseille vraiment de le lire (on y apprend des tas de choses)

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #34 le: Décembre 03, 2013, 02:12:24 pm »
C'est pas comme si je voulais lire ce qu'il y avait dedans, même si il y a des choses intéressante j'avoue, bref, j'ai fait rajouté une classe game qui se chargera de rendre une frame, et une classe gamestates qui contient états du jeux. (Si il faut rendre les ombres ou pas, si il faut rendre les lumières ou pas, la configuration de la renderwindow, etc...)

Ce code sera moins brouillon et il suffira de faire un simple game.render() qui se chargera d'afficher la frame courante du monde. :)

Mais bon c'est assez haut niveau donc, on pourra aussi faire sa propre classe game si on ne veut pas utiliser l'entity system du framework. (A condition de redéfinir la fonction render)

En gros ma classe game correspond à la classe Application.
« Modifié: Décembre 03, 2013, 02:14:22 pm par Lolilolight »

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Framework
« Réponse #35 le: Décembre 03, 2013, 02:20:28 pm »
Je sais pas si c'est parce que tu vas un peu vite dans tes posts, mais j'ai l'impression que tu mélanges un peu tout.

J'ai pas tout suivi de votre projet, mais avant de commencer à programmer, vous avez fait une liste/schémas/brouillon écrit de ce qu'il y aura et à peu près comment ? Je suis le projet de l'extérieur, mais ça semble aller dans tous les sens du point de vue du spectateur.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #36 le: Décembre 03, 2013, 02:42:04 pm »
Il me faudrait en effet un shéma brouillon surtout pour l'architecture de base c'est à dire le state, le state manager, l'even handler, etc... en y intégrant mes propres classes du framework.

Car là, j'ai eu le fork de CmdDu76 mais, je n'ai pas vraiment de shéma au niveau de l'architecture donc je m'y perd un peu en effet.

De toute façon on va discuter de ça sur mumble tout à l'heure.
« Modifié: Décembre 03, 2013, 02:45:31 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #37 le: Décembre 03, 2013, 03:37:22 pm »
Bref j'ai pu allégé le code source grâce au code du bouquin
#include <SFGL/utilities.h>
#include <vector>
#include <iostream>
#include <SFGL/World/2D/world.h>
#include <SFGL/World/2D/tGround.h>
#include <SFGL/Graphics/2D/tile.h>
#include <SFGL/BoundingAreas/boundingRectangle.h>
#include <SFGL/Game.h>

using namespace sfgl;
using namespace std;
int main () {
    // création de la fenêtre
    sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
    //On récupère le gestionnaire de texture et on charge les textures du jeux.
    TextureManager &tm = World::getTextureManager();
    if (!tm.loadTexture("tilesets/herbe.png"))
        cerr<<"Error : file not found"<<endl;
    //Crée une nouvelle carte et l'affecte au monde. (Le monde peut être composé de plusieurs cartes.
    Map *currentMap = new Map(100, 50, 30);
    World::addMap(currentMap);
    currentMap->setName("Map test");
    World::setCurrentMap("Map test");
    //On ajoute créer une tile et on l'ajoute au sol.
    Tile *t = new Tile(*tm.getTexture("tilesets/herbe.png"), Vec2f(0, 0), Vec2f(100, 50), sf::IntRect(0, 0, 100, 50), "E_GROUND");
    TileGround *tg = new TileGround(t);
    //On ajoute le sol à la carte.
    currentMap->addEntity(tg);
    /*On définit le contexte de rendu du jeux en passant les paramètre suivants :
    *(Fenêtre de rendu, qualité des lumières (ici 0 vu qu'on en a pas), si on veut afficher les lumière,
    si on veut afficher les ombres et si on veut afficher la mini carte, on met tout à false ici vu que
    on a pas de lumières ni de bâtiments*/

    Game game (GameStates::Context(window, 0, false, false, false));
    game.update();
    // 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();

        }
        //On affiche la frame courante du jeux
        game.render();
        // fin de la frame courante, affichage de tout ce qu'on a dessiné
        window.display();
    }
    //On libère notre texture de la mémoire car on en a plus besoin.
    tm.deleteTexture("tilesets/herbe.png");
    return 0;

}
 

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Framework
« Réponse #38 le: Décembre 03, 2013, 03:39:50 pm »
A terme, ton main contiendra autant de code ?

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #39 le: Décembre 03, 2013, 03:50:16 pm »
Non car je ne fais jamais la création d'entités dans le main, je le fais avec un éditeur de carte donc, et je ne crée par non plus la render window dans le main.

Donc à terme, le main ne contiendra que quelques lignes de code.

Ici j'ai effectué tout dans le main pour montrer un exemple de ce qui a déjà été implémenté.
Mais le framework possédera sa propre classe Renderwindow qui pourra être aussi utilisée avec les Widget de QT. :)

Il y aura en plus possibilité de définir un curseur et une icône avec bien sûr, un propre event handler.
Bref en gros c'est ce qu'il me reste à faire au niveau du graphisme avec bien sûr la création de gui 2D IG.

PS : et je dois aussi regrouper tout les headers des différents module dans un fichier .hpp

« Modifié: Décembre 03, 2013, 03:54:40 pm par Lolilolight »

Cmdu76

  • Full Member
  • ***
  • Messages: 194
    • Voir le profil
Re : Framework
« Réponse #40 le: Décembre 03, 2013, 05:36:53 pm »
Lo-x a totalement raison, et au passage oui, mon code est très très fortement inspiré du livre, j'ai modifié juste quelques petites choses par-ci par là pour le rendre vraiment opérationnel en tant que framework alors que le livre ne propose "qu'un usage unique"

Je crois qu'on part un peu mal, on devrait commencer dès ce soir, sur mumble, à choisir vraiment l'architecture de base. Ensuite on pourra ajouter tout ce qui est module plus ou moins élevé.

Donc pour commencer on discute sur la structure donc moi je pense que les States fournit par le livre sont vraiment ce que j'ai vu de mieux comme système de State, car contrairement à bon nombre de système de ce type, tu dessines vraiment tous les States du Stack, et ça c'est vraiment cool parce qu'en plus de pouvoir faire des trucs stylés, l'utilisateur peut aussi choisir vraiment s'il ne veut qu'un State dans le Stack avec les fonctions Clear/Pop

Ensuite, au niveau du main, dans le code final, on ne devrait avoir que genre 5 lignes grand max, le main est l'entrée du programme mais on ne doit rien faire dedans à part instancier notre classe de base.

Sinon oui sur mon fork j'ai pas partagé entre différents modules car faire un module entier pour 3 ou 4 fichiers je trouve ça un peu bête pour le moment, surtout sachant que ça risque de changer dans les prochains jours

Sinon je pensais aussi retravailler sur ma classe Application afin de l'optimiser un petit peu : Héritage direct de sf::RenderWindow et de StateManager et de Player et d'encore quelques classes ... Ducoup je peux supprimer tout ce qui est State::Context, ce qui simplifie pas mal je trouve :)

Enfin bref je go travailler pendant encore 15min et j'arrive sur mumble

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #41 le: Décembre 03, 2013, 05:51:02 pm »
Ok je suis sur le mumble là pour m'a part j'ai réussi à virer la dépendance de boost mais j'ai encore quelque soucis avec les "states".

Il Faudrait que je m'y fasse mais bon..., ça me fait pas mal pensé à pushGlStates et popGlStates de SFML, c'est un truc du même genre ou pas.

Bref il faudra qu'on discute de ça..., du moment que ce n'est pas une architecture qui s'applique à un jeux de type unique ça me vas.

Il ne vaut pas oublier que pour les commandes, il faudra aussi pouvoir envoyer des commandes en réseau. (Ce qu'il ne fait pas dans le livre)
Genre j'appuie sur une touche j'envoie un message au seveur pour lui dire que le player effectue tel action.

Dans le main il ne devra y avoir que la création du contexte, le définition de quelque paramètre pour le réseau (l'adresse ip, le port, etc...), ainsi que un exec pour démarer la boucle de jeux.
Le chargement des maps devra se faire avec la classe UpsFileManager et le création des cartes, monstres, quête et tout ça, j'utilise un éditeur maison qu'on peut très bien faire facilement avec le framework et QT. :)

Mais je ne mettrai pas encore ce code là dans les exemples car il est encore un peu brouillon. (Même chose pour le code source du module réseau)
« Modifié: Décembre 03, 2013, 05:54:53 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #42 le: Décembre 04, 2013, 08:49:12 am »
Ce soir je vais essayer de poster sur git-hub un diagramme (vite fait) et une liste de tout ce qui a déjà été implémenté, et de tout ce qui reste à implémenter histoire que ça soit plus claire pour les contributeurs.

Par contre je vais le faire un Anglais car je compte créer aussi un thread sur le forum Anglais de SFML.t.

Si j'ai le temps je ferai des tutoriels et un forum temporaire car je n'ai pas le temps de faire le site web pour le moment. (J'ai déjà assez de boulot avec sfgl)
« Modifié: Décembre 04, 2013, 08:50:50 am par Lolilolight »

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Re : Framework
« Réponse #43 le: Décembre 04, 2013, 09:15:05 am »
Il ne vaut pas oublier que pour les commandes, il faudra aussi pouvoir envoyer des commandes en réseau. (Ce qu'il ne fait pas dans le livre)
Genre j'appuie sur une touche j'envoie un message au seveur pour lui dire que le player effectue tel action.

Tu n'as pas lu le livre jusqu'au bout alors, parce que c'est expliqué dans la dernière partie, la partie Networking.

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : Framework
« Réponse #44 le: Décembre 04, 2013, 09:48:52 am »
Ok.  :)