1 pièce(s) jointe(s)
Jeu de plateforme POO : Problème de design
Bonjour,
Je suis actuellement en train de développer un jeu de plateforme en 2D (en C++/OpenGL) afin de m'exercer à la programmation orientée objet mais je me retrouve face à un problème
Tout d'abord, voici ma logique de conception :
Pièce jointe 502446
Moveable est une classe abstraite où la méthode "move" et "moveOnMap" doivent être redéfinie. La méthode moveOnMap prend un pointeur sur la map dans laquelle le "Character" (ou "Item") va évoluer. Ainsi, lorsque l'on appellera la méthode "move", elle fera appel à la map afin de lui demander s'il y a une collision à telle ou telle position et ainsi mettre à jour sa vitesse et son accélération.
La classe SpriteRenderer est commune pour tous les Sprite et permet d'afficher celui-ci à l'écran.
La classe Transformable permet de définir une origine et effectuer des translations, rotations et mises à l'échelles sur le Sprite pour l'affichage.
La classe Item représente un objet quelconque soumis à la gravité ainsi qu'aux différentes collisions sur la TileMap (d'où le fait qu'elle hérite de Moveable).
La classe Character représente un joueur qui, en plus d'être soumis à la gravité et aux collisions sur la TileMap, peut sauter et se déplacer à gauche ou à droite.
La classe TileMap représente une map et possède des méthodes permettant de vérifier si un Sprite touche un item ou un joueur inscrit dans la TileMap
Mon problème est le suivant :
Chaque objet Moveable doit s'inscrire sur une map dans laquelle il évolue. Ceci afin de faire appel aux fonctions de la map permettant de savoir s'il touche d'autres objets qui se sont inscrits dans la même TileMap. Pour ce faire, la méthode "moveOnMap" de Item et Character fait appel respectivement à la méthode "addItem" et "addPlayer" de TileMap. Ces méthodes prennent un shared_ptr en argument.
Le problème étant que je dois construire un shared_ptr sur l'objet dans lequel je suis actuellement (puisque je le fais dans "moveOnMap"). Je n'ai donc d'autres choix que d'hériter de "enable_shared_from_this<T>" afin de pouvoir récupérer un shared_ptr sur this. Cela veut également dire que Character et Item doivent être gérées via un shared_ptr pour ne pas perdre la ressources lorsque je retirerai le joueur ou l'item de la TileMap. Or je veux pouvoir créer un Character ou un Item sur la pile.
Un moyen de résoudre ce problème serait de prendre un pointeur nu en argument de "addItem" et "addPlayer" mais n'est-il pas possible de régler ce problème tout en gardant les pointeurs intelligents ?
Un deuxième problème est que j'aimerais cacher les méthodes "addItem" et "addPlayer" pour qu'elles ne puissent être utilisées que par un Moveable.
PS: C'est mon premier projet en orienté objet et je me doute que l'architecture laisse à désirer sur de nombreux points. Je suis d'ailleurs preneur si vous voyez des choses qui pourraient être améliorées ou qui ne sont pas correctes ou pas logiques.