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 - Algue-Rythme

Pages: [1]
1
Projets SFML / Jeu de la vie
« le: Août 04, 2013, 05:40:24 pm »
Bonjour à tous !

Ceci est mon premier projet avec la SFML, et même le premier véritable projet que je programme.

Il s'agit du célèbre Jeu de la vie de Conway, codé de façon très minimaliste (aucune optimisation particulière, un algo naïf, et une interface très minimaliste elle aussi - et donc très moche).

Je viens ici essentiellement pour réclamer des commentaires sur mon code, car même si mon programme est fonctionnel, j'ai de gros doutes sur sa qualité (lisibilité, maintenance, efficacité, facilités d'évolutions). Ainsi j’apprécierais avec grand plaisir les critiques te conseils que vous pourriez me prodiguer.

Beaucoup de ces points ce concernent pas que la SFML, mais je crois, à raison, pouvoir trouver des spécialistes du C++ ici.

Voici quelques points (en vrac) que j'aimerais voir abordés (ne répondez qu'à ceux qui vous plaisent, et n'hésitez pas à en rajouter d'autres).

1) L'existence et l'implémentation de la fonction indiceValide(indice, conteneur) vous paraît-elle appropriée ?

2) Ais-je bien fait d'utiliser un VertexArray plutôt qu'un ensemble de RectangleShape ?

3) Jusque dans quelle mesure ma classe correspond t-elle aux critères OO ? Comment l'améliorer ?

4) Ais-je eu raison de travailler dans des tableaux unidimensionnels en calculant moi même mes indices pour simuler d'autres dimensions ?

5) Comment améliorer la lisibilité de mon code (conventions de codage, etc... ) ?

6/ Séparer l'affichage, le calcul de l'étape suivante, et la mise à jour du VertexArray vous paraît-elle une bonne idée ?

7) Ais-je raison de recalculer les indices de mes Vertex à chaque mise à jour ?

8/ Ais-je raison de séparer mon constructeur et l'initialisation de la grille à partir d'un fichier ? (Au passage je précise que j'ai fait le choix pour des raison de simplicité de ne pas respecter le format LIF et de m'appuyer sur un format "à ma sauce" pour accélérer la phase de test, la prise en compte de LIF est un exercice qui viendra après).

9) La résistance aux erreurs vous paraît-elle catastrophique ou juste horrible ?

10) D'autres remarques ?

Merci d'avance pour votre aide et vos conseils ! ;)

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

#include <SFML/Graphics.hpp>

using namespace sf;
using namespace std;

vector<Vector2i> directions = {
                               Vector2i(0, 1), Vector2i(1, 0),
                               Vector2i(0, -1), Vector2i(-1, 0),
                               Vector2i(1, 1), Vector2i(-1, -1),
                               Vector2i(1, -1), Vector2i(-1, 1)
                              };
                             
template<typename Conteneur>
inline bool indiceValide(int indice, const Conteneur& conteneur)
{
   return (indice >= 0 && static_cast<unsigned int>(indice) < conteneur.size());
}

class JeuDeLaVie : public Drawable, public Transformable
{
public:

   JeuDeLaVie(unsigned int _hauteur, unsigned int _largeur, unsigned int _tailleCellule) :
   hauteur(_hauteur), largeur(_largeur), tailleCellule(_tailleCellule), parite(true)
   {
      sommets.setPrimitiveType(Quads);
      sommets.resize(hauteur * largeur * 4);
      grille[false].resize(hauteur * largeur, false);
      grille[true].resize(hauteur * largeur, false);
   }
   
   void loadFromFile(const string& fileName)
   {
      ifstream file(fileName.c_str());
      unsigned int nbBlocs;
      file >> nbBlocs;
      for (unsigned int bloc = 0; bloc < nbBlocs; ++bloc)
      {
         unsigned int abscisse, ordonnee, nbLignes, nbColonnes;
         file >> abscisse >> ordonnee >> nbLignes >> nbColonnes;
         
         char cellule;
         for (unsigned int i = 0; i < nbLignes; ++i)
            for (unsigned int j = 0; j < nbColonnes; ++j)
            {
               unsigned int indice = abscisse + j + (ordonnee + i) * largeur;;
               file >> cellule;
               if (cellule == 'O')
                  grille[parite][indice] = true;
            }
      }
      updateVertexArray();
   }
   
   void evolve()
   {
      for (unsigned int i = 0; i < hauteur; ++i)
         for (unsigned int j = 0; j < largeur; ++j)
         {
            unsigned int indice = (j + i * largeur);
            unsigned int compteur = 0;
           
            for (auto direction : directions)
            {
               int adjacent = j + direction.x + (i+direction.y)*largeur;
               if (indiceValide(adjacent, grille[parite]) && grille[parite][adjacent])
                  ++compteur;
            }
           
            if (compteur == 3)
               grille[!parite][indice] = true;
            else if (compteur < 2 || compteur > 3)
               grille[!parite][indice] = false;
            else
               grille[!parite][indice] = grille[parite][indice];
         }
         
      parite = !parite;
      updateVertexArray();
   }
   
   virtual void draw(RenderTarget& target, RenderStates states) const
   {
      states.transform = getTransform();
      target.draw(sommets, states);
   }
   
private:

   void updateVertexArray()
   {
      for (unsigned int i = 0; i < hauteur; ++i)
         for(unsigned int j = 0; j < largeur; ++j)
         {
            unsigned int indice = (j + i * largeur);
            Color couleur = grille[parite][indice] ? Color::White : Color::Black;
           
            Vertex * quad = &sommets[indice * 4];
           
            quad[0].position = Vector2f(j * tailleCellule, i * tailleCellule);
            quad[1].position = Vector2f((j + 1) * tailleCellule, i * tailleCellule);
            quad[2].position = Vector2f((j + 1) * tailleCellule, (i + 1) * tailleCellule);
            quad[3].position = Vector2f(j * tailleCellule, (i + 1) * tailleCellule);
           
            for (unsigned int point = 0; point < 4; ++point)
               quad[point].color = couleur;
         }
   }

   VertexArray sommets;
   vector<bool> grille[2];
   const unsigned int hauteur;
   const unsigned int largeur;
   const unsigned int tailleCellule;
   bool parite;
};

int main()
{
   RenderWindow window(VideoMode(512, 512), "Jeu de la vie");
   window.setVerticalSyncEnabled(true);
   
   JeuDeLaVie gol(64, 64, 8);
   gol.loadFromFile("exemple.GOL");
   
   Clock clock;
   
   while (window.isOpen())
   {
      Event event;
      while(window.pollEvent(event))
      {
         if ((event.type == Event::Closed)
          || (event.type == Event::KeyPressed && event.key.code == Keyboard::Escape))
            window.close();
      }
     
      Time elapsed = clock.getElapsedTime();
      if (elapsed >= seconds(0.25f))
      {
         clock.restart();
         gol.evolve();
      }
     
      window.clear(Color::White);
      window.draw(gol);
      window.display();
   }
   
   return 0;
}
 

2
Général / Re : [windows] compilation en ligne de commande
« le: Juillet 31, 2013, 05:10:57 pm »
Salut,

Il me semble que tu t'y prends dans le mauvais ordre pour indiquer l'emplacement des bibliothèques SFML à ton éditeur de liens (de toutes façons les problèmes de références indéfinies sont toujours en rapport avec lui).

Je crois que tu dois indiquer ces options d'édition des liens après le nom de ton fichier source.

Ta ligne de commande ressemblerait donc à ça :

g++ -IC:/Library/SFML-2.1/include -o test main.cpp -LC:/Library/SFML-2.1/lib -lsfml-graphics -lsf
ml-window -lsfml-system

3
Général / Re : Compilation d'un projet SFML sous windows
« le: Juillet 30, 2013, 10:35:36 pm »
En effet, après mise à jour de mon compilateur tout marche parfaitement.

Je m'excuse de t'avoir fait perdre du temps sur ce problème bénin et peut-être trop récurrent.

Merci encore et bonne soirée ! :)

4
Général / Re : Compilation d'un projet SFML sous windows
« le: Juillet 30, 2013, 10:09:56 pm »
Voilà ce qu'il me recrache :

Using built-in specs.
COLLECT_GCC=mingw32-gcc
COLLECT_LTO_WRAPPER=c:/programs/mingw/bin/../libexec/gcc/mingw32/4.6.2/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.2 (GCC)

 

Merci encore de me consacrer du temps !

5
Général / Re : Compilation d'un projet SFML sous windows
« le: Juillet 30, 2013, 07:43:05 pm »
Merci beaucoup !

Tout  a fonctionné, la compilation tout comme l'édition des liens. Au lancement mon programme crashait car il ne trouvait pas certaines dll ; je les ai copiées dans le répertoire courant de l'exécutable.

A présent il persiste à planter, et ce sans réclamer d'autres dll. L'erreur se produit dès l'ouverture de RenderWindow car celle-ci n'apparaît pas à l'écran, et la seule ligne suivante :
sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
semble suffire à provoquer l'arrêt du programme.

Cela peut-il avoir un quelconque rapport avec mon matériel et ses pilotes, ou est-ce plutôt en lien avec le compilateur utilisé ? Je précise que j'ai bien pris la SFML proposée en téléchargement pour DW2 (qui est précisément le nom d'une dll dans mon MinGW\bin, pour 32 bits tout comme mon OS).

Merci une fois encore.



6
Général / Compilation d'un projet SFML sous windows
« le: Juillet 30, 2013, 06:06:40 pm »
Bonjour à vous,

C'est la première fois que j'installe la SFML, je suis sous windows XP 32 bits et je possède MinGW (l'une des toutes dernières versions).

Je me trouve fort en peine pour la compilation de mon premier projet (l'exemple de base fourni dans les tutoriels). En effet c'est la première fois que je fais appel à une bibliothèque externe, d'une part, et d'autre part j'ignore très exactement ce que je fais et ce que je dois faire (car j'ignore quels sont les mécanismes de compilation et leur fonctionnement).

Je n'utilise ni Code::Blocks ni Visual C++, et je ne souhaite pas devoir les installer comme solution à mon problème. Je suis actuellement sous Notepad++, et j'utilise un plug-in nommé NppExec qui me permet de rédiger des petits scripts envoyés à la ligne de commande, comme si je compilais en ligne de commande, mais en gagnant du temps.

J'aimerais connaître les options que je dois passer à mon compilateur et toutes les manipulations auxquelles je devrais me livrer pour compiler le projet, en liant les librairies de façon dynamique. J'en profite pour signaler que SFML se trouve dans C:\library\.

J'aimerais également, dans la mesure du possible, me passer de solutions "sales" qui consisteraient à copier l'intégralité de SFML/include dans le dossier include de MinGW.

Merci d'avance pour toute aide pouvant m'être apportée !  :)

Pages: [1]