# Applications > Dveloppement 2D, 3D et Jeux > Moteurs de jeux vido >  Jeu Zelda-like : besoin d'aide

## Tiv76

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 faon "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 rcupre les informations depuis les fichiers textes afin de crer les carte et les afficher
- une classe "Character" qui gre la cration, l'animation et les mouvements du personnage principal (et ventuellement des mchants)
- une classe "CollisionManager" qui actuellement ne gre que les collision avec le dcor afin d'viter au personnage de traverser les murs...
- une classe "ExitManager" qui gre 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-mme (simple  faire)
- j'ai aussi des tileset (gnration de carte, animation de personnage) que je cr  partir de ce que je trouve sur Google (par crer j'entends que je coupe des morceaux qui m'intresse depuis un tileset trouv sur Google pour les rorganiser dans un autre tileset)

Il y a donc des ajouts  faire :
- une classe "Weapon" pour grer des armes (animations, dgats...) ce qui entranera l'ajout d'attributs dans la classe "Character" (attributs de vie...)
- ...

Actuellement je rencontre un problme concernant la gnration des mchants... 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 gnrer et les afficher en fonctions de ces informations qui diffrent donc  chaque changement de carte.

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

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.

----------


## LittleWhite

Bonjour,

J'espre que je ne suis pas hors sujet.


```

```

Je mettrais ce genre de constante, en statique, dans une classe "Config". Il n'y a pas de vraies raisons derrire cela, juste pour les regroupper et les mettre dans une entit (une classe) approprie et explicite.

Certains programmeurs disent que le main doit tre pratiquement vide. Son but n'est juste de faire des vrifications ultra basiques et de lancer le programme. Gnralement, je fais une classe Game, qui possde une mthode run(), pour lancer le jeu et une mthode render() et update() en prive. La mthode update gre entre autre les vnements (mme si l'appuie des boutons, j'aime bien la dcentraliser dans une autre classe), et le render(), l'affichage.

Question de smantique :


```

```

Si ce sont des listes (d'aprs le nom, et le nom "myList" n'est absolument pas explicite ce qui gne  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 dbutant, que la map, c'est un peu la structure qui rsoud tous les problmes. Mais au final, c'est  viter, ou,  n'utiliser que si le besoin est rel.

D'ailleurs, la std::map vous a bloqu :


```
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 rsultat 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 problmes disparaissent simplement et immdiatement.

PositionTest() aurait pu tre statique, d'aprs moi.
CollisionTest() aussi.
Je dis a, c'est d'un point de vue smantique, 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.



```
const std::string GetType() const;
```

Il est prfrable de retourner une rfrence constante pour viter la copie.

Pour Character, il y a beaucoup de membre. On dirait donc qu'un hritage (genre, Character hrite d'une classe Drawable, pour grer le sprite et son affichage) pourrait tre bnfique.



```

```

Je pense que cela pourrait tre dport dans une Factory (un design pattern conu pour cela).

----------


## Tiv76

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  ::D:

----------


## Tiv76

Salut LittleWhite,

J'avance... lentement, car pas beaucoup de temps sauf le weekend et j'apprends de nouvelles choses grce  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 dj  jour sur GitHub.

J'ai attaqu l'ajout d'une classe "Game" (dsol je te pique le nom  ::D:  ainsi que pour tes mthodes, run, render et update).

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

Je pense que dans la journe de lundi (23/03) la mise  jour sur GitHub devrait tre faire pour cette partie.

Encore merci.

----------


## Tiv76

Ca y est, LittleWhite, la mise a jour annonce peu aprs minuit est faite et visible sur GitHub (https://github.com/Tiv76/TivWorld).
J'ai aussi chang le retour de la mthode 'GetType()' de ma classe 'Character' afin d'avoir une rfrence en retour.

Je passe  la suite... encore du travail pour finir la liste que tu m'as donne  :;):

----------


## Tiv76

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 mthodes pour accder  ces 2 'vector'.

J'ai gard la 'map' pour grer la liste des "mchants" car la liste doit contenir les types et position X et Y des "mchants"

Du coup il ne me reste plus qu'une conversion 'stoi' pour rcuprer le nombre de "mchants" 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 mre qui contiendra tout ce qui est communs aux 2 classes filles : 1 pour le personnage principale et 1 pour les "mchants".

----------


## LittleWhite

Petite parenthse sur le stoi : http://cpp.developpez.com/faq/cpp/?p...g-en-un-entier Voici la mthode C++.

----------


## Tiv76

Merci  :;):

----------


## Tiv76

Je suis  la recherche d'une piste pour pouvoir grer l'affichage des "mchants".

Leurs nombre, position X et position Y sont stocks dans une 'map' ('listHostile' dans la classe 'Level'). Cette 'map' est gnre  partir d'informations rcupres dans les fichiers texte de chaque carte.

Donc leur nombre et leur positions changent  chaque carte.

J'ai fait une tentative en modifiant la mthode 'PositionTest()' de ma classe 'ExitManager' afin de retourner un boolen ('true' quand il y a sortie de carte).
Dans le header de ma classe 'Game' j'avais ajout en attribut priv


```
Character myHostile = Character();
```

Puis dans la mthode 'update()' de ma classe 'Game'  la place de 


```
myExitManager.PositionTest();
```

J'avais mis


```

```

Et enfin dans la mthode 'Render()' de ma classe 'Game' j'avais ajout


```
myWindow.draw(myHostile.GetSprite());
```

J'ai essay tel quel, puis avec un pointeur,  puis aussi avec une rfrence (en initialisant  chaque fois dans le header), mais la seule chose que j'obtiens est un sprite vide... un petit carr blanc aux coordonnes que j'ai dfini dans le 'if' de ma mthode 'update()'.

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

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

----------


## LittleWhite

Si le sprite est compltement blanc, cela peut tre une erreur de chargement.

----------


## Tiv76

Merci pour cette indication.

Si par erreur de chargement tu entends un problme de fichier image source, ou de chemin, j'ai vrifi.
J'ai ajout


```
Character &myHostile = Character("Robot1", sf::Vector2f(700, 100));
```

dans le header de ma classe 'Game' (en 'private')
et dans la mthode 'Render()' de ma classe 'Game' j'ai ajout


```
myWindow.draw(myHostile.GetSprite());
```

Dans ce cas le "mchant" s'affiche bien comme il le faut.

En revanche j'ai test autrement...
J'ai ajout


```
Character &myHostile = Character();
```

dans le header de ma classe 'Game' (en 'private')
et dans la mthode 'Render()' de ma classe 'Game' j'ai ajout


```

```

Dans ce cas le sprite est vide (bonne position mais carr blanc).

J'ai apparemment rgl mon problme de cette manire :
J'ai ajout une mthode 'SetType'  ma classe 'Character' qui me permet, en lui passant un type de "mchant" en paramtre ('string') de redfinir le 'Character' initialis avec le constructeur par dfaut de la Classe 'Character' (initialisation que j'ai faite dans le header de ma classe 'Game'.

Je vais bientt faire un update sur GitHub... mais encore un peu de travail pour fignoler a avant...

----------


## Tiv76

Ca y est... je viens de faire mon nouvel update... https://github.com/Tiv76/TivWorld

Les Mchants 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 manire alatoire.

Il faut encore que je les empche de marcher au travers des murs, obstacles... puis adapter leurs mouvements pour qu'ils bougent de manire alatoire comme maintenant mais en plus, ds qu'un "mchant" se trouve  une certaine distance du personnage principale, qu'il se dirige dessus avec une lgre augmentation de vitesse.

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

----------


## Tiv76

Au cas o, une petite vido pour voir le rsultat  ce point de mon code :
http://1drv.ms/1FK2Rnu

----------


## Tiv76

Pour le moment a avance toujours... lentement mais a avance...

j'ai changer les graphismes du personnage principal, celui des "mchants" (il y en a pour le moment 8 diffrents) 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 vido pour voir le rendu : http://1drv.ms/1GF1vtv)

----------

