Il y a deux classes dans mon jeu qui sont vraiment utiles, mais qui deviennent lentement une douleur. Message et propriété (la propriété est essentiellement un composant).
Ils dérivent tous les deux d'une classe de base et contiennent un identifiant statique afin que les systèmes ne puissent prêter attention qu'à ceux qu'ils souhaitent. Ça marche très bien ... sauf ...
Je crée constamment de nouveaux types de messages et de propriétés au fur et à mesure que j'étends mon jeu. Chaque fois, j'ai besoin d'écrire 2 fichiers (hpp et cpp) et une tonne de passe-partout pour obtenir essentiellement un classID et un ou deux types de données standard ou un pointeur.
Cela commence à faire du jeu et à tester de nouvelles idées une véritable corvée. Je souhaite quand je veux créer un nouveau type de message ou de propriété, je veux pouvoir simplement taper quelque chose comme
ShootableProperty: int gunType, float shotspeed;
ItemCollectedMessage: int itemType;
au lieu de créer un en-tête et un fichier cpp, écrire un constructeur, y compris la classe parente, etc.
C'est environ 20 à 40 lignes (y compris les gardes, et tout) juste pour faire ce qui est logiquement 1 ou 2 lignes dans mon esprit.
Existe-t-il un modèle de programmation pour contourner ce problème?
Qu'en est-il des scripts (dont je ne sais rien) ... existe-t-il un moyen de définir un tas de classes qui sont presque les mêmes?
Voici exactement à quoi ressemble une classe:
// Velocity.h
#ifndef VELOCITY_H_
#define VELOCITY_H_
#include "Properties.h"
#include <SFML/System/Vector2.hpp>
namespace LaB
{
namespace P
{
class Velocity: public LaB::Property
{
public:
static const PropertyID id;
Velocity(float vx = 0.0, float vy = 0.0)
: velocity(vx,vy) {}
Velocity(sf::Vector2f v) : velocity(v) {};
sf::Vector2f velocity;
};
} /* namespace P */
} /* namespace LaB */
#endif /* LaB::P_VELOCITY_H_ */
// Velocity.cpp
#include "Properties/Velocity.h"
namespace LaB
{
namespace P
{
const PropertyID Velocity::id = Property::registerID();
} /* namespace P */
} /* namespace LaB */
Tout cela juste pour un vecteur 2D et un identifiant disant d'attendre un vecteur 2D. (Certes, certaines propriétés ont des éléments plus compliqués, mais c'est la même idée)