#include <SFML/Graphics.hpp>
#include <math.h>
using namespace sf;
using namespace std;
// Класс для вычисления кооординат вращающегося объекта
class Planets
{
public:
Planets(int startx, int starty, int r, int v);
Planets(int r, int v);
int getx();
int gety();
void move(double s);
void setposition(int startx, int starty);
private:
int x0=0,y0=0,rad=0,x=0,y=0,vector=1;
double a = 0;
const double PI = acos(-1.0);
};
Planets::Planets(int startx, int starty, int r, int v)
{
if (v > 1) v = 1;
if (v < -1 || v == 0) v = -1;
vector = v;
x0 = startx;
y0 = starty;
rad = r;
}
Planets::Planets(int r, int v)
{
if (v > 1) v = 1;
if (v < -1 || v == 0) v = -1;
vector = v;
rad = r;
}
int Planets::getx()
{
return x;
}
int Planets::gety()
{
return y;
}
void Planets::move(double s)
{
a += s;
if (a > 360) a = 0;
x = x0 + round(rad*cos(a*PI/180));
y = y0 + round(rad * sin(a * PI / 180))*vector;
}
void Planets::setposition(int startx, int starty)
{
x0 = startx;
y0 = starty;
}
int main()
{
// Запускаем генератор случайных чисел
srand(time(NULL));
// Создаём графическое окно
RenderWindow window(VideoMode(1500, 900), L"Солнечная система", Style::Default);
// Вертикальная синхронизация кадров анимации
window.setVerticalSyncEnabled(true);
// Объявление планет солнце, меркурий, венера, земля, марс, луна
CircleShape sun(100.f), merk(1), vener(6), earth(10), mars(4), moon(4);
// Задаём параметры для солнца
sun.setPosition(750, 450);
sun.setOrigin(100,100);
Texture texsun;
texsun.loadFromFile("sun.png");
sun.setTexture(&texsun);
//Задаём параметры для звезд
VertexArray stars(Points, 50);
for (int i = 0; i < 49; i++) {stars[i].color = Color(255, 255, 255);
stars[i].position = Vector2f(rand() % 1500, rand() % 900);}
//Задаём параметры для земли
Texture texearth;
texearth.loadFromFile("erd.png");
earth.setTexture(&texearth);
earth.setOrigin(5,5);
//Задаём параметры для венеры
vener.setFillColor(Color(208, 159, 46));
vener.setOrigin(3, 3);
//Задаём параметры для марса
mars.setFillColor(Color(223, 54, 16));
mars.setOrigin(2, 2);
//Задаём параметры для меркурия
merk.setFillColor(Color(208, 159, 46));
//Задаём параметры для луны
Texture texmoon;
texmoon.loadFromFile("luna.png");
moon.setTexture(&texmoon);
moon.setOrigin(2, 2);
// Создаём объекты определения координат планет
Planets merkxy(750,450,150,-1),venerxy(750,450,200,-1), marsxy(750,450,300,-1), earthxy(750,450,250,-1);
Planets moonxy(30,-1);
while (window.isOpen())
{
Event event;
while (window.pollEvent(event)) if (event.type == Event::Closed)window.close();
// Каждую итерацию изменяем угол положения планеты на 1
merkxy.move(1);
//Устанавливаем текущие координаты объекта
merk.setPosition(merkxy.getx(), merkxy.gety());
// Каждую итерацию изменяем угол положения планеты на 0.5
venerxy.move(0.5);
//Устанавливаем текущие координаты объекта
vener.setPosition(venerxy.getx(), venerxy.gety());
// Каждую итерацию изменяем угол положения планеты на 1.5
marsxy.move(1.5);
//Устанавливаем текущие координаты объекта
mars.setPosition(marsxy.getx(), marsxy.gety());
// Каждую итерацию изменяем угол положения планеты на 0.8
earthxy.move(0.8);
//Устанавливаем текущие координаты объекта
earth.setPosition(earthxy.getx(), earthxy.gety());
// Определяем центр вращения, так как земля меняет своё положение
moonxy.setposition(earth.getPosition().x, earth.getPosition().y);
// Каждую итерацию изменяем угол положения планеты на 3
moonxy.move(3);
//Устанавливаем текущие координаты объекта
moon.setPosition(moonxy.getx(), moonxy.gety());
// Вращаем солнце
sun.rotate(-1);
window.clear();
window.draw(stars);
window.draw(sun);
window.draw(merk);
window.draw(vener);
window.draw(earth);
window.draw(mars);
window.draw(moon);
window.display();
}
return 0;
}