IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Premier jeu en C++ et SFML


Sujet :

C++

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    D�veloppeur
    Inscrit en
    F�vrier 2024
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur

    Informations forums :
    Inscription : F�vrier 2024
    Messages : 2
    Par d�faut Premier jeu en C++ et SFML
    Bonjour,

    J'ai commenc� � apprendre le C++ il y a un mois (j'avais d�j� des bases en C et dans d'autres langages).
    J'ai d�velopp� mon premier jeu, "OXO", qui est un simple Morpion. Le but �tait simplement d'apprendre le C++ et � utiliser la librairie SFML.

    Ayant tout appris sur internet , je n'ai aucune id�e de la qualit� de mon code.

    C'est pourquoi je m'en remets � vous. Y a-t-il des erreurs de d�butant que j'ai commises ? Des optimisations sont-elles possibles ?

    Merci pour votre temps pass� et vos �ventuels conseils !


    Code source ici : https://github.com/BizohxDev/OXO
    T�l�charger le jeu compil� (Windows) : ICI

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par d�faut
    Ce serait plus simple si le code �tait disponible directement ici ou � la limite sur un truc genre github.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    D�veloppeur
    Inscrit en
    F�vrier 2024
    Messages
    2
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur

    Informations forums :
    Inscription : F�vrier 2024
    Messages : 2
    Par d�faut
    En effet c'est sans doute mieux, j'ai ajout� le lien GitHub

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 114
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 114
    Billets dans le blog
    147
    Par d�faut
    Bonjour,

    Ah ! Amusant, votre dossier 'src', contient les ressources (images, sons...). G�n�ralement, le dossier 'src', contient, les sources . Les m�dias, �a va dans un dossier "res" ou "resources".
    Chose que l'on peut am�liorer : mettre en ligne le fichier du projet/Makefile, ou encore mieux, un fichier d'un g�n�rateur de projets (CMakeLists.txt d'un CMake ou autre).

    Dans le main:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
        std::vector<Screen*> screens;
    Pourquoi des pointeurs bruts ? Ou m�me, pourquoi ds pointeurs. Je pense que l'on peut les �viter.

    Dans le dossier view, j'aurais fait un sous dossier screens, du coup.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ScreenHomepage::ScreenHomepage() = default;
    Lorsque l'on utilise le default, on le d�clare ainsi, dans le .h, directement.

    Chaqu'un de vos Screen impl�mentent le chargement des ressources et une boucle principale. Il y a plusieurs solutions possibles, mais :
    • le chargement des ressources pourrait �tre dans une fonction d�di�e (pour un peu r�duire la taille de run()), mais aussi, car on aimerait peut �tre faire un chargement d'une bonne partie (voire toute) les ressources du jeu, au d�marrage de celui-ci.
    • on aimerait n'avoir qu'une seule boucle principale (dans le main()), qui va ex�cuter le code qu'il faut de l'�cran. D'ailleurs, c'est pas mal expliqu� ici : https://alexandre-laurent.developpez...boucle-de-jeu/

    Ceci dit, j'aime bien l'id�e d'avoir fait des Screen et une machine � �tats.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    const int Size_textNamePlayer(2);
    sf::Text textNamePlayer[Size_textNamePlayer];
    Je verrais bien des std::array et des for(auto var : array) (je crois que cela s'appelle range-for ).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    // Event queue processing
            while (app.pollEvent(event)){
                switch(event.type){
    C'est un design que je n'aime pas . Note : c'est un avis personnel. Je pr�f�re r�cup�rer les �v�nement au besoin, et non pas d�pil� les �v�nements re�us moi m�me. Notamment, je peux bloquer votre application en d�pla�ant la fen�tre (le d�placement provoque souvent un envoi d'�v�nement de d�placement de fen�tre pour chaque pixel. Bref, �a spam � mort. Pareil lorsque l'on fait bouger la souris.

    Vous avez un mod�le MVP (d'apr�s le nom des dossiers). Ce n'est pas un design que l'on fait pour les jeux vid�o .

    Cette variable dans le main:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    const int Size_playersNames(2);
    doit avoir la m�me valeur que les variables dans les screens, non ? Dans un tel cas, on a souvent un fichier de nombre magique, appel� globals.h . Cela peut se faire aussi s'impl�menter en variable constante statique de classe. Bref, avoir un endroit o� la valeur est d�finie et tout le monde se r�f�re � cette valeur.
    Ah ! vous avez un fichier GlobalConstants. Bah, c'est la m�me id�e. Vous pouvez ajouter des namespace pour faire un peu d'ordre dans ce fichier, notamment, pour regroupper tout ce qui concerne l'UI. Et comme c'est de l'UI, faire un fichier d�di� peut �tre une bonne id�e, � placer dans le dossier view.
    Aussi, vous avez un petit effet comique, c'est que votre fonction run, accepte deux variables, d�fini � l'ext�rieur (dans le main). Elles le sont, car vous en avez besoin dans plusieurs �crans. Je pense que j'aurai opt� pour une classe pour contenir ces informations.

    Dans MRandom, je ne sais plus si cela � un coup de recr�er � chaque fois votre device/mt/distribution. La classe devrait �tre en mesure de conserver tout cela, afin d'�viter de recr�er � chaque g�n�ration d'un nombre.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    /** * * * * * * **
     *    GETTER     *
     ** * * * * * * **/
    Inutile.
    Cette information, je l'ai juste en lisant le nom de la fonction (ici getText). Pas besoin d'alourdir le fichier. D'ailleurs, pour le MFile::getText(), l'impl�mentation aurait simplement pu �tre dans le fichier .h
    Pareil pour le setText. Les fonctions d'une ligne, on peut se permettre de les mettre dans le .h directement. Pareil pour les constructeur vide.

    La taille de la grille est aussi en nombre magique (3). En r�alit�, ce n'est pas tr�s grave, car on peut se dire simplement, la taille ne changera jamais. C'est vrai et il n'y a pas trop de mal � �a et je pense qu'il faut se donner certaines limites quant � la modularit� que l'on veut atteindre. Toutefois, je crois qu'il aurait �t� plus simple d'avoir une classe d�di�e � la grille, et peut �tre avoir impl�ment� un tableau plat. D'autant plus que gr�ce � la m�thode getCell(), la diff�rence serait minime pour le reste du code. Et avec une m�thode getCell, vous pouvez ajouter des gardes fous pour rep�rer les erreurs de programmation au plus t�t (des assertions, notamment).
    Pourquoi un tableau plat:
    • beaucoup plus facile � parcourir (notamment pour voir si toutes les cases ont �t� jou�es) ;
    • le getCell permet d'avoir une interface propre (utilisation d'un syst�me de coordonn�es ligne/colonnes), peu importe la structure contenant les donn�es derri�re ;
    • permet la taille que l'on veut ;
    • permet une utilisation des fonctionnalit�s standard (algorithm)
    • les tableaux 2D, bof bof (et encore, le votre est d'une taille fixe, sans allocation dynamique)




    Ce code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    do {
            row = randomInt(0, 2);
            column = randomInt(0, 2);
        } while (m_grid[row][column] != ' ');
    En cas de malchance interplan�taire, cela fait freeze votre programme . On aurait pu simplement scanner les cases libres, piocher dans l'une d'entre elle et hop, on a une case al�atoire.

    La grille est compos� de char. Vous auriez tr�s bien pu utiliser un enum, rendant le code plus clair.

    Chaque �cran charge certaine m�me ressources (les polices)
    Chaque �cran affiche une liste de Drawable, pourtant, chaque �cran poss�de un code du style :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    app.clear();
    app.draw(bgSprite);
    app.draw(title);
    app.draw(subtitle);
    app.draw(creditsText);
    app.draw(buttonBack);
    app.display();
    Un �cran pourrait tr�s bien juste renvoyer/remplir une liste de choses � afficher, tout simplement. Et un code commun ferait le clear/draw/display.

    Un Screen va renvoyer l'index d'un autre screen. Cela aurait pu �tre un enum et l'autre probl�me, c'est que c'est d�pendant de l'ordre d'insertion des Screen fait dans le main.

    Voil�. Il y a peut �tre d'autres choses � dire, mais il faut retenir les points suivants :
    • vous avez fait un jeu qui fonctionne. C'est d�j� un tr�s grand succ�s pour vous m�me et vous pouvez en �tre fier ;
    • les retours que j'ai fait, viennent de l'exp�rience. Il est normal que son premier jeu soit cod� comme vous l'avez fait (je pense que le mien �tait m�me pire ). C'est en programmant que l'on devient programmeur (et que l'on acquiert l'exp�rience). Si cela vous tente, faites une branche et tentez de modifier le code suivant mes retours. Si cela ne vous tente pas, faites un autre projet et tentez quelques solutions que j'ai propos�.
    • j'ai remarqu� notamment que le code �tait plus proche du C, que du C++. Essayez d'utiliser quelques fonctionnalit�s de base, notamment : algorithm, std::array/std::vector, les ranged for et m�me std::optional (pour le selectedPage, par exemple).


    Encore une fois, f�licitations.
    Vous souhaitez participer � la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui conna�t l'erreur, conna�t la solution.

Discussions similaires

  1. Le premier jeu en youtube
    Par yan dans le forum Web
    R�ponses: 6
    Dernier message: 28/05/2009, 13h04
  2. librairie pour jeu 2D, SDL ou SFML ?
    Par tuxrouge dans le forum D�veloppement 2D, 3D et Jeux
    R�ponses: 12
    Dernier message: 30/04/2008, 14h51
  3. Aide pour premier jeu.
    Par Silvering dans le forum Tkinter
    R�ponses: 9
    Dernier message: 30/03/2008, 15h59
  4. Premier jeu en C
    Par ZouBi dans le forum Projets
    R�ponses: 44
    Dernier message: 08/03/2008, 18h30
  5. Mon premier jeu!
    Par ArHacKnIdE dans le forum Web
    R�ponses: 59
    Dernier message: 05/06/2006, 20h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo