Только не пойму вот что, в чем вот разница объявлений(присваивание 0),
Присвоивание нуля методу делает его чисто виртуальным, ты не сможешь создать экземпляр класса Celestial (только потомки, да и то - чтобы их создать, надо чтоб потомок переопределял чисто виртуальную функцию, делал ее просто виртуальной). То есть, пока в классе есть хоть одна чисто виртуальная функция (неважно, описанная в этом классе или унаследованная от любого предка и не перекрытая) - он является абстрактным. Он как бы есть (наследоваться от него можно), но его в то же время и нет (создать экземпляр нельзя). В Паскале, кстати, такие методы как раз и называются Абстрактными...virtual void Show(int) = 0;
virtual void Recalc()
Забыл еще спросить по частицам, массив размерностью определенный переменный const int parrSize = 1500;
а используется только 100 ?
Ага... Тут дело вот в чем: если взять просто массив из 100 частичек, инициализировать их, и потом, когда частички удалятся от кометы, переинициализировать опять рядом с кометой - то будет очень своеобразное поведение? то есть, хвост будет "фонтанировать": он будет создаваться, потом частички будут удаляться все дальше и дальше (при этом ни одна из них еще не уйдет слишком далеко, следовательно, новых-то частиц рядом с кометой не будет), пока не начнут уходить из области влияния комету, тогда она начнет испускать новую порцию частичек. Я попробовал - выглядит ужасно. Поэтому я решил пойти другим путем: я на каждой итерации добавляю по StepParticles - Count новых частичек рядом с кометой (где Count - счетчик удалившихся старых частиц), чтобы выброс шел постоянно. Естественно, что общее число частиц начинает возрастать. И возрастает до тех пор, пока длина хвоста не установится, потом возрастание прекращается. Так вот, для этого и нужно место под 1500 частичек, чтобы массив не переполнялся. Хотя, возможно, это я чересчур загнул, надо гонять программу и проверять, сколько максимально частичек присутствует в хвосте. Хочешь - сделай такую проверку. Мне лень было, я выделил место под 1500 элементов, так сказать, с запасом. Все равно, если б я делал для себя, я б не стал использовать массив, написал бы класс связного списка, и все... Сколько засунешь в него - столько он и будет хранить. Новые будут прибывать, старые - удаляться... Но тебе, чтоб не перегружать программу, я этого делать не стал.а используется только 100 ?
maxParticles(100)
Ну и нужен совет как дальше делать, столкновение кометы с планетами и солнцем.
Я тебе уже говорил выше: проверяй комету с каждым телом, если Расстояние(Комета, НебесноеТело) меньше чем RКомета + RНебесноеТело, значит, произошло столкновение... Но тебе до этого надо еще принимать меры, когда комета слишком близко подходит к планете - это будет менять ее траекторию. Принцип - то же самый: проверять на каждом шаге расстояние, и если оно меньше какого-то расстояния, вычисленного по массе планеты (там Шека тебе чего-то писал) - то менять Vx и Vy кометы...Цитата
Попробовал на нетбуке, тоже вылет, пишется Abnormal program termination.
Значит, запускай трассировку, и смотри, на какой именно строке программа вылетает. Возможно для этого придется перед каждой строкой в Comet::Recalc, Comet::Show и всех вызываемых оттуда функциях выводить тестовое сообщение, и потом смотреть, какое именно из них вывелось последним, значит, на последующей строке произошел вылет. Возможно - будет достаточно просто запустить отладку программы (F7 в IDE), поставить курсор на строку, скажем, с closegraph(), и нажать F4. При вылете программы курсор может быть установлен на строку с ошибкой. Так что ищи, где ошибка, коли она только у тебя воспроизводится...