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

> Внимание!

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

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

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


Гуру
*****

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

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


Цитата
пока не догнал принцип вычисления от солнца
За это отвечает

вот этот кусок кода: (Показать/Скрыть)
, и аналогичный чуть ниже в Recalc...

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


Бывалый
***

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

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


Цитата(IUnknown @ 20.07.2011 19:56) *

За это отвечает

вот этот кусок кода: (Показать/Скрыть)
, и аналогичный чуть ниже в Recalc...

Ну, это уже тебе решать. Я только показал пример реализации. Справишься с написанием всей программы в подобном стиле - бери и дорабатывай мой каркас. Не справишься - продолжай свою программу.


Вряд ли справлюсь , за пример спасибо, покапаюсь конечно в нем)))
Вот сегодня запустил несколько планет)))) Код конечно плохой, но уж строго не суди, не программист)

И у меня вопрос, можно ли как-нибудь мерцания избежать и перепрыжку рисовки планет через ось по Y ( Если взять центр координат середину экрана)
код: (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Гуру
*****

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

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


Цитата
и перепрыжку рисовки планет через ось по Y
А ты понимаешь причину такой перепрыжки? smile.gif Хочешь я добавлю к твоему коду 3 строки и ты сразу поймешь в чем дело? Смотри:

for(int dv = 0; dv <= 4 * orbp; dv++) {
putpixel(xy[0][dv], xy[1][dv], LIGHTGRAY);
}
Вот это добавь в самый конец Set(). Так сказать, чтобы очертить орбиту. И обрати внимание, с какой частотой у тебя точки стоят в одном месте, и насколько они редко расположены в другом (вот там где они реже всего и будет "перепрыжка". Но на самом то деле я бы это "перепрыжкой" не называл. Это то, как должно быть, именно там ведь у тебя и нет мерцания, правда? Мерцает в других местах траектории, потому что там обновление происходит слишком часто). Если б мне понадобилось запомнить координаты точек орбиты, я бы прошелся одним циклом от 0 до 359 градусов + sin и cos, и все точки были бы с одинаковой частотой. И тогда не будет вот этих "перепрыжек", и (скорее всего) уменьшится мерцание, ибо перерисовываться-то оно будет, но насколько реже - ты даже не представляешь smile.gif Если же тебе надо не круговую, а эллиптическую орбиту... Ну что ж, уравнение эллипса тоже не является секретом, точки вычисляются ненамного сложнее чем орбита круговая.

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


Бывалый
***

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

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


Сделал для проверки отдельно

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <graphics.h>
#include <math.h>
int main()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode,
"../BGI");
errorcode = graphresult();
if (errorcode != grOk)
{
cerr<<"Graphics error";
cerr<<grapherrormsg(errorcode);
exit(1);

}
for(int i=0;i<6;i++)
{putpixel((getmaxx()/2+70*cos(i)), (getmaxy()/2+70*sin(i)), LIGHTGRAY);delay(200);}
getch();
return 0;
}


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


Гуру
*****

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

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


Ууу... Как все запущено. Радианы и градусы - разные вещи, правда? Вот библиотека math подразумевает, что тригонометрические функции работают с радианами. Делаем проще:
  // Не надо каждый градус, при таком маленьком радиусе достаточно каждого четвертого
for(int i = 0; i < 360; i += 4)
{
putpixel( (getmaxx()/2 + 70*cos(i*M_PI/180)),
(getmaxy()/2 + 70*sin(i*M_PI/180)),
LIGHTGRAY );
delay(50);
}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Бывалый
***

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

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


Цитата(IUnknown @ 20.07.2011 22:58) *

Ууу... Как все запущено. Радианы и градусы - разные вещи, правда? Вот библиотека math подразумевает, что тригонометрические функции работают с радианами. Делаем проще:
  // Не надо каждый градус, при таком маленьком радиусе достаточно каждого четвертого
for(int i = 0; i < 360; i += 4)
{
putpixel( (getmaxx()/2 + 70*cos(i*M_PI/180)),
(getmaxy()/2 + 70*sin(i*M_PI/180)),
LIGHTGRAY );
delay(50);
}



Я и забыл про это blush.gif Стыдно даже(((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


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

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

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


Вопрос такой..
Тема вызывает интерес, и это понятно. Но BC у меня (и не только, думаю) нет. Можно ли и накормить волков (то есть преподавателей топикстартера), и сохранить овец (чтоб я и остальные могли компилировать прогу)? Я, конечно, могу переделать всю графику.. Но делать так с каждой новой версией кода по мере развития темы - извините, в лом. Есть ли более простой способ обеспечить совместимость?

Добавлено через 4 мин.
P.S.
Я использую gnu в основном.


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


Гуру
*****

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

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


Можно попробовать воспользоваться вот этим:
http://codecutter.org/tools/winbgim/index.html (сразу говорю: я не пробовал, но положительные отзывы присутствуют. Насколько я помню, даже здесь я приводил эту ссылку уже).

Есть еще вот этот проект: http://sourceforge.net/projects/openbgi/ - он начинался на Сурсах, года три назад, вроде под Билдером и Dev C++ работала графика...

Или написать переходники к основным функциям именно под свой компилятор и под ОС (что там используется из BGI-шного - putpixel и circle? Пока вроде и все)

Но есть еще вероятность, что не все конструкции, пропускаемые TurboC, другие компиляторы будут компилировать (обратное тоже верно, примеры я приводил в начале этой темы). Что с этим делать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Бывалый
***

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

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


IUnknown, добавил в твой код следующее,глобальную переменную

int dc=1; 


В метод Update в конце добавил строку

if (X>maxx+5 || Y<-5) {delete this;dc=0;}


и в цикл запуска всего, просто условие проверки переменной dc и если 0 то заново создать такую же комету, сначала прога работает нормально, но потом через некоторое время вылетает с ненормальным завершением, в чем причина?

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


Гуру
*****

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

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


Хм... Не знаю, не пробовал делать так, как ты предлагаешь, ибо удалять объект там, где это делаешь ты - не очень хорошая идея. Сделал так: дописал еще один метод в класс Comet:

class Comet : public Celestial
{
// Все то, что и было, но в public-секции еще:

int OutOfSystem()
{
return (X < -5 || X > maxx + 5 || Y < -5 || Y > maxy + 5) ? 1 : 0;
}

};

// И вот это изменение в Run()

// ...

c_01->Update();

if(c_01->OutOfSystem()) // Проверяем, если вышли за пределы - то пересоздаем комету...
{
delete c_01;
c_01 = new Comet(maxx / 2. - 50, maxy, 2, 0, -5);
}

if(kbhit()) ...
, никаких лишних глобальных переменных, ничего больше. Только эти 2 фрагмента. Запустил, уже 20 минут летает, ничего не завершается... smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Бывалый
***

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

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


Цитата(IUnknown @ 21.07.2011 20:10) *

Хм... Не знаю, не пробовал делать так, как ты предлагаешь, ибо удалять объект там, где это делаешь ты - не очень хорошая идея. Сделал так: дописал еще один метод в класс Comet:

class Comet : public Celestial
{
// Все то, что и было, но в public-секции еще:

int OutOfSystem()
{
return (X < -5 || X > maxx + 5 || Y < -5 || Y > maxy + 5) ? 1 : 0;
}

};

// И вот это изменение в Run()

// ...

c_01->Update();

if(c_01->OutOfSystem()) // Проверяем, если вышли за пределы - то пересоздаем комету...
{
delete c_01;
c_01 = new Comet(maxx / 2. - 50, maxy, 2, 0, -5);
}

if(kbhit()) ...
, никаких лишних глобальных переменных, ничего больше. Только эти 2 фрагмента. Запустил, уже 20 минут летает, ничего не завершается... smile.gif

В одном из фильмов один из героев произнес фразу:"Чувствую себя богом...". А вот моя фраза:"Чувствую себя ЛОХОМ"))))

Спасибо за решение. Твой код почти разобрал. Что не до конца догоню потом спрошу. Жду завтрашнего дня, там выходные можно будет спокойно позаниматься. Буду опять через одно место делать движение планет(в твоем коде)))) После чего только столкновение останется и изменение траектории кометы из за силы притяжения)))

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


Бывалый
***

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

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


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

код (Показать/Скрыть)


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


Гуру
*****

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

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


Что именно приводит к вылету программы, добавление движения планеты, или совместное движение планеты и кометы? Я вот сейчас попробовал запустить твою программу, закомментировав в Run() все, что касается кометы - прекрасно крутится зеленый кружок (хотя мне, например, непонятно твое желание просчитать сразу все точки и хранить массив из 720 int-ов, почему не хранить текущий угол поворота, и по нему рассчитывать координаты на каждой итерации?).

Только вот непорядок получается при переходе X от 359 к нулю. Остается артефакт, половина зеленой окружности (нижняя половина) остается на экране. Я бы сделал все-таки вот так:

   if (bShow)
{
if(X == 359) X = Y = 0;
Y = X++;
}
, тогда по крайней мере артефактов не остается. А вообще - непонятно, почему ты
1) не догадался эти действия производить в методе Recalc(), он же для этого и предназначен: посмотри на Update самого базового класса: сначала гасим изображение, потом пересчитываем то, что нужно пересчитать, и, наконец, проявляем изображение в новом месте.
2) почему до сих пор не догадался, как снять постоянное мерцание Солнца? Оно не должно перерисовываться, у тебя оно все время гасится, потом вызывается пустой Recalc(), потом опять появляется - зачем? Должно быть так: нужно его отобразить один раз, и после этого не гасить и не перерисовывать. Попробуй сделать подобное поведение сам, если не получится - я помогу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #34


Бывалый
***

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

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


Цитата(IUnknown @ 22.07.2011 22:00) *

Что именно приводит к вылету программы, добавление движения планеты, или совместное движение планеты и кометы? Я вот сейчас попробовал запустить твою программу, закомментировав в Run() все, что касается кометы - прекрасно крутится зеленый кружок (хотя мне, например, непонятно твое желание просчитать сразу все точки и хранить массив из 720 int-ов, почему не хранить текущий угол поворота, и по нему рассчитывать координаты на каждой итерации?).

Только вот непорядок получается при переходе X от 359 к нулю. Остается артефакт, половина зеленой окружности (нижняя половина) остается на экране. Я бы сделал все-таки вот так:

   if (bShow)
{
if(X == 359) X = Y = 0;
Y = X++;
}
, тогда по крайней мере артефактов не остается. А вообще - непонятно, почему ты
1) не догадался эти действия производить в методе Recalc(), он же для этого и предназначен: посмотри на Update самого базового класса: сначала гасим изображение, потом пересчитываем то, что нужно пересчитать, и, наконец, проявляем изображение в новом месте.
2) почему до сих пор не догадался, как снять постоянное мерцание Солнца? Оно не должно перерисовываться, у тебя оно все время гасится, потом вызывается пустой Recalc(), потом опять появляется - зачем? Должно быть так: нужно его отобразить один раз, и после этого не гасить и не перерисовывать. Попробуй сделать подобное поведение сам, если не получится - я помогу.


Наверное второе. Хотя заметил так же происходит вылет при столкновении. По поводу хранения угла, как сделаю отпишусь. У меня не доходит до указанного перехода вылетает с Abnormal programm terminated ( заранее извиняюсь за возможно неправильное написание на английском, не владею). По поводу артефакта понял, поправку принял.

По 1) Как переделаю выложу.
По 2)
код (Показать/Скрыть)


P.S. Вот только не пойму как еще сделать в данном коде разную скорость у планет.

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


Гуру
*****

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

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


Цитата
По 2)
Хм... Хитрый, да? Это не совсем правильное решение smile.gif Объяснить? Объясняю... Вот этот код, который в Run, нужно будет слегка модифицировать, чтобы отслеживать взаимодействие объектов по схеме "каждое крупное небесное тело с каждой кометой". Для этого удобнее всего будет описать Солнце и планеты не как отдельные экземпляры, а как массив указателей на базовый класс, чтобы потом просто пройти по всему массиву и проверить, как очередной объект взаимодействует с кометой/кометами (если их будет больше одной на экране).

То, что ты сделал - выбивает объект класса Звезда из такой модели. То есть, ты не сможешь просто вызвать Update() в цикле для всех элементов массива КрупныеОбъекты, тебе придется исключать из этого процесса элемент массива, являющийся Солнцем, но проверять на взаимодействие придется со всеми... Опять лишние конструкции, опять if-ы, зачем тебе это? Нужно так модифицировать Star::Show(), чтобы при постоянном вызове Update() не происходило перерисовки объекта smile.gif

Цитата
Вот только не пойму как еще сделать в данном коде разную скорость у планет.
Вот как переделаешь перемещение планеты через угол (только угол не делай целочисленным, сделай вещественным) - поймешь... Будешь задавать для каждой планеты разное приращение угла - будет разная скорость вращения...

Цитата
У меня не доходит до указанного перехода вылетает с Abnormal programm terminated
Это уже я только завтра/послезавтра смогу потестировать, ноут с Windows уже забрали. Если б тебе хотя бы удалось выяснить, где происходит ошибка - было бы проще...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #36


Бывалый
***

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

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


По солнцу сделал вот так, но не уверен что правильно, так как рисоваться то все равно будет, просто наложение так сказать.

void Star :: Show(int)
{
setcolor( YELLOW );
circle((int)X, (int)Y, Size);
}


По поводу вылетов. Закоментировал как и ты все что относилось к комете, в run(). Вылетов не стало.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #37


Бывалый
***

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

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


Вот, что у меня теперь с использованием угла
код (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #38


Гуру
*****

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

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


Я бы все-таки сделал так:

Прикрепленный файл  SOLAR03.CPP ( 7.13 килобайт ) Кол-во скачиваний: 668


Обрати внимание на следующие вещи:
1. Все-таки, пересчет планеты я вынес в Recalc()
2. Celestial::Recalc() сделал не чисто виртуальным, а просто пустым, это дало возможность вообще отказаться от реализации этого метода в классе Star, будет использоваться унаследованный из предка.
3. Я не передаю в конструктор планеты начальный угол, пусть все планеты начинают вращение с одним углом (хотя, есть и другие варианты), но я передаю ΔAngle, на который изменяется угол каждую итерацию. Это дает возможность элементарно реализовать не то что разные скорости вращения, а практически реальные, то, что есть на самом деле в Солнечной системе. Просто делишь те самые 360 градусов, которые предстоит пройти планете на ее реальный период обращения в сутках, и получаешь то, что получаешь, я добавил Марс для примера - он, как и положено, вращается один раз, пока Земля делает почти два оборота. Теперь ты понимаешь, зачем я уточнил, что лучше сделать угол вещественным? smile.gif
4. Что касается Солнца - я тоже сделал так, как задумывалось изначально, чтоб вообще никакого обновления после первого показа не было.

Вроде все, больше ничего не менял.

Ах, да... Мне не удалось дождаться вылета программы: я раскомментировал все строки, касающиеся отображения кометы, и запустил программу. Генерация 30 (тридцати) комет при одновременном вращении двух планет - это достаточное время, чтобы вылет произошел, или надо ждать дольше? Вылета не было...

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


Бывалый
***

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

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


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

Я бы все-таки сделал так:

Прикрепленный файл  SOLAR03.CPP ( 7.13 килобайт ) Кол-во скачиваний: 668


Обрати внимание на следующие вещи:
1. Все-таки, пересчет планеты я вынес в Recalc()
2. Celestial::Recalc() сделал не чисто виртуальным, а просто пустым, это дало возможность вообще отказаться от реализации этого метода в классе Star, будет использоваться унаследованный из предка.
3. Я не передаю в конструктор планеты начальный угол, пусть все планеты начинают вращение с одним углом (хотя, есть и другие варианты), но я передаю ΔAngle, на который изменяется угол каждую итерацию. Это дает возможность элементарно реализовать не то что разные скорости вращения, а практически реальные, то, что есть на самом деле в Солнечной системе. Просто делишь те самые 360 градусов, которые предстоит пройти планете на ее реальный период обращения в сутках, и получаешь то, что получаешь, я добавил Марс для примера - он, как и положено, вращается один раз, пока Земля делает почти два оборота. Теперь ты понимаешь, зачем я уточнил, что лучше сделать угол вещественным? smile.gif
4. Что касается Солнца - я тоже сделал так, как задумывалось изначально, чтоб вообще никакого обновления после первого показа не было.

Вроде все, больше ничего не менял.

Ах, да... Мне не удалось дождаться вылета программы: я раскомментировал все строки, касающиеся отображения кометы, и запустил программу. Генерация 30 (тридцати) комет при одновременном вращении двух планет - это достаточное время, чтобы вылет произошел, или надо ждать дольше? Вылета не было...

Разобрал. спасибо. По солнцу, жалко что сам не догадался (.
Только не пойму вот что, в чем вот разница объявлений(присваивание 0),
virtual void Show(int) = 0;
virtual void Recalc()

Забыл еще спросить по частицам, массив размерностью определенный переменный const int parrSize = 1500;
а используется только 100 ?
maxParticles(100)

Ну и нужен совет как дальше делать, столкновение кометы с планетами и солнцем.
По поводу вылетов, происходят, может что с ОС на этом ноуте. Хочу потестировать на нетбуке, к вечеру отпишусь

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


Бывалый
***

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

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


Попробовал на нетбуке, тоже вылет, пишется Abnormal program termination.

На ноуте и нетбуке стоят WinXP Zver. Даже как то не посебе, раз у тебя все номрально, а у меня вылетает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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