Constructeurs et destructeurs de classes
Les constructeurs des classes définies dans stars.hpp
doivent initialiser les variables membres des classes. Cette partie est relativement simple et on peut même utiliser les destructeurs par défaut, donc veuillez implémenter ces constructeurs vous-même :
Star::Star(GLfloat radius, GLfloat distance,
GLfloat speed, GLfloat selfSpeed,
Star* parent);
Planet::Planet(GLfloat radius, GLfloat distance,
GLfloat speed, GLfloat selfSpeed,
Star* parent, GLfloat rgbColor[3]);
LightPlanet::LightPlanet(GLfloat radius, GLfloat distance,
GLfloat speed, GLfloat selfSpeed,
Star* parent, GLfloat rgbColor[3]);
Indication : Notez que lors de l'initialisation de la variable de vitesse, convertissez-la en vitesse angulaire. La formule de conversion est : alpha_speed = 360/speed
.
Pour le constructeur de solarsystem.cpp
, nous devons initialiser tous les planètes. Ici, nous fournissons les paramètres entre les planètes pour la commodité :
// Rayon de révolution
#define SUN_RADIUS 48.74
#define MER_RADIUS 7.32
#define VEN_RADIUS 18.15
#define EAR_RADIUS 19.13
#define MOO_RADIUS 6.15
#define MAR_RADIUS 10.19
#define JUP_RADIUS 42.90
#define SAT_RADIUS 36.16
#define URA_RADIUS 25.56
#define NEP_RADIUS 24.78
// Distance au soleil
#define MER_DIS 62.06
#define VEN_DIS 115.56
#define EAR_DIS 168.00
#define MOO_DIS 26.01
#define MAR_DIS 228.00
#define JUP_DIS 333.40
#define SAT_DIS 428.10
#define URA_DIS 848.00
#define NEP_DIS 949.10
// Vitesse de mouvement
#define MER_SPEED 87.0
#define VEN_SPEED 225.0
#define EAR_SPEED 365.0
#define MOO_SPEED 30.0
#define MAR_SPEED 687.0
#define JUP_SPEED 1298.4
#define SAT_SPEED 3225.6
#define URA_SPEED 3066.4
#define NEP_SPEED 6014.8
// Vitesse de rotation sur soi-même
#define SELFROTATE 3
// Définir une macro pour faciliter la définition d'un tableau multidimensionnel
#define SET_VALUE_3(name, value0, value1, value2) \
((name)[0])=(value0), ((name)[1])=(value1), ((name)[2])=(value2)
// Dans l'expérience précédente, nous avons défini l'énum des planètes
enum STARS {Sun, Mercury, Venus, Earth, Moon,
Mars, Jupiter, Saturn, Uranus, Neptune};
Indication :
Nous définissons une macro SET_VALUE_3
ici. Vous pourriez penser que nous pourrions écrire une fonction pour atteindre le même but.
En fait, les macros effectuent le travail de substitution globale lors du processus de compilation, tandis que la définition de fonctions
Cela nécessite des opérations de pile de fonction lors de l'appel, ce qui est beaucoup moins efficace que le traitement par macro lors du processus de compilation.
Par conséquent, les macros peuvent être plus efficaces.
Cependant, il est important de noter que bien que les macros puissent être plus efficaces, une utilisation excessive peut conduire à du code laid et moins lisible. Par contre, une utilisation appropriée des macros est encouragée.
Par conséquent, nous pouvons implémenter le constructeur de la classe SolarSystem
, où les couleurs des planètes sont sélectionnées aléatoirement. Les lecteurs peuvent changer les couleurs des planètes eux-mêmes :
SolarSystem::SolarSystem() {
// Définir la vue en perspective, comme nous avons discuté de l'initialisation de la vue en perspective auparavant
viewX = 0;
viewY = REST_Y;
viewZ = REST_Z;
centerX = centerY = centerZ = 0;
upX = upY = 0;
upZ = 1;
// Soleil
GLfloat rgbColor[3] = {1, 0, 0};
stars[Sun] = new LightPlanet(SUN_RADIUS, 0, 0, SELFROTATE, 0, rgbColor);
// Mercure
SET_VALUE_3(rgbColor,.2,.2,.5);
stars[Mercury] = new Planet(MER_RADIUS, MER_DIS, MER_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Vénus
SET_VALUE_3(rgbColor, 1,.7, 0);
stars[Venus] = new Planet(VEN_RADIUS, VEN_DIS, VEN_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Terre
SET_VALUE_3(rgbColor, 0, 1, 0);
stars[Earth] = new Planet(EAR_RADIUS, EAR_DIS, EAR_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Lune
SET_VALUE_3(rgbColor, 1, 1, 0);
stars[Moon] = new Planet(MOO_RADIUS, MOO_DIS, MOO_SPEED, SELFROTATE, stars[Earth], rgbColor);
// Mars
SET_VALUE_3(rgbColor, 1,.5,.5);
stars[Mars] = new Planet(MAR_RADIUS, MAR_DIS, MAR_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Jupiter
SET_VALUE_3(rgbColor, 1, 1,.5);
stars[Jupiter] = new Planet(JUP_RADIUS, JUP_DIS, JUP_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Saturne
SET_VALUE_3(rgbColor,.5, 1,.5);
stars[Saturn] = new Planet(SAT_RADIUS, SAT_DIS, SAT_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Uranus
SET_VALUE_3(rgbColor,.4,.4,.4);
stars[Uranus] = new Planet(URA_RADIUS, URA_DIS, URA_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Neptune
SET_VALUE_3(rgbColor,.5,.5, 1);
stars[Neptune] = new Planet(NEP_RADIUS, NEP_DIS, NEP_SPEED, SELFROTATE, stars[Sun], rgbColor);
}
En outre, n'oubliez pas de libérer la mémoire allouée dans le destructeur :
SolarSystem::~SolarSystem() {
for(int i = 0; i<STARS_NUM; i++)
delete stars[i];
}