Constructores y destructores de clases
Los constructores de las clases definidas en stars.hpp
deben inicializar las variables miembro de las clases. Esta parte es relativamente simple e incluso se pueden usar los destructores predeterminados, así que implemente estos constructores por su cuenta:
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]);
Consejo: Tenga en cuenta que al inicializar la variable de velocidad, conviértala a velocidad angular. La fórmula de conversión es: alpha_speed = 360/speed
.
Para el constructor de solarsystem.cpp
, necesitamos inicializar todos los planetas. Aquí se proporcionan los parámetros entre los planetas para mayor conveniencia:
// Radio de revolución
#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
// Distancia al sol
#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
// Velocidad de movimiento
#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
// Velocidad de autorrotación
#define SELFROTATE 3
// Definir una macro para facilitar la configuración de una matriz multidimensional
#define SET_VALUE_3(name, value0, value1, value2) \
((name)[0])=(value0), ((name)[1])=(value1), ((name)[2])=(value2)
// En el experimento anterior, definimos el enum de los planetas
enum STARS {Sun, Mercury, Venus, Earth, Moon,
Mars, Jupiter, Saturn, Uranus, Neptune};
Consejo:
Definimos una macro SET_VALUE_3
aquí. Usted puede pensar que podemos escribir una función para lograr el mismo propósito.
De hecho, las macros completan el trabajo de sustitución general durante el proceso de compilación, mientras que la definición de funciones
Esto requiere operaciones de pila de funciones durante la llamada, lo que es mucho menos eficiente que el procesamiento de macros durante el proceso de compilación.
Por lo tanto, las macros pueden ser más eficientes.
Sin embargo, es importante tener en cuenta que aunque las macros pueden ser más eficientes, el uso excesivo puede conducir a un código feo y menos legible. Por otro lado, se alienta el uso adecuado de macros.
Por lo tanto, podemos implementar el constructor de la clase SolarSystem
, donde los colores de los planetas se seleccionan al azar. Los lectores pueden cambiar los colores de los planetas por sí mismos:
SolarSystem::SolarSystem() {
// Definir la vista en perspectiva, como hemos discutido la inicialización de la vista en perspectiva antes
viewX = 0;
viewY = REST_Y;
viewZ = REST_Z;
centerX = centerY = centerZ = 0;
upX = upY = 0;
upZ = 1;
// Sol
GLfloat rgbColor[3] = {1, 0, 0};
stars[Sun] = new LightPlanet(SUN_RADIUS, 0, 0, SELFROTATE, 0, rgbColor);
// Mercurio
SET_VALUE_3(rgbColor,.2,.2,.5);
stars[Mercury] = new Planet(MER_RADIUS, MER_DIS, MER_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Venus
SET_VALUE_3(rgbColor, 1,.7, 0);
stars[Venus] = new Planet(VEN_RADIUS, VEN_DIS, VEN_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Tierra
SET_VALUE_3(rgbColor, 0, 1, 0);
stars[Earth] = new Planet(EAR_RADIUS, EAR_DIS, EAR_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Luna
SET_VALUE_3(rgbColor, 1, 1, 0);
stars[Moon] = new Planet(MOO_RADIUS, MOO_DIS, MOO_SPEED, SELFROTATE, stars[Earth], rgbColor);
// Marte
SET_VALUE_3(rgbColor, 1,.5,.5);
stars[Mars] = new Planet(MAR_RADIUS, MAR_DIS, MAR_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Júpiter
SET_VALUE_3(rgbColor, 1, 1,.5);
stars[Jupiter] = new Planet(JUP_RADIUS, JUP_DIS, JUP_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Saturno
SET_VALUE_3(rgbColor,.5, 1,.5);
stars[Saturn] = new Planet(SAT_RADIUS, SAT_DIS, SAT_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Urano
SET_VALUE_3(rgbColor,.4,.4,.4);
stars[Uranus] = new Planet(URA_RADIUS, URA_DIS, URA_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Neptuno
SET_VALUE_3(rgbColor,.5,.5, 1);
stars[Neptune] = new Planet(NEP_RADIUS, NEP_DIS, NEP_SPEED, SELFROTATE, stars[Sun], rgbColor);
}
Además, no olvide liberar la memoria asignada en el destructor:
SolarSystem::~SolarSystem() {
for(int i = 0; i<STARS_NUM; i++)
delete stars[i];
}