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

Moteurs de jeux vidéo Discussion :

Jeu Zelda-like : besoin d'aide


Sujet :

Moteurs de jeux vidéo

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut Jeu Zelda-like : besoin d'aide
    Bonjour,

    Je me permets de faire appel à vous afin d'obtenir de l'aide afin de continuer à coder un jeu Zelda-like.

    Je me suis mis au C++ il y a environ 6 mois par le biais d'un "cours", puis j'ai parcouru quelques tuto dont un sur la SFML que j'utilise pour coder mon jeu façon "tile-mapping".

    Par aide je n'entends pas que quelqu'un code à ma place, mais avoir des indications, ligne de conduite, me montrer ce que j'aurai pu oublié, me montrer comment mieux organiser mon code, l'optimiser...

    Pour se faire, j'ai mis mon code source (ainsi que mes fichiers sources) sur GitHub : https://github.com/Tiv76/TivWorld

    Pour le moment j'ai quelques classes :
    - une classe "Level" qui récupère les informations depuis les fichiers textes afin de créer les carte et les afficher
    - une classe "Character" qui gère la création, l'animation et les mouvements du personnage principal (et éventuellement des méchants)
    - une classe "CollisionManager" qui actuellement ne gère que les collision avec le décor afin d'éviter au personnage de traverser les murs...
    - une classe "ExitManager" qui gère les sorties de la carte en cours afin de charger la suivante
    - j'ai également un fichier texte par carte (pour le moment 6) que je créé moi-même (simple à faire)
    - j'ai aussi des tileset (génération de carte, animation de personnage) que je créé à partir de ce que je trouve sur Google (par créer j'entends que je coupe des morceaux qui m'intéresse depuis un tileset trouvé sur Google pour les réorganiser dans un autre tileset)

    Il y a donc des ajouts à faire :
    - une classe "Weapon" pour gérer des armes (animations, dégats...) ce qui entraînera l'ajout d'attributs dans la classe "Character" (attributs de vie...)
    - ...

    Actuellement je rencontre un problème concernant la génération des méchants... leur nombre ainsi que leurs attributs (type et position X et Y) est contenu dans les fichiers textes de chaque carte, et je souhaiterai pouvoir les générer et les afficher en fonctions de ces informations qui diffèrent donc à chaque changement de carte.

    Au passage, je souhaiterai savoir si mon code est bien organisé, si non ce que je peux améliorer...

    Tout mon code source ainsi que mes fichiers sources (tileset et fichiers textes) sont, comme indiqué plus haut, disponibles sur GitHub.

    Par avance merci pour toute l'aide que vous pourrez m'apporter.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'espère que je ne suis pas hors sujet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	const int TILE_WIDTH = 25; // height and width of each tiles in pixels
    	const int TILE_HEIGHT = 25;
     
    	const int NUMBER_BLOCS_WIDTH = 32; // number of tiles to display on both x and y axis
    	const int NUMBER_BLOCS_HEIGHT = 20;
    Je mettrais ce genre de constante, en statique, dans une classe "Config". Il n'y a pas de vraies raisons derrière cela, juste pour les regroupper et les mettre dans une entité (une classe) appropriée et explicite.

    Certains programmeurs disent que le main doit être pratiquement vide. Son but n'est juste de faire des vérifications ultra basiques et de lancer le programme. Généralement, je fais une classe Game, qui possède une méthode run(), pour lancer le jeu et une méthode render() et update() en privée. La méthode update gère entre autre les événements (même si l'appuie des boutons, j'aime bien la décentraliser dans une autre classe), et le render(), l'affichage.

    Question de sémantique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::map<std::string, std::string> myList;
    	std::map<std::string, std::string> myListHostiles;
    Si ce sont des listes (d'après le nom, et le nom "myList" n'est absolument pas explicite ce qui gêne à la relecture du code), pourquoi en faire des std::map et non des std::list/std::vector ? Y a t-il vraiment besoin d'une map ?
    Je sais lorsque nous sommes débutant, que la map, c'est un peu la structure qui résoud tous les problèmes. Mais au final, c'est à éviter, ou, à n'utiliser que si le besoin est réel.

    D'ailleurs, la std::map vous a bloqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int numTilesX = stoi(myList["numTilesX"]), numTilesY = stoi(myList["numTilesY"]), tile_width = stoi(myList["TILE_WIDTH"]), tile_height = stoi(myList["TILE_HEIGHT"]), number_tile_x = stoi(myList["NUMBER_TILE_X"]);
    Plusieurs soucis :
    - vous faites la conversion de la string vers int à chaque affichage. Ce n'est pas efficace alors que les valeurs sont constantes.
    - vous ne pouviez pas stocker le résultat de la conversion, à cause de votre std::map qui accepte des std::string.

    La solution est de passer par des membres de classe, simplement. Les problèmes disparaissent simplement et immédiatement.

    PositionTest() aurait pu être statique, d'après moi.
    CollisionTest() aussi.
    Je dis ça, c'est d'un point de vue sémantique, mais aussi du point de vue que les constructeurs ne font rien et que les fonctions ne semble absolument pas avoir besoin d'instance pour pouvoir faire leur job.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::string GetType() const;
    Il est préférable de retourner une référence constante pour éviter la copie.

    Pour Character, il y a beaucoup de membre. On dirait donc qu'un héritage (genre, Character hérite d'une classe Drawable, pour gérer le sprite et son affichage) pourrait être bénéfique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void Character::SetCharacter(string type)
    {
    	if (type == "Tiv")
    	{
    		myFilePath = "pictures/tiv.png";
    		myWidth = 18;
    		myHeight = 25;
    		mySpeed = 3;
    		myStepMax = 80;
    	}
    	if (type == "Robot1")
    	{
    		myFilePath = "pictures/robot1.png";
    		myWidth = 25;
    		myHeight = 25;
    		mySpeed = 2;
    		myStepMax = 30;
    	}
    	if (type == "Robot2")
    	{
    		myFilePath = "pictures/robot2.png";
    		myWidth = 25;
    		myHeight = 25;
    		mySpeed = 2;
    		myStepMax = 30;
    	}
    }
    Je pense que cela pourrait être déporté dans une Factory (un design pattern conçu pour cela).
    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.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut
    Tout d'abord merci LittleWhite de m'avoir consacré un peu de temps et de m'avoir donné tant d'informations en une fois...
    Mon emploi du temps sur semaine étant un peu chargé, je vais plancher sur tout ça aussi rapidement que possible.
    Encore merci

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut
    Salut LittleWhite,

    J'avance... lentement, car pas beaucoup de temps sauf le weekend et j'apprends de nouvelles choses grâce à toi.

    L'initialisation des constantes en les mettant dans une classe, en statique... c'est fait.. enfin il n'y avait pas grand chose à faire... cette partie est déjà à jour sur GitHub.

    J'ai attaqué l'ajout d'une classe "Game" (désolé je te pique le nom ainsi que pour tes méthodes, run, render et update).

    Mon main est maintenant en version "super light", mais j'ai encore quelques méthodes à coder avant de mettre à jour sur GitHub.

    Je pense que dans la journée de lundi (23/03) la mise à jour sur GitHub devrait être faire pour cette partie.

    Encore merci.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut Mise à jour faite...
    Ca y est, LittleWhite, la mise a jour annoncée peu après minuit est faite et visible sur GitHub (https://github.com/Tiv76/TivWorld).
    J'ai aussi changé le retour de la méthode 'GetType()' de ma classe 'Character' afin d'avoir une référence en retour.

    Je passe à la suite... encore du travail pour finir la liste que tu m'as donnée

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut
    Encore un update...

    J'ai supprimé la 'map' qui contenait tout les attributs des fichiers texte (attributs des tiles, tilemap...).
    A la place j'ai mis 2 'vector' : 1 'vector<int>' qui contient le tilemap et 1 'vector<string>' qui contient les attributs des tiles. J'ai donc aussi ajouté 2 méthodes pour accéder à ces 2 'vector'.

    J'ai gardé la 'map' pour gérer la liste des "méchants" car la liste doit contenir les types et position X et Y des "méchants"

    Du coup il ne me reste plus qu'une conversion 'stoi' pour récupérer le nombre de "méchants" de la carte et le stocker dans un attributs de la classe 'Level'.

    Il me reste donc à revoir ma classe 'Character' afin d'avoir une classe mère qui contiendra tout ce qui est communs aux 2 classes filles : 1 pour le personnage principale et 1 pour les "méchants".

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Petite parenthèse sur le stoi : http://cpp.developpez.com/faq/cpp/?p...g-en-un-entier Voici la méthode C++.
    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.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut
    Merci

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut Affichage des "Méchants"
    Je suis à la recherche d'une piste pour pouvoir gérer l'affichage des "méchants".

    Leurs nombre, position X et position Y sont stockés dans une 'map' ('listHostile' dans la classe 'Level'). Cette 'map' est générée à partir d'informations récupérées dans les fichiers texte de chaque carte.

    Donc leur nombre et leur positions changent à chaque carte.

    J'ai fait une tentative en modifiant la méthode 'PositionTest()' de ma classe 'ExitManager' afin de retourner un booléen ('true' quand il y a sortie de carte).
    Dans le header de ma classe 'Game' j'avais ajouté en attribut privé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Character myHostile = Character();
    Puis dans la méthode 'update()' de ma classe 'Game' à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myExitManager.PositionTest();
    J'avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(myExitManager.PositionTest())
        myHostile = Character("Robot1", vector2f(700,100));
    Et enfin dans la méthode 'Render()' de ma classe 'Game' j'avais ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myWindow.draw(myHostile.GetSprite());
    J'ai essayé tel quel, puis avec un pointeur, puis aussi avec une référence (en initialisant à chaque fois dans le header), mais la seule chose que j'obtiens est un sprite vide... un petit carré blanc aux coordonnées que j'ai défini dans le 'if' de ma méthode 'update()'.

    Sur GitHub (https://github.com/Tiv76/TivWorld) j'ai remis mon code tel qu'il était avant cette dernière modification infructueuse.

    Donc je ne sais pas comment m'y prendre... A l'aide !!!

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Si le sprite est complètement blanc, cela peut être une erreur de chargement.
    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.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut
    Merci pour cette indication.

    Si par erreur de chargement tu entends un problème de fichier image source, ou de chemin, j'ai vérifié.
    J'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Character &myHostile = Character("Robot1", sf::Vector2f(700, 100));
    dans le header de ma classe 'Game' (en 'private')
    et dans la méthode 'Render()' de ma classe 'Game' j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myWindow.draw(myHostile.GetSprite());
    Dans ce cas le "méchant" s'affiche bien comme il le faut.

    En revanche j'ai testé autrement...
    J'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Character &myHostile = Character();
    dans le header de ma classe 'Game' (en 'private')
    et dans la méthode 'Render()' de ma classe 'Game' j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myHostile = Character(type, sf::Vector2f(700, 100));
    myWindow.draw(myHostile.GetSprite());
    Dans ce cas le sprite est vide (bonne position mais carré blanc).

    J'ai apparemment réglé mon problème de cette manière :
    J'ai ajouté une méthode 'SetType' à ma classe 'Character' qui me permet, en lui passant un type de "méchant" en paramètre ('string') de redéfinir le 'Character' initialisé avec le constructeur par défaut de la Classe 'Character' (initialisation que j'ai faite dans le header de ma classe 'Game'.

    Je vais bientôt faire un update sur GitHub... mais encore un peu de travail pour fignoler ça avant...

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut Nouvel update sur GitHub
    Ca y est... je viens de faire mon nouvel update... https://github.com/Tiv76/TivWorld

    Les Méchants s'affichent bien en fonction du nombre et des attributs contenus dans les fichiers textes des cartes, et en prime ils bougent tout seul de manière aléatoire.

    Il faut encore que je les empêche de marcher au travers des murs, obstacles... puis adapter leurs mouvements pour qu'ils bougent de manière aléatoire comme maintenant mais en plus, dès qu'un "méchant" se trouve à une certaine distance du personnage principale, qu'il se dirige dessus avec une légère augmentation de vitesse.

    Enfin c'est tout pour ce soir... je m'y remets plus tard

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut Vidéo...
    Au cas où, une petite vidéo pour voir le résultat à ce point de mon code :
    http://1drv.ms/1FK2Rnu

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Février 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 59
    Points : 34
    Points
    34
    Par défaut
    Pour le moment ça avance toujours... lentement mais ça avance...

    j'ai changer les graphismes du personnage principal, celui des "méchants" (il y en a pour le moment 8 différents) et maintenant on peut entrer et sortir des maisons.

    Enfin il y a encore beaucoup de travail...

    (Pour voir mon code : https://github.com/Tiv76/TivWorld, et une petite vidéo pour voir le rendu : http://1drv.ms/1GF1vtv)

Discussions similaires

  1. [Free Pascal] Jeu d'arcade : besoin d'aide pour résoudre un problème
    Par kingmodi dans le forum Free Pascal
    Réponses: 2
    Dernier message: 09/11/2014, 11h48
  2. Réponses: 1
    Dernier message: 02/06/2008, 20h31
  3. Besoin d'aide pour un projet de jeu en ligne
    Par FLEO dans le forum Projets
    Réponses: 1
    Dernier message: 21/10/2005, 08h55

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