IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

4 страниц V < 1 2 3 4 >  
 Ответить  Открыть новую тему 
> Игра "Солнечная система"
сообщение
Сообщение #41


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата(Account @ 23.07.2011 13:54) *
Только не пойму вот что, в чем вот разница объявлений(присваивание 0),
virtual void Show(int) = 0;
virtual void Recalc()
Присвоивание нуля методу делает его чисто виртуальным, ты не сможешь создать экземпляр класса Celestial (только потомки, да и то - чтобы их создать, надо чтоб потомок переопределял чисто виртуальную функцию, делал ее просто виртуальной). То есть, пока в классе есть хоть одна чисто виртуальная функция (неважно, описанная в этом классе или унаследованная от любого предка и не перекрытая) - он является абстрактным. Он как бы есть (наследоваться от него можно), но его в то же время и нет (создать экземпляр нельзя). В Паскале, кстати, такие методы как раз и называются Абстрактными...


Цитата(Account @ 23.07.2011 13:54) *
Забыл еще спросить по частицам, массив размерностью определенный переменный const int parrSize = 1500;
а используется только 100 ?
maxParticles(100)
Ага... Тут дело вот в чем: если взять просто массив из 100 частичек, инициализировать их, и потом, когда частички удалятся от кометы, переинициализировать опять рядом с кометой - то будет очень своеобразное поведение? то есть, хвост будет "фонтанировать": он будет создаваться, потом частички будут удаляться все дальше и дальше (при этом ни одна из них еще не уйдет слишком далеко, следовательно, новых-то частиц рядом с кометой не будет), пока не начнут уходить из области влияния комету, тогда она начнет испускать новую порцию частичек. Я попробовал - выглядит ужасно. Поэтому я решил пойти другим путем: я на каждой итерации добавляю по StepParticles - Count новых частичек рядом с кометой (где Count - счетчик удалившихся старых частиц), чтобы выброс шел постоянно. Естественно, что общее число частиц начинает возрастать. И возрастает до тех пор, пока длина хвоста не установится, потом возрастание прекращается. Так вот, для этого и нужно место под 1500 частичек, чтобы массив не переполнялся. Хотя, возможно, это я чересчур загнул, надо гонять программу и проверять, сколько максимально частичек присутствует в хвосте. Хочешь - сделай такую проверку. Мне лень было, я выделил место под 1500 элементов, так сказать, с запасом. Все равно, если б я делал для себя, я б не стал использовать массив, написал бы класс связного списка, и все... Сколько засунешь в него - столько он и будет хранить. Новые будут прибывать, старые - удаляться... Но тебе, чтоб не перегружать программу, я этого делать не стал.

Цитата(Account @ 23.07.2011 13:54) *
Ну и нужен совет как дальше делать, столкновение кометы с планетами и солнцем.
Я тебе уже говорил выше: проверяй комету с каждым телом, если Расстояние(Комета, НебесноеТело) меньше чем RКомета + RНебесноеТело, значит, произошло столкновение... Но тебе до этого надо еще принимать меры, когда комета слишком близко подходит к планете - это будет менять ее траекторию. Принцип - то же самый: проверять на каждом шаге расстояние, и если оно меньше какого-то расстояния, вычисленного по массе планеты (там Шека тебе чего-то писал) - то менять Vx и Vy кометы...

Цитата
Попробовал на нетбуке, тоже вылет, пишется Abnormal program termination.
Значит, запускай трассировку, и смотри, на какой именно строке программа вылетает. Возможно для этого придется перед каждой строкой в Comet::Recalc, Comet::Show и всех вызываемых оттуда функциях выводить тестовое сообщение, и потом смотреть, какое именно из них вывелось последним, значит, на последующей строке произошел вылет. Возможно - будет достаточно просто запустить отладку программы (F7 в IDE), поставить курсор на строку, скажем, с closegraph(), и нажать F4. При вылете программы курсор может быть установлен на строку с ошибкой. Так что ищи, где ошибка, коли она только у тебя воспроизводится...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #42


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


IUnknown, а можешь скинуть свой компилятор, на какой-нито файлообменник?
В нем проверю.
По F4 ошибок не выдает, по F7 что то при создании частиц слишком долго) но постараюсь сделать

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #43


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Вот тут мой компилятор валяется: http://vlady.uzelok.net/progs/Tc30.exe
Просто запускай его, он сам распакуется куда скажешь...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #44


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 17:02) *

Вот тут мой компилятор валяется: http://vlady.uzelok.net/progs/Tc30.exe
Просто запускай его, он сам распакуется куда скажешь...


Спасибо. Блин вылет имеется. Буду пробовать по F7.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #45


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


   for(i = 0; i <= stepParticles - count; i++)
{
// Вот отсюда ...
if(maxParticles + i >= parrSize)
{
cout << "Oops..." << endl;
}
// ... до сюда
trace[maxParticles + i] = new Particle((int)(getX()) - 1 + random(2), (int)(getY()) - 1 + random(2),
Vx + Cvt((int)((getX() - sun->getX()) / Ex)) - 1 + random(2),
Vy + Cvt((int)((getY() - sun->getY()) / Ey)) - 1 + random(2));
// ...
Попробуй добавить вот этот кусок, поставить на вывод Oops курсор и нажать на F4... Если оно туда придет, значит, как я и предполагаю, у тебя по какой-то причине генерируется слишком много частичек и происходит вылет за границы массива. Если нет - то я вообще не понимаю, в чем дело, больше просто негде ошибаться... Вообще-то обычно есть сообщение, по какой причине Abnormal programm termination. Либо Floating point error: Domain, либо еще что-то. Почему у тебя этого не показывает - непонятно...

Тебе сейчас главное - локализовать место, где происходит вылет. Через F7 это на самом деле будет долго, для первого раза выполняй методы не заходя в них, то есть, по F8 на имени метода... Потом, когда будешь знать, в каком именно методе происходит вылет - зайдешь в него и там уже жми на F8... Так каждый раз будешь подбираться все ближе и ближе, пока не найдешь, что именно глючит... Найдешь - говори...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #46


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 17:33) *

код (Показать/Скрыть)
Попробуй добавить вот этот кусок, поставить на вывод Oops курсор и нажать на F4... Если оно туда придет, значит, как я и предполагаю, у тебя по какой-то причине генерируется слишком много частичек и происходит вылет за границы массива. Если нет - то я вообще не понимаю, в чем дело, больше просто негде ошибаться... Вообще-то обычно есть сообщение, по какой причине Abnormal programm termination. Либо Floating point error: Domain, либо еще что-то. Почему у тебя этого не показывает - непонятно...

Тебе сейчас главное - локализовать место, где происходит вылет. Через F7 это на самом деле будет долго, для первого раза выполняй методы не заходя в них, то есть, по F8 на имени метода... Потом, когда будешь знать, в каком именно методе происходит вылет - зайдешь в него и там уже жми на F8... Так каждый раз будешь подбираться все ближе и ближе, пока не найдешь, что именно глючит... Найдешь - говори...

Итак сидел и держал F8, вроде на апдейте кометы, подозреваю на ее recalc(), НО хочу дать потестить кому-ни то из знакомыx, так же было бы не плохо если бы кто-ни то из здешних у себя запустил и протестил. Вдруг может что из-за видео дров, у меня тут периодически вылет их был, когда возвращался из IDE (дос режима)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #47


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Итак, дал погонять еще двоим, у одного вылет через 3 секунды, у другого не так быстро но также вылет, с тем же сообщением что я выше писал(((

Что то в комете. Буду искать по возможности.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #48


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Ау!!! Почему у меня (ноут с WinXP SP3, запускается через DosBox 0.74, мне на фиг не нужно смотреть на это все в полноэкранном режиме) нет никаких вылетов при том же коде, работающем с кометой ( видео прилагается: http://www.youtube.com/watch?v=PzSfcH3jBEE )? Это что, карма?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #49


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Да уж, возможно и карма, а скинь досбокс, я у себя через него запущу. Так же если что установлю uvScreenCamera_4.6.0.100, если будет ошибка попробую записать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #50


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Где-то вот тут: http://www.dosbox.com/download.php?main=1 smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #51


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 19:42) *

Где-то вот тут: http://www.dosbox.com/download.php?main=1 smile.gif

Все запустил)) Вот скрин и ВИДЕО

Сообщение отредактировано: Account -


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #52


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Не понимаю... Причины такого поведения программы - не понимаю. Знаешь, почему? Потому что я, чтоб было проще отлаживать, безо всяких DosBox-ов, даже без Windows, переписал программу с использованием GLUT (там переделывать-то ничего не пришлось, только чуть-чуть перегруппировать методы и добавить условную компиляцию для двух графических примитивов - для putpixel и для circle - типа, это для ДОС, а это для glut) и запустил ее под Code::Blocks у себя на компьютере (не на ноуте, а именно на десктопе). Ты будешь смеяться, но оно не вылетает. Если уж и GCC ошибки не ловит - я не знаю, что еще делать...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #53


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 23.07.2011 23:37) *

Не понимаю... Причины такого поведения программы - не понимаю. Знаешь, почему? Потому что я, чтоб было проще отлаживать, безо всяких DosBox-ов, даже без Windows, переписал программу с использованием GLUT (там переделывать-то ничего не пришлось, только чуть-чуть перегруппировать методы и добавить условную компиляцию для двух графических примитивов - для putpixel и для circle - типа, это для ДОС, а это для glut) и запустил ее под Code::Blocks у себя на компьютере (не на ноуте, а именно на десктопе). Ты будешь смеяться, но оно не вылетает. Если уж и GCC ошибки не ловит - я не знаю, что еще делать...


У меня есть стационарный комп, но на нем стоит фряха, проверить пока больше нигде не могу. Как представиться возможность где-нито еще погонять. отпишусь по результатам. А пока займусь столкновением.
Я так понимаю, как ты предлагал что планеты буду как массив типа класса планета, чтобы можно было в цикле потом сравнить растояние каждой с кометой, только вот вычисления эти производить в Run() или как лучьше?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #54


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


[offtop]
Посмотрел видео, а после него, как обычно, выскакивает еще несколько "похожих" видео. Среди них песня некоей CINDY SANCHEZ, COMETI UN ERROR.avi. Меня привлекло слово cometi, которое проассоциировалось у меня с кометами, и я послушал.. Оказывается, название песни переводится (с испанского) как "я делаю ошибку" smile.gif. Я только потом понял, что слово "комета" действительно похоже на англ. "to commit" - совершать. Интересно также, что в испанской его версии только одно m, и за ним следует e, что делает его еще больше похожим на русское "комета". Я не знаком с этимологией слова "комета" (может, кто-нить что-нить нароет?) - возможно, тут есть смысловая связь.. Но! Но я не нашел никаких упоминаний о кометах в видео Account'а.. Что-это - совпадение? Если да, то сразу по нескольким пунктам (ибо есть возможность, что ошибка все же делается..)) Не знаю уж, есть ли тут какой-то скрытый смысл lol.gif
[/offtop]


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #55


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Кометы выглядят замечательно.. Но я не понимаю, почему они не притягиваются ни к Солнцу, ни к планетам? Некоторые проходят прямо через Солнце - и ничего! smile.gif)
Притяжение еще не реализовано?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #56


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Притяжение еще не реализовано?
Нет еще, ищем пока ошибку, которая приводит к вылету программы у Account-а.

Присоединяйся, если есть желание smile.gif У тебя ж есть компилятор который умеет работать с GLUT-ом? Присоединяю получившийся у меня "комбайн", который компилируется и в GCC, и в Турбо-Сях, и ведет себя одинаково, ибо отличается только сама отрисовка. Где может сбоить - ума не приложу.

Прикрепленный файл  main.cpp ( 8.89 килобайт ) Кол-во скачиваний: 578

(сохранено в UTF8)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #57


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(IUnknown @ 24.07.2011 2:43) *
Присоединяйся, если есть желание smile.gif У тебя ж есть компилятор который умеет работать с GLUT-ом?

Спасибо - боюсь, поздновато, но я попробую (кстати, с той эмуляцией bgi-графики я не особо преуспел, хотя и пытался - в лом стало тратить на это время). GLUT не пользовал, сейчас пробую SDL - его должно с лихвой хватать для 2D.

Вечером посижу, попробую вникнуть..

Добавлено через 12 мин.
Цитата(IUnknown @ 24.07.2011 2:43) *
Нет еще, ...

Мне это немного странно.. Я бы с этого начал, потому что если его сделать - ВСЕ объекты будут двигаться единым способом. Ведь, если посмотреть с общей точки зрения - это просто система нескольких гравитирующих тел. В общем случае их движение представляет полный хаос, но в рассматриваемом случае (супермассивная звезда, массивные планеты, легкие кометы) мы просто знаем (глядя на небо)), что порядок возможен yes2.gif. То есть, не нужно отдельно делать движение планет по кругу - просто нужно задать подходящую массу и вектор скорости. Проблема будет только в том, как "отладить" всю систему, чтоб она не разваливалась из-за межпланетного взаимодействия (впрочем, вот его-то можно и "выключить" для простоты)).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #58


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


IUnknown, сделал вот что. Взяв за пример функцию dist() вот вставил вот такую boom() для проверки расположения кометы и каждой планеты
int boom(Celestial &a, Celestial &b)
{
double dx =abs (a.getX() - b.getX());
double dy =abs( a.getY() - b.getY());
if ((dx<(a.getSize()+3)) || (dy<(a.getSize()+3)))
return 1;
return 0;
}

Далее переправил такие места

//.....
Planet *planets[2];

//....
planets[0]->Update();
planets[1]->Update();
//....
planets[0] = new Planet(maxx / 2.+ 3 * 20, maxy / 2., 3,60, 360./365., "earth");
planets[1] = new Planet(maxx / 2.+ 4 * 20, maxy / 2., 3,80, 360./687., "mars");
//.....

Пока думаю как лучше организовать проверку на столкновение и выход кометы за систему, ведь в одном случе уничтожаются два объекта в другом только комета и при обоих комета заново создается.

Сообщение отредактировано: Account -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #59


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
но в рассматриваемом случае (супермассивная звезда, массивные планеты, легкие кометы) мы просто знаем (глядя на небо)), что порядок возможен yes2.gif . То есть, не нужно отдельно делать движение планет по кругу - просто нужно задать подходящую массу и вектор скорости.
Да, да... Теоретически - так оно и есть. Как только дело доходит до практики... Попробовал я реализовать то же самое с использованием сил гравитации. Вот так и есть, реальная орбитальная скорость, реальная масса Солнца и планет, реальное расстояние между планетами и Солнцем + масштабирование, чтоб не было необходимости в мониторе с диагональю около 30 а.е. smile.gif

Так вот, взаимодействие Солнца и планет отрабатывают на ура, все движется, да не по окружностям, а по эллиптическим орбитам. Красота... Вот, думаю, сейчас добавлю сюда комету, и посмотрю, как она будет двигаться. Так вот комете (при реальной же массе, которая на 16 порядков меньше массы Солнца - скажем, масса кометы Галлея = 2.2×1014 кг. против 2.0×1030 кг. солнечной массы) крышу сносит на первой же секунде, её солнце притягивает и выстреливает ей куда-то в неизвестном направлении как из пращи, со скоростью порядка 1000 км/сек smile.gif (при том, что реальная орбитальная скорость Меркурия, как самой быстрой планеты, не превышает 50 км/сек). Начинаю увеличивать массу кометы - все постепенно начинает приходить в норму, скорость выброса из системы уменьшается, а когда масса кометы становится соизмерима с массами планет - то комета переходит на гелиоцентрическую орбиту... Я явно что-то упускаю, а вот что - пока сообразить не могу...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #60


Бывалый
***

Группа: Пользователи
Сообщений: 212
Пол: Мужской

Репутация: -  0  +


Вот что пытался сделать для столкновения, но что то не работает так как надо

код (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

4 страниц V < 1 2 3 4 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 1:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name