On ne fait rien sans SVN, et je le sais depuis que je l'utilise
Je n'ai pas compris pour le debug, mais je sais qu'il faudra que je les désactive pour la release. Sinon je ne vois pas desquelles vous parler ( exemple de code ? )
------
Bonjour à tous,
Aujourd'hui on attaque directement avec un nouveau cursor, pour l'éditeur qui va avoir la possibilité de changer d'image si on ne peut pas poser la tuile sur son emplacement.
Pour cela, j'hérite la classe Cursor, pour un EditingCursor.
Dans cet héritage, je n'ajoute qu'un boulean est une fonction qui indique si le curseur est dans le mauvais mode, ou pas et pour changer son état.
Voici la déclaration du EditingCursor:
Bien sur, j'ai du changer un peu le code de la classe Cursor, pour accepter l'héritage.
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 class EditingCursor : public Cursor { private: AnimatedSprite* pWrongCursorSprite; bool isWrong; public: EditingCursor(SpriteManager& sm, const std::string& fileNameCursor, const std::string& fileNameWrongCursor, const Map* const pMap, const UVec2& initialPosition); ~EditingCursor(void); bool getIsWrong(void)const { return isWrong; } void setIsWrong(const bool isWrong) { this->isWrong = isWrong; } virtual bool draw(const Renderer& r, const Camera& c, const unsigned int time)const; };
Le seul code important qu'il y a dans le EditingCursor, c'est:
Oui, il n'y a qu'un test qui change
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 bool EditingCursor :: draw(const Renderer& r, const Camera& c, const unsigned int time)const { UVec2 cameraPosition = c.getPosition(); IVec2 screenPosition = IVec2((this->position.x - cameraPosition.x ) * (static_cast<int>(Scaler::getXScaleFactor() * TILE_DEFAULT_WIDTH)), (this->position.y - cameraPosition.y ) * (static_cast<int>(Scaler::getYScaleFactor() * TILE_DEFAULT_HEIGHT))); if ( isWrong ) { return r.drawTile(*pWrongCursorSprite,screenPosition,time); } else { return r.drawTile(*pCursorSprite,screenPosition,time); } }
Et je rajoute ça dans le main:
Et ça fonctionne, encore heureux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ec.setIsWrong(!m.testTile(ec.getPosition(),buildingTB.getSelected()));
Comme on peut le voir dans la capture ( ou presque ), on ne peut pas mettre de plage sur de la plaine :p.
Bon maintenant, j'attaque la deuxième chose que je n'aime pas \o/
Une autre interface pour l'utilisateur, mais beaucoup plus simple que la TileBar. Effectivement, là on se rend compte que lorsque l'on selectionne une tuile, nous ne savons pas laquelle nous appliquons. Maintenant je vais donc rajouter une petite interface qui va indiquer la tuile sélectionné ( au cas ou que l'utilisateur à la mémoire courte )
L'interface est composé de:
Une image de fond, un titre, un nom, et l'image de la tuile ( sans animation, dans la jeu original ). C'est tout.
Mais cela n'est pas vraiment très immédiat, car jusque là, je n'avais pas intégré SDL_TTF, et tout ce qui va avec ( un manager de police ).
Il est un peu différent de celui des sprites. Notamment, parce que celui là, il prend en compte, le chemin ( comme ID ) mais aussi la taille.
Cela complique légèrement la fonction qui récupère la police car elle doit faire ce qui suit:
- Vérifié si le chemin de la police est connu
- Non, alors on charge la police, et on stocke
- Oui:
- Verification des tailles des polices chargé pour ce chemin
- On a trouvé, on retourne
- On a pas trouvé, on charge
Voilà.
Maintenant, il faut une jolie classe Font, pour avoir tous les outils à porter de main sans toucher la SDL.
La classe aura pour faculter de dessiner du texte ( en utilisant toujours le renderer ), de connaitre la taille du texte qui va être déssiné ( longueur, largeur ), et puis contiendra la couleur.
Il n'y a rien de spécial sur cette classe, elle ressemble à la classe Sprite, mais pour les polices.
Maintenant je peux enfin attaquer l'interface utilisateur
La classe va s'appeler TileViewer, et ne va être présente que dans l'éditeur.
Pour avoir le nom d'une tuile, j'ai rajouté dans le fichier Tile, un parser sur le type de la tuile, qui retourne le nom. C'est une des méthodes que je pouvaient faire, et en fait, plus tard, il faudrait mieux que je remplace tout ça par une bibliothèque, venant d'un fichier par exemple.
Finalement, dans le main, je rajoute un code pour pouvoir affiché la boite d'information soit à gauche soit à droite, selon la position du cursueur ( le curseur ne doit pas être caché ).
Cette condition appelle une fonction qui change la position en X de toute la boite. Le dessin des éléments de la boite se base tous sur cette position, donc en changeant une valeur, je change tout, sans rien cassé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if ( buildingTB.isClosed() ) { tileInformationViewer.draw(*r); }
Et finalement la boite n'est affiché que lorsque le menu ( pour les tuile ( la TileBar donc ) ) n'est pas affiché.
Voilà, ça fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // Check if we have to move the TIleViewer if ( ec.getPosition().y >= 6 ) { if ( ec.getPosition().x <= 2 ) { tileInformationViewer.putOnRight(); } else if ( ec.getPosition().x >= 13 ) { tileInformationViewer.putOnLeft(); } }
En dernière modification de la journée, j'ai viré le compteur d'allocation / désallocations pour les Tile depuis que mes tuile sont toutes statiques ( aucun pointeur utilisé pour les tuiles )
Partager