1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Это не совсем игра, но так написано в моем задании. Вот что мне надо постараться создать:
Моделируется движение планет в солнечной системе и прохождение комет через нее. В упрощенной модели не следует соблюдать реальные пропорции размеров планет, Солнца и расстояний между ними. В данной модели все планеты движутся вокруг Солнца в одной плоскости но с разной скоростью. У планет, Солнца и комет есть определенные размеры и масса, пропорциональная кубу линейного размера. В одном из углов "Солнечной системы" в случайные моменты времени генерируются кометы, летящие в произвольном направлении. Комета и планета престают существовать при столкновении. При столкновении кометы о Солнцем исчезает только комета. На кометы действуют силы притяжения планет и Солнца в соответствии с законом всемирного тяготения, что изменяет их траекторию. Комета вышедшая за пределы "Солнечной системы* исчезает на всегда. У комет есть хвост, направленный в сторону от Солнца, Управление моделью : при помощи клавиш: начать, закончить.
Итак, делаться будет на с++, с помощью псевдографики как в этой теме. Как изначально представляю себе это. Будет базовый класс фигура, который будет иметь такие показатели. как радиус планеты, масса, сила притяжения, радиус орбиты. Каждая планета наследник от этого класса. Не понял вот этого в задании
Цитата
масса, пропорциональная кубу линейного размера
Так же пока не представляю как в случайном какого-либо конца экрана запустить комету в каком то направлении, рисовать ей хвост(какми способом) от солнца, ну и физику притяжения с изменением траектории.
Как наверстаю начальный код по планетам выложу, далее нужна будет конечно помощь. Заранее благодарю всех кто откликнется, за советы и помощь.
Я бы не отказался от кратких инструкций по GLUTу - чтоб ускорить старт;
GLUT - он тем и хорош, что не надо практически никаких инструкций, чтобы начать работать с ним. Ну, скажем, вот пример простой программы (используется обычная двумерная графика, то есть, рабочая область ничем не отличается от той, которая есть при использовании BGI) с комментариями... Мне в свое время было достаточно нескольких таких несложных программ, чтобы начать понимать, что происходит и писать простые примеры (а для поставленной ТС задачи ничего более сложного, чем 2D и не нужно).
Как-то вот так:(Показать/Скрыть)
За сам пример - не пинать... Что пришло в голову, то и написал...
#include "glut.h"
const int maxx = 640; const int maxy = 480;
float posx, posy;
// Это функция, в которой будет рисоваться картинка void display() { // Очистка экрана glClear(GL_COLOR_BUFFER_BIT);
// Между glBegin(тип_примитива) и glEnd - отображение // примитивов: точек, линий, трех- (и более) -угольников glBegin(GL_POINTS); glVertex2f(posx, posy); // 2f - ибо 2 вещественных параметра... Есть много // других вариантов: 2d, 3f, 3d, 4f, 4d, ... glEnd();
// Поменяли видимый и невидимый буфер. Все, что было // нарисовано выше по тексту - появилось на экране... glutSwapBuffers(); }
// Это, как понятно, таймер, для выполнения цикличных действий void timer(int = 0 ) { // Пересчитываем координаты, делаем все, что нужно ... posx += 1; if(posx > maxx) posx = maxx/2.0;
// А теперь - чтобы отобразить изменения - вызываем перерисовку окна glutPostRedisplay(); // И переустанавливаем таймер, чтобы сработал через 1 мсек. Это надо // делать каждый раз, таймеры тут одноразовые. Выстрелил и все. glutTimerFunc(1, timer, 0); }
// Ну, и основная функция - тут все по названиям понятно int main(int argc, char** argv) { // Здесь можно проинициализировать начальными значениями // какие-то переменные posx = maxx/2.0; posy = maxy/2.0;
// Инициализируем GLUT glutInit(&argc, argv); // В каком режиме будем работать : 2 буфера и цветное изображение glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
// Инициализируем граф. окно нужного размера в нужном месте ... glutInitWindowSize(maxx, maxy); glutInitWindowPosition(100, 100); // ... с нужным заголовком glutCreateWindow("Solar System");
// Задаем, какого цвета будет фон. Я выбрал черный: RGBA glClearColor(0, 0, 0, 1.0);
// Ну, и, наконец, опишем матрицу // параллельного проецирования
// Первые два параметра - отсечение слева/справа, // следующие 2 - отсечение снизу/сверху, // завершают - отсечение ближнее/дальнее
// Поскольку мне 3D не нужно, и все координаты Z=0, // то третья пара просто устанавливает минимально // возможные значения. // А первые 2 пары создают матрицу на весь экран glOrtho(0, maxx, maxy, 0, -1, 1);
// Теперь установим все callback-функции, здесь может описываться // и та функция, которая будет вызываться при простое (glutIdleFunc), // и та, которая будет вызываться при изменении размеров окна // пользователем (glutReshapeFunc), и реакция на клавиатуру, и на мышь... // Для простых приложений достаточно зарегистрировать функцию отображения glutDisplayFunc(display);
// запустим таймер timer();
// Вот и все, подготовка окончена, запускаем основной обработчик событий GLUT-а glutMainLoop();
return 0; // Это чтоб компилятор не вякал }
Вся работа по отображению - в функции display(), между очисткой буфера и glutSwapBuffers(), или в подпрограммах/методах, что там у тебя используется для решения задачи, вызываемых из display(). Все вычисления - либо прямо в самой функции timer(), если их немного, или опять же, оттуда вызываются подпрограммы, производящие вычисления. С BGI на построение аналогичных программ под GLUT-ом перейти можно за один день.
Да, еще... Надо подключить к проекту библиотеки: glut32.lib, libglu32.a и libopengl32.a, иначе линкер будет бить тревогу...
Цитата
Вблизи Солнца, когда скорость большая, а гравитационное поле меняется очень резко, надо такт симуляции сделать соизмерымим с размером этой окрестности, делённой на эту скорость (то есть должен быть очень маленьким).
Да, похоже, мне этого и не хватало... Попробовал уменьшить вообще такт симуляции для кометы - становится более приемлемо. Попробую потом уменьшать именно при приближении к Солнцу. Когда время будет, что-то сразу так все навалилось...