Конструкторы и деструкторы классов
Конструкторы классов, определенных в stars.hpp
, должны инициализировать член-данные классов. Эта часть относительно простая, и даже можно использовать дефолтные деструкторы, поэтому реализуйте эти конструкторы самостоятельно:
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]);
Совет: Обратите внимание, что при инициализации переменной скорости нужно преобразовать ее в угловую скорость. Формула преобразования: alpha_speed = 360/speed
.
Для конструктора solarsystem.cpp
нам нужно инициализировать все планеты. Здесь мы предоставляем параметры между планетами для удобства:
// Радиус公转
#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
// Расстояние от солнца
#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
// Скорость движения
#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
// Скорость вращения вокруг собственной оси
#define SELFROTATE 3
// Определяем макрос для удобства установки многомерного массива
#define SET_VALUE_3(name, value0, value1, value2) \
((name)[0])=(value0), ((name)[1])=(value1), ((name)[2])=(value2)
// В предыдущем эксперименте мы определили перечисление планет
enum STARS {Sun, Mercury, Venus, Earth, Moon,
Mars, Jupiter, Saturn, Uranus, Neptune};
Совет:
Мы определяем макрос SET_VALUE_3
здесь. Вы, возможно, подумаете, что мы можем написать функцию для достижения той же цели.
Фактически макросы выполняют всю работу по замене в процессе компиляции, в то время как определение функций
Требует операций стека функций при вызове, что на порядок менее эффективно, чем обработка макросов в процессе компиляции.
Поэтому макросы могут быть более эффективными.
Однако стоит отметить, что хотя макросы могут быть более эффективными, чрезмерное их использование может привести к некрасивому и менее читаемому коду. С другой стороны, рекомендуется использовать макросы разумно.
Поэтому мы можем реализовать конструктор класса SolarSystem
, где цвета планет выбираются случайным образом. Читатели могут изменить цвета планет самостоятельно:
SolarSystem::SolarSystem() {
// Определяем перспективное представление, как мы обсуждали инициализацию перспективного представления ранее
viewX = 0;
viewY = REST_Y;
viewZ = REST_Z;
centerX = centerY = centerZ = 0;
upX = upY = 0;
upZ = 1;
// Сонце
GLfloat rgbColor[3] = {1, 0, 0};
stars[Sun] = new LightPlanet(SUN_RADIUS, 0, 0, SELFROTATE, 0, rgbColor);
// Меркурий
SET_VALUE_3(rgbColor,.2,.2,.5);
stars[Mercury] = new Planet(MER_RADIUS, MER_DIS, MER_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Венера
SET_VALUE_3(rgbColor, 1,.7, 0);
stars[Venus] = new Planet(VEN_RADIUS, VEN_DIS, VEN_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Земля
SET_VALUE_3(rgbColor, 0, 1, 0);
stars[Earth] = new Planet(EAR_RADIUS, EAR_DIS, EAR_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Луна
SET_VALUE_3(rgbColor, 1, 1, 0);
stars[Moon] = new Planet(MOO_RADIUS, MOO_DIS, MOO_SPEED, SELFROTATE, stars[Earth], rgbColor);
// Марс
SET_VALUE_3(rgbColor, 1,.5,.5);
stars[Mars] = new Planet(MAR_RADIUS, MAR_DIS, MAR_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Юпитер
SET_VALUE_3(rgbColor, 1, 1,.5);
stars[Jupiter] = new Planet(JUP_RADIUS, JUP_DIS, JUP_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Сатурн
SET_VALUE_3(rgbColor,.5, 1,.5);
stars[Saturn] = new Planet(SAT_RADIUS, SAT_DIS, SAT_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Уран
SET_VALUE_3(rgbColor,.4,.4,.4);
stars[Uranus] = new Planet(URA_RADIUS, URA_DIS, URA_SPEED, SELFROTATE, stars[Sun], rgbColor);
// Нептун
SET_VALUE_3(rgbColor,.5,.5, 1);
stars[Neptune] = new Planet(NEP_RADIUS, NEP_DIS, NEP_SPEED, SELFROTATE, stars[Sun], rgbColor);
}
此外,不要忘记在析构函数中释放分配的内存:
SolarSystem::~SolarSystem() {
for(int i = 0; i<STARS_NUM; i++)
delete stars[i];
}