Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2008, 16:18   #1
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию Солнечная система (знакомство с синусом)

В этой теме я расскажу, как написать на Delphi модель солнечной системы. Заодно читатель узнает как можно применить тригонометрию, в частности синус, на практике. Модель будет простая, утрированная, цель урока не сама солнечная система, а заюзать синус.
Система будет в 2D на чистом VCL, т.е. на чистом Delphi. Уровень подготовки - для начинающих.

Все желающие могут задавать вопросы. Также можно оставлять комментарии.

Пост со следующей частью урока я буду обозначать лампочкой.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 20.08.2008, 22:00   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Итак приступим. Как вам наверное известно, солнечная система представляет собой солнце и вращающиеся вокруг него 9 планет. Каждая из них имеет свою орбиту, свою скорость, массу и т.д. Я сильно не буду придерживаться реализма, и попытаюсь умесить всю нашу систему так, чтобы все планеты были видны, и при этом различимы. То же касается размера солнца. Единственный параметр к-рый я хочу соблюсти это период обращения, при этом программа будет определять парад планет, если я не ошибаюсь это когда все планеты выстраиваются в ряд. К тому же орбиты планет представляют собой не круг, а вытянутый эллипс, у меня будет круг, опять же для простоты. Параметры планет я взял отсюда, желающие могут ознакомиться
http://www.astronet.ru/db/msg/eid/FK86/planets

Заканчиваем с астрономией, переходим к программированию. Готовый исходник я давать не буду по двум причинам, во первых его еще нет, а во вторых в целях лучшего понимания материала, код буду давать постепенно по частям, но весь.

Кроме синуса, также будут рассмотрены структуры (они же записи), битмапы (TBitmap), анимация (передвижение планет), массивы, работа с массивами в цикле, все это используется в программировании игр.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 20.08.2008, 22:09   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Лампочка

Создайте проект. Свойствам формы в инспекторе объектов задайте значения:
Left 0
Top 0
ClientWidth 800
ClientHeight 600
Теперь киньте на форму таймер. Задайте ему интервал 20 мс.
Interval 20

Теперь немного попишем код. Сначала определимся с планетами. Создадим структуру TPlanet с полями содержащими свойства планеты.
Код:
  TPlanet = record
    orbit: integer; //расстояние орбиты от солнца
    angle: integer; //текущее положение планеты на орбите
    radius: byte; //радиус планеты
    color: TColor; //цвет планеты
    name: string; //имя планеты
  end;
Добавьте ее в раздел type.

Затем объявим нужные глобальные переменные. Нам понадобятся два битмапа, один для фона — cosmos, второй для буфера — buffer. Буфер — это область памяти в к-рой будет строиться изображение перед выводом его на экран. Еще нам понадобится массив планет — planets. Пока все.
Код:
var
  Form1: TForm1;
  buffer: TBitmap;
  planets: array of TPlanet;
  cosmos: TBitmap;
Теперь создадим небо и звезды. Щелкните дважды по форме, среда создаст при этом обработчик создания формы FormCreate. Заполним его.
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
Randomize;
cosmos:=TBitmap.Create;
cosmos.Width:=ClientWidth-200;
cosmos.Height:=ClientHeight;
with cosmos.Canvas do
  begin
    Brush.Color:=0;
    FillRect(ClipRect);
    for i:=0 to 99 do
      Pixels[Random(ClientWidth-200),Random(ClientHeight)]:=clWhite;
  end;
buffer:=TBitmap.Create;
buffer.Assign(cosmos);
end;
Функцией Randomize инициализируем генератор случайных чисел.
Создаем космос, это у нас фон.
Задаем ширину меньшую на 200, чем ширина формы, в правой части формы у нас будут несколько элементов управления, но это потом.
Задаем высоту равную высоте формы.
Задаем кисти канвы фона черный цвет.
Заливаем фон целиком черным цветом.
И рисуем 100 белых пикселей в случайных местах, это будут звезды.
Затем создаем буфер.
Теперь нам нужно задать размеры буферу, и скопировать в него изображение из фона. Вместо того, чтобы писать несколько строк кода, просто скопируем его функцией Assign. Она копирует не только изображение, но и все другие свойства битмапа, делает полную его копию.

Осталось немного, и наш космос можно будет увидеть. В обработчике таймера (чтобы его создать кликните дважды по таймеру на форме) запишите одну строку
Код:
DrawSystem;
А теперь напишите саму процедуру DrawSystem
Код:
procedure TForm1.DrawSystem;
begin
buffer.Canvas.Draw(0,0,cosmos);
Canvas.Draw(0,0,buffer);
end;
Обратите внимание она должна быть методом класса TForm1, чтобы сделать ее таковой, кликните правой кнопкой мыши по ее заголовку, и выберите Complete Class at cursor, также можно вручную поместить ее объявление в privat. Все последующие процедуры и функции также будут методами класса TForm1.
В ней мы копируем фон (космос со звездами) в буфер. И второй строкой выводим буфер на канву формы, т.е. на экран. Спросите, зачем нужен буфер? Потом узнаете.

Теперь жмите F9. На форме должен появиться космос со звездами, и справа свободное место.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.08.2008, 10:39   #4
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

А перед закрытием программы не надо очищать буферы? А то мы так всю
системную память засорим.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 11:21   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

В Delphi не нужно. Там есть уборщик мусора.
Kostia вне форума Ответить с цитированием
Старый 21.08.2008, 11:41   #6
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

А во многих учебниках настоятельно рекомендуют после вывода из буфера типа TBitMap информации на форму включать очистку буфера
Buffer.Free;
И по программе: а не проще ли создать черный фон, указав в Object Inspector в свойстве формы Color - clBlack ?
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 15:12   #7
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Чистить нужно только если вы самостоятельно выделили память для своего буфера (есть такие способы, для быстрой работы), ...в стандарте Delphi сам уберет свои "потроха", если не произойдет какой-либо сбой в программе, который не позволит выполнить освобождение памяти, ...именно поэтому рекомендация принудительного очищения описана всюду.

ИМХО задник со звездами - фотография с Хабла гораздо интереснее черного экрана с самодельными звездочками ) ... синусов тут нету, поэтому может сразу приучать к качеству? ...ну, не знаю, ...у меня руки всегда чешутся как-то придать реализму.

На заметку: планет всего 8, а 9-я - это астероид прилетевший с астероидного пояса ) ...называйте вещи своими именами ), ...ну, да Бог с этим, мы же не астрономы, и хорошо что таковых тут нет, иначе нас бы просто убили за 9 планет ))))
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 21.08.2008 в 15:16.
Beermonza вне форума Ответить с цитированием
Старый 21.08.2008, 18:09   #8
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
А во многих учебниках настоятельно рекомендуют после вывода из буфера типа TBitMap информации на форму включать очистку буфера
Buffer.Free;
Метод Free - это не очистка, это уничтожение объекта. У меня и буфер и фон используются на протяжении всей программы, не вижу смысла их при каждой отрисовке создавать и уничтожать.

А если учитывать возможность сбоя, то и свой код освобождения памяти может так же не выполниться из-за сбоя, на то он и сбой. Вы со мной несогласны?

Это как недавно был спор по поводу инициализации нулями. На мое высказывание что при создании объекта память под него заполняется нулями, мне ответили что полагаться на это не стоит, и лучше самому присвоить полю ноль. Но ведь само создание объекта эти же люди доверяют Дельфи, не пишут ведь свой код создания, а вот нули не доверяют, нужно руками вписать.

Цитата:
ИМХО задник со звездами - фотография с Хабла гораздо интереснее черного экрана с самодельными звездочками ) ... синусов тут нету, поэтому может сразу приучать к качеству? ...ну, не знаю, ...у меня руки всегда чешутся как-то придать реализму.
Вы еще планеты не видели ))) Я в начале писал, цель - не сама планетная система. Так что реализьма не будет ) А вот синусы будут )

Цитата:
На заметку: планет всего 8, а 9-я - это астероид прилетевший с астероидного пояса ) ...называйте вещи своими именами ), ...ну, да Бог с этим, мы же не астрономы, и хорошо что таковых тут нет, иначе нас бы просто убили за 9 планет ))))
Слышал что-то про это. Раз пристроился сзади - значит планета )
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 21.08.2008, 18:33   #9
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
Вы со мной несогласны?
Я как раз и спрашивал мнения, а не " не соглашался".
По поводу мнений о фоне и т.п. вопросам, думаю, раз каждый кто по ходу
урока пишет сам код в соответствии с рекомендациями mutabor, то можно вносить какие-то сои изменения в проект, не касающиеся глобального изменения идеи проекта.Более того потом интересно сравнить разные варианты реализации проекта.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 21.08.2008, 19:34   #10
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Думаю, тут особо вариантов не наделать, все предельно просто и однозначно с системой Солнца, 8-и планет и одного астероида )))) ... тут только на нюансы вывода графики и оформления, ...через таймер смена ула и радиуса для всех планет и астероида ))) ...с задержкой через счетчик.

Дождемся официальной версии от автора, собственно, он создал урок и делится опытом, ...а потом все изменения, если таковые потребуются, в чем я лично сомневаюсь.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 21.08.2008 в 19:39.
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Знакомство с одноклассниками Alar Свободное общение 10 03.07.2008 22:20
Файловая система student_63 Win Api 1 12.04.2008 20:29
Система координат SunKnight Общие вопросы Delphi 2 05.02.2008 19:42