2017-03-07 3 views
-3

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.

+0

Comment voulez-vous que cela affecte les performances en particulier? –

+0

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)? –

+1

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. –

Répondre

1

La meilleure façon d'utiliser C++ OOP serait avec l'héritage. Cela vous permettrait d'utiliser une flotte std :: vector < * genericShip>, et de stocker les trois types à l'intérieur. De plus, si, par exemple, un destroyer pouvait tirer un canon, un transporteur pourrait lancer un avion, mais un bateau de vitesse ne le pourrait pas, cette approche vous permettrait d'implémenter des fonctions pour chacun. Un autre avantage est que si vous avez besoin de modifier individuellement des valeurs pour des vaisseaux spécifiques, cela est autorisé dans cette approche, et enfin, vous pouvez ajouter de nouveaux vaisseaux facilement.

+0

Donc je devrais aller avec l'option 2? – kingcobra1986

+0

Oui. Peut-être mettre en œuvre une usine plus tard, mais commencez par 2 –

+0

Qu'est-ce qu'une usine? – kingcobra1986