Игра "Солнечная система" |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Игра "Солнечная система" |
IUnknown |
23.07.2011 15:06
Сообщение
#41
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Только не пойму вот что, в чем вот разница объявлений(присваивание 0), Присвоивание нуля методу делает его чисто виртуальным, ты не сможешь создать экземпляр класса Celestial (только потомки, да и то - чтобы их создать, надо чтоб потомок переопределял чисто виртуальную функцию, делал ее просто виртуальной). То есть, пока в классе есть хоть одна чисто виртуальная функция (неважно, описанная в этом классе или унаследованная от любого предка и не перекрытая) - он является абстрактным. Он как бы есть (наследоваться от него можно), но его в то же время и нет (создать экземпляр нельзя). В Паскале, кстати, такие методы как раз и называются Абстрактными...virtual void Show(int) = 0; Забыл еще спросить по частицам, массив размерностью определенный переменный const int parrSize = 1500; Ага... Тут дело вот в чем: если взять просто массив из 100 частичек, инициализировать их, и потом, когда частички удалятся от кометы, переинициализировать опять рядом с кометой - то будет очень своеобразное поведение? то есть, хвост будет "фонтанировать": он будет создаваться, потом частички будут удаляться все дальше и дальше (при этом ни одна из них еще не уйдет слишком далеко, следовательно, новых-то частиц рядом с кометой не будет), пока не начнут уходить из области влияния комету, тогда она начнет испускать новую порцию частичек. Я попробовал - выглядит ужасно. Поэтому я решил пойти другим путем: я на каждой итерации добавляю по StepParticles - Count новых частичек рядом с кометой (где Count - счетчик удалившихся старых частиц), чтобы выброс шел постоянно. Естественно, что общее число частиц начинает возрастать. И возрастает до тех пор, пока длина хвоста не установится, потом возрастание прекращается. Так вот, для этого и нужно место под 1500 частичек, чтобы массив не переполнялся. Хотя, возможно, это я чересчур загнул, надо гонять программу и проверять, сколько максимально частичек присутствует в хвосте. Хочешь - сделай такую проверку. Мне лень было, я выделил место под 1500 элементов, так сказать, с запасом. Все равно, если б я делал для себя, я б не стал использовать массив, написал бы класс связного списка, и все... Сколько засунешь в него - столько он и будет хранить. Новые будут прибывать, старые - удаляться... Но тебе, чтоб не перегружать программу, я этого делать не стал.а используется только 100 ? maxParticles(100) Ну и нужен совет как дальше делать, столкновение кометы с планетами и солнцем. Я тебе уже говорил выше: проверяй комету с каждым телом, если Расстояние(Комета, НебесноеТело) меньше чем RКомета + RНебесноеТело, значит, произошло столкновение... Но тебе до этого надо еще принимать меры, когда комета слишком близко подходит к планете - это будет менять ее траекторию. Принцип - то же самый: проверять на каждом шаге расстояние, и если оно меньше какого-то расстояния, вычисленного по массе планеты (там Шека тебе чего-то писал) - то менять Vx и Vy кометы...Цитата Попробовал на нетбуке, тоже вылет, пишется Abnormal program termination. Значит, запускай трассировку, и смотри, на какой именно строке программа вылетает. Возможно для этого придется перед каждой строкой в Comet::Recalc, Comet::Show и всех вызываемых оттуда функциях выводить тестовое сообщение, и потом смотреть, какое именно из них вывелось последним, значит, на последующей строке произошел вылет. Возможно - будет достаточно просто запустить отладку программы (F7 в IDE), поставить курсор на строку, скажем, с closegraph(), и нажать F4. При вылете программы курсор может быть установлен на строку с ошибкой. Так что ищи, где ошибка, коли она только у тебя воспроизводится... |
Account |
23.07.2011 15:42
Сообщение
#42
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
IUnknown, а можешь скинуть свой компилятор, на какой-нито файлообменник?
В нем проверю. По F4 ошибок не выдает, по F7 что то при создании частиц слишком долго) но постараюсь сделать Сообщение отредактировано: Account - 23.07.2011 15:44 |
IUnknown |
23.07.2011 16:02
Сообщение
#43
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Вот тут мой компилятор валяется: http://vlady.uzelok.net/progs/Tc30.exe
Просто запускай его, он сам распакуется куда скажешь... |
Account |
23.07.2011 16:13
Сообщение
#44
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
Вот тут мой компилятор валяется: http://vlady.uzelok.net/progs/Tc30.exe Просто запускай его, он сам распакуется куда скажешь... Спасибо. Блин вылет имеется. Буду пробовать по F7. |
IUnknown |
23.07.2011 16:33
Сообщение
#45
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
for(i = 0; i <= stepParticles - count; i++)Попробуй добавить вот этот кусок, поставить на вывод Oops курсор и нажать на F4... Если оно туда придет, значит, как я и предполагаю, у тебя по какой-то причине генерируется слишком много частичек и происходит вылет за границы массива. Если нет - то я вообще не понимаю, в чем дело, больше просто негде ошибаться... Вообще-то обычно есть сообщение, по какой причине Abnormal programm termination. Либо Floating point error: Domain, либо еще что-то. Почему у тебя этого не показывает - непонятно... Тебе сейчас главное - локализовать место, где происходит вылет. Через F7 это на самом деле будет долго, для первого раза выполняй методы не заходя в них, то есть, по F8 на имени метода... Потом, когда будешь знать, в каком именно методе происходит вылет - зайдешь в него и там уже жми на F8... Так каждый раз будешь подбираться все ближе и ближе, пока не найдешь, что именно глючит... Найдешь - говори... |
Account |
23.07.2011 17:13
Сообщение
#46
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
код (Показать/Скрыть)
Тебе сейчас главное - локализовать место, где происходит вылет. Через F7 это на самом деле будет долго, для первого раза выполняй методы не заходя в них, то есть, по F8 на имени метода... Потом, когда будешь знать, в каком именно методе происходит вылет - зайдешь в него и там уже жми на F8... Так каждый раз будешь подбираться все ближе и ближе, пока не найдешь, что именно глючит... Найдешь - говори... Итак сидел и держал F8, вроде на апдейте кометы, подозреваю на ее recalc(), НО хочу дать потестить кому-ни то из знакомыx, так же было бы не плохо если бы кто-ни то из здешних у себя запустил и протестил. Вдруг может что из-за видео дров, у меня тут периодически вылет их был, когда возвращался из IDE (дос режима) |
Account |
23.07.2011 18:09
Сообщение
#47
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
Итак, дал погонять еще двоим, у одного вылет через 3 секунды, у другого не так быстро но также вылет, с тем же сообщением что я выше писал(((
Что то в комете. Буду искать по возможности. |
IUnknown |
23.07.2011 18:34
Сообщение
#48
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Ау!!! Почему у меня (ноут с WinXP SP3, запускается через DosBox 0.74, мне на фиг не нужно смотреть на это все в полноэкранном режиме) нет никаких вылетов при том же коде, работающем с кометой ( видео прилагается: http://www.youtube.com/watch?v=PzSfcH3jBEE )? Это что, карма?
|
Account |
23.07.2011 18:40
Сообщение
#49
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
Да уж, возможно и карма, а скинь досбокс, я у себя через него запущу. Так же если что установлю uvScreenCamera_4.6.0.100, если будет ошибка попробую записать.
|
IUnknown |
23.07.2011 18:42
Сообщение
#50
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Где-то вот тут: http://www.dosbox.com/download.php?main=1
|
Account |
23.07.2011 19:23
Сообщение
#51
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
Эскизы прикрепленных изображений |
IUnknown |
23.07.2011 22:37
Сообщение
#52
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Не понимаю... Причины такого поведения программы - не понимаю. Знаешь, почему? Потому что я, чтоб было проще отлаживать, безо всяких DosBox-ов, даже без Windows, переписал программу с использованием GLUT (там переделывать-то ничего не пришлось, только чуть-чуть перегруппировать методы и добавить условную компиляцию для двух графических примитивов - для putpixel и для circle - типа, это для ДОС, а это для glut) и запустил ее под Code::Blocks у себя на компьютере (не на ноуте, а именно на десктопе). Ты будешь смеяться, но оно не вылетает. Если уж и GCC ошибки не ловит - я не знаю, что еще делать...
|
Account |
23.07.2011 22:56
Сообщение
#53
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
Не понимаю... Причины такого поведения программы - не понимаю. Знаешь, почему? Потому что я, чтоб было проще отлаживать, безо всяких DosBox-ов, даже без Windows, переписал программу с использованием GLUT (там переделывать-то ничего не пришлось, только чуть-чуть перегруппировать методы и добавить условную компиляцию для двух графических примитивов - для putpixel и для circle - типа, это для ДОС, а это для glut) и запустил ее под Code::Blocks у себя на компьютере (не на ноуте, а именно на десктопе). Ты будешь смеяться, но оно не вылетает. Если уж и GCC ошибки не ловит - я не знаю, что еще делать... У меня есть стационарный комп, но на нем стоит фряха, проверить пока больше нигде не могу. Как представиться возможность где-нито еще погонять. отпишусь по результатам. А пока займусь столкновением. Я так понимаю, как ты предлагал что планеты буду как массив типа класса планета, чтобы можно было в цикле потом сравнить растояние каждой с кометой, только вот вычисления эти производить в Run() или как лучьше? |
Lapp |
24.07.2011 0:58
Сообщение
#54
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
[offtop]
Посмотрел видео, а после него, как обычно, выскакивает еще несколько "похожих" видео. Среди них песня некоей CINDY SANCHEZ, COMETI UN ERROR.avi. Меня привлекло слово cometi, которое проассоциировалось у меня с кометами, и я послушал.. Оказывается, название песни переводится (с испанского) как "я делаю ошибку" . Я только потом понял, что слово "комета" действительно похоже на англ. "to commit" - совершать. Интересно также, что в испанской его версии только одно m, и за ним следует e, что делает его еще больше похожим на русское "комета". Я не знаком с этимологией слова "комета" (может, кто-нить что-нить нароет?) - возможно, тут есть смысловая связь.. Но! Но я не нашел никаких упоминаний о кометах в видео Account'а.. Что-это - совпадение? Если да, то сразу по нескольким пунктам (ибо есть возможность, что ошибка все же делается..)) Не знаю уж, есть ли тут какой-то скрытый смысл [/offtop] -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
24.07.2011 1:27
Сообщение
#55
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Кометы выглядят замечательно.. Но я не понимаю, почему они не притягиваются ни к Солнцу, ни к планетам? Некоторые проходят прямо через Солнце - и ничего! )
Притяжение еще не реализовано? -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
IUnknown |
24.07.2011 1:43
Сообщение
#56
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Притяжение еще не реализовано? Нет еще, ищем пока ошибку, которая приводит к вылету программы у Account-а.Присоединяйся, если есть желание У тебя ж есть компилятор который умеет работать с GLUT-ом? Присоединяю получившийся у меня "комбайн", который компилируется и в GCC, и в Турбо-Сях, и ведет себя одинаково, ибо отличается только сама отрисовка. Где может сбоить - ума не приложу. main.cpp ( 8.89 килобайт ) Кол-во скачиваний: 440 (сохранено в UTF8) |
Lapp |
24.07.2011 2:00
Сообщение
#57
|
Уникум Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Присоединяйся, если есть желание У тебя ж есть компилятор который умеет работать с GLUT-ом? Спасибо - боюсь, поздновато, но я попробую (кстати, с той эмуляцией bgi-графики я не особо преуспел, хотя и пытался - в лом стало тратить на это время). GLUT не пользовал, сейчас пробую SDL - его должно с лихвой хватать для 2D. Вечером посижу, попробую вникнуть.. Добавлено через 12 мин. Нет еще, ... Мне это немного странно.. Я бы с этого начал, потому что если его сделать - ВСЕ объекты будут двигаться единым способом. Ведь, если посмотреть с общей точки зрения - это просто система нескольких гравитирующих тел. В общем случае их движение представляет полный хаос, но в рассматриваемом случае (супермассивная звезда, массивные планеты, легкие кометы) мы просто знаем (глядя на небо)), что порядок возможен . То есть, не нужно отдельно делать движение планет по кругу - просто нужно задать подходящую массу и вектор скорости. Проблема будет только в том, как "отладить" всю систему, чтоб она не разваливалась из-за межпланетного взаимодействия (впрочем, вот его-то можно и "выключить" для простоты)). -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Account |
24.07.2011 13:46
Сообщение
#58
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
IUnknown, сделал вот что. Взяв за пример функцию dist() вот вставил вот такую boom() для проверки расположения кометы и каждой планеты
int boom(Celestial &a, Celestial &b) Далее переправил такие места
Пока думаю как лучше организовать проверку на столкновение и выход кометы за систему, ведь в одном случе уничтожаются два объекта в другом только комета и при обоих комета заново создается. Сообщение отредактировано: Account - 24.07.2011 13:49 |
IUnknown |
24.07.2011 16:42
Сообщение
#59
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата но в рассматриваемом случае (супермассивная звезда, массивные планеты, легкие кометы) мы просто знаем (глядя на небо)), что порядок возможен . То есть, не нужно отдельно делать движение планет по кругу - просто нужно задать подходящую массу и вектор скорости. Да, да... Теоретически - так оно и есть. Как только дело доходит до практики... Попробовал я реализовать то же самое с использованием сил гравитации. Вот так и есть, реальная орбитальная скорость, реальная масса Солнца и планет, реальное расстояние между планетами и Солнцем + масштабирование, чтоб не было необходимости в мониторе с диагональю около 30 а.е. Так вот, взаимодействие Солнца и планет отрабатывают на ура, все движется, да не по окружностям, а по эллиптическим орбитам. Красота... Вот, думаю, сейчас добавлю сюда комету, и посмотрю, как она будет двигаться. Так вот комете (при реальной же массе, которая на 16 порядков меньше массы Солнца - скажем, масса кометы Галлея = 2.2×1014 кг. против 2.0×1030 кг. солнечной массы) крышу сносит на первой же секунде, её солнце притягивает и выстреливает ей куда-то в неизвестном направлении как из пращи, со скоростью порядка 1000 км/сек (при том, что реальная орбитальная скорость Меркурия, как самой быстрой планеты, не превышает 50 км/сек). Начинаю увеличивать массу кометы - все постепенно начинает приходить в норму, скорость выброса из системы уменьшается, а когда масса кометы становится соизмерима с массами планет - то комета переходит на гелиоцентрическую орбиту... Я явно что-то упускаю, а вот что - пока сообразить не могу... |
Account |
24.07.2011 20:44
Сообщение
#60
|
Бывалый Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: 0 |
Вот что пытался сделать для столкновения, но что то не работает так как надо
код (Показать/Скрыть)
|
Текстовая версия | 4.06.2024 16:24 |