Bonjour,
J'espère que je ne suis pas hors sujet.
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 :
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é :
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.
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.
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).
Partager