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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2008, 19:41   #11
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Я как раз и спрашивал мнения, а не " не соглашался".
Это был вопрос ко всем. А свое мнение я уже сказал - я освобождаю вручную только временные, больше не нужные объекты.

2 Beermonza, ну ладно, астероида ) Однако все вместе это все равно называется Солнечная Система )
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, 19:49   #12
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
2 Beermonza, ну ладно, астероида ) Однако все вместе это все равно называется Солнечная Система )
Ну, да, Солнечная Система, ...Солнце, 8 планет и астероид )))

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

Последний раз редактировалось Beermonza; 21.08.2008 в 19:53.
Beermonza вне форума Ответить с цитированием
Старый 21.08.2008, 20:26   #13
BangBangFM
Заблокирован
 
Регистрация: 12.08.2008
Сообщений: 166
По умолчанию

Цитата:
Солнце, 8 планет и астероид


Замучил прикалываться. Между прочем пояс остеройдов тоже когдато был планетой, че теперь и его делать?
BangBangFM вне форума Ответить с цитированием
Старый 21.08.2008, 20:53   #14
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Хотите поспорить? ...тогда в отдельной теме.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 21.08.2008, 21:11   #15
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Лампочка продолжение...

Космос мы уже создали. Теперь займемся планетами. Нам нужно позаполнять свойства у всех планет. Запишем их в константы.
Код:
const
  colors: array[0..8] of TColor = (
    11713464,
    2985931,
    15571305,
    1928136,
    8304062,
    5288427,
    16178350,
    13074777,
    11713464);
  radiuses: array[0..8] of byte = (
    3,
    5,
    6,
    4,
    12,
    10,
    8,
    7,
    2);
  names: array[0..8] of string = (
    'Меркурий',
    'Венера',
    'Земля',
    'Марс',
    'Юпитер',
    'Сатурн',
    'Нептун',
    'Уран',
    'Плутон');
  orbits: array[0..8] of integer = (
    20,
    35,
    50,
    70,
    100,
    145,
    190,
    240,
    290);
  periods: array[0..8] of integer = (  //единственный реальный параметр
    88,
    225,
    365,
    687,
    4332,
    10762,
    30689,
    60201,
    90485);

  SUN_RADIUS = 10;
Последняя константа — радиус солнца.

Теперь напишем процедуру заполнения этих данных в массив, и добавим вызов процедуры InitPlanets в FormCreate, в самый конец.
Код:
procedure TForm1.InitPlanets;
var
  i: integer;
begin
SetLength(planets, 9);
for i:=0 to Length(planets)-1 do
  with planets[i] do
    begin
      radius:=radiuses[i];
      name:=names[i];
      color:=colors[i];
      orbit:=orbits[i];
    end;
end;
Функцией SetLength задаем размер массива, динамическим я его сделал по привычке, в принципе можно было и статическим сделать, тогда длину ему задать нужно было бы сразу, при объявлении - planets: array[0..8] of TPlanet;
Затем всем планетам по очереди заполняем поля из константных массивов.

Сегодня пока все, на меня напал облом )
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 вне форума Ответить с цитированием
Старый 23.08.2008, 15:31   #16
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
Лампочка продолжение...

Пора поговорить про анимацию. У нас будет предельно простая, но все же анимация. Будет движение объектов, а именно планет, по окружности.
Для начала рассмотрим принцип прямолинейного движения. При прямолинейном движении координаты объекта меняются обычным прибавлением или вычитанием. Например при горизонтальном движении Y координата остается неизменной, а X меняется с определенным шагом, если меняется в большую сторону, объект движется вправо, в меньшую – влево. Шаг изменения определяет скорость перемещения наравне с интервалом таймера, нужно подбирать их так, чтобы движение выглядело “мягче”.

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

Сначала добавим в запись TPlanet пару полей для удобства, вот так она будет выглядеть
Код:
  TPlanet = record
    x,y: integer; //это для удобства, координаты всегда будут "под рукой"
    orbit: integer; //расстояние орбиты от солнца
    angle: integer; //текущее положение планеты на орбите
    radius: byte; //радиус планеты
    color: TColor; //цвет планеты
    name: string; //имя планеты
    period: integer; //период обращения вокруг солнца (в сутках)
  end;
Добавим пару глобальных констант, это координаты цетра нашей системы, вокруг него все и будет вращаться.
Код:
const
  CX = 300;
  CY = 300;
Теперь допишем процедуру DrawSystem, напомню, в ней происходит отрисовка. Первая и последняя строки вам знакомы, между ними теперь есть отрисовка солнца, и планет в цикле.
Код:
procedure TForm1.DrawSystem;
var
  i: integer;
begin
buffer.Canvas.Draw(0,0,cosmos);
with buffer.Canvas do
  begin
    Brush.Color:=clYellow;
    Pen.Color:=clYellow;
    Ellipse(CX - SUN_RADIUS, CY - SUN_RADIUS,
      CX + SUN_RADIUS, CY + SUN_RADIUS);
    for i:=0 to Length(planets)-1 do
      begin
        Brush.Color:=planets[i].color;
        Pen.Color:=planets[i].color;
        Ellipse(planets[i].x-planets[i].radius, planets[i].y - planets[i].radius,
          planets[i].x+planets[i].radius, planets[i].y + planets[i].radius);
      end;
  end;
Canvas.Draw(0,0,buffer);
end;
Теперь самое интересное – координаты, где же именно они нарисуются? С солнцем понятно – в центре, а планеты? На данный момент, все они отрисуются в нулевых координатах, т.е. в левом верхнем углу. Можете запустить код и убедиться в этом. Чтобы увидеть их по раздельности, временно добавим такой код в процедуру инициализации планет – InitPlanets, после orbit:=orbits[i];
Код:
      x:=Random(576)+12;
      y:=Random(576)+12;
Компилируем и любуемся ) Это просто чтобы увидеть как они будут выглядеть, и что собственно мы будем крутить вокруг солнца. Сотрите эти две строки, они нам не понадобятся.

Теперь приступаем к самой интересной части урока – движение по окружности.
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 вне форума Ответить с цитированием
Старый 28.08.2008, 10:27   #17
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Продолжение то будет?
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 29.08.2008, 22:13   #18
L_M
Форумчанин Подтвердите свой е-майл
 
Регистрация: 25.02.2008
Сообщений: 289
По умолчанию

а как насчет движения по эллипсу?
Упс...
L_M вне форума Ответить с цитированием
Старый 30.08.2008, 12:36   #19
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Код:
procedure _Ellipse(Rect: TRect);
var
  a: real;
  ks,kc: real;
  xc,yc: real;
  s,c,r: real;
begin
  a:=0;
  ks:=(Rect.Bottom-Rect.Top)/2;
  kc:=(Rect.Right-Rect.Left)/2;

  xc:=(Rect.Left+Rect.Right)/2;
  yc:=(Rect.Top+Rect.Bottom)/2;

  r:=Max(ks,kc);
  while a<=pi*2 do
    with form1.Canvas do
    begin
      s:=sin(a)*ks; c:=cos(a)*kc;
      Pixels[round(c+xc),round(s+yc)]:=0;
      a:=a+1/r;
    end;
end;

Последний раз редактировалось Kostia; 31.08.2008 в 10:28.
Kostia вне форума Ответить с цитированием
Старый 30.08.2008, 21:20   #20
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Есть у меня такая черта, редко когда заканчиваю начатое. У меня на диске пылится куча незаконченых программ.

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

В принципе половина объяснения уже написана, и лежит в файле у меня на диске, так что думаю я ее скоро допишу. А там и программу доделать можно будет.
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 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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