J'apprends à faire un jeu pour une école. Dans ce jeu, j'ai trois différents types de navires: destroyer, transporteur, et un bateau de vitesse. Je publierai un ENUM EntityType:C++ - Lors de la création d'entités de jeu, devrais-je utiliser des "sous-classes" ou des structures?
enum EntityType {DESTROYER, CARRIER, SPEEDBOAT};
Je dois avoir une classe entité qui ressemble à:
class Enitity
{
private:
float acceleration, turnRate, maxSpeed, minSpeed;
std::string entityType;
public:
Entity(EntityType type);
~Entity();
//Rest of class
};
Pour chaque type de navire, ils ont des valeurs différentes. J'ai des valeurs différentes pour chaque type de navire et j'essaie de trouver la meilleure façon d'initialiser chaque type de navire. J'ai pensé à trois façons de le faire. J'essaie aussi de faire en sorte que je puisse tirer parti de cela à l'avenir à mesure que j'aurai plus de types de navires.
Option 1: Créer un fichier qui contient une struct EntityData et crée des données pour chaque type de navire comme:
struct EntityData
{
float acceleration, turnRate, maxSpeed, minSpeed;
std::string entityType;
};
EntityData DestroyerData;
DestroyerData.acceleration = 5;
DestroyerData.turnRate = 2;
DestroyerData.maxSpeed = 35;
DestroyerData.minSpeed = 0;
DestroyerData.entityType = "Destroyer";
EntityData CarrierData;
CarrierData.acceleration =2;
.....
Ensuite, dans le constructeur de la classe des entités ont une instruction switch que si le entityType est DESTROYER définir les données de la classe aux données de la structure.
Entity::Entity(EntityType type)
{
EntityData data;
switch (type)
{
case EntityType::DESTROYER:
data = DestroyerData;
break;
case EntityType::CARRIER:
break;
default:
break;
}
acceleration = data.acceleration;
maxSpeed = data.maxSpeed;
//Rest of variables
}
Option 2: utiliser l'héritage et de faire la classe entité la classe de base et ont chaque type de navire ont sa propre classe. Dans sa classe, il suffit d'initialiser ces valeurs dans le constructeur.
class Destroyer : public Entity
{
public:
Entity(EntityType type);
~Entity();
//Rest of class
};
Destroyer::Destroyer()
: acceleration(5),
maxSpeed(35),
//Rest of variables
{
}
Option 3: disposent de toutes les informations contenues dans la classe entité basée hors du type d'entité à l'aide d'une instruction switch dans le constructeur de l'entité et ne pas utiliser les struct de données ou classes héritées?
Entity::Entity(EntityType type)
{
switch (type)
{
case EntityType::DESTROYER:
maxSpeed = 42;
//TODO: Set the rest of the variables for the DESTROYER
break;
case EntityType::CARRIER:
//TODO: Set the rest of the variables for the CARRIER
maxSpeed = 55;
break;
default:
break;
}
}
Quelle est la meilleure méthode et pourquoi?
Si le vote vers le bas - S'il vous plaît expliquer pourquoi vous voter contre je peux améliorer ma question.
Comment voulez-vous que cela affecte les performances en particulier? –
Peut-être une classe "Ship" générique qui est construite et initialisée par une fonction d'usine qui définit les valeurs par défaut selon le type (à partir d'un tableau ou d'une carte des "types d'expédition" prédéfinis, n'utilisant pas une instruction 'switch' ou similaire)? –
Si tous les vaisseaux ont le même ensemble de paramètres et que seules les valeurs diffèrent, l'héritage et la définition d'une structure propre pour chaque type sont excessifs. Utilisez simplement différents objets de la même classe. –