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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2009, 00:59   #1
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию Графика в изометрии

Обобщил наработки построения игрового поля в изометрической плоскости.Предлагаю в виде небольшой статьи. В Приложении исходник с практическим примером использования.
Может кому то пригодится.
Вложения
Тип файла: rar ИзометрГрафика.rar (311.0 Кб, 115 просмотров)
Тип файла: rar Приложение.rar (425.7 Кб, 111 просмотров)
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 22.07.2009, 11:45   #2
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Запустил пример и в нем не понравилось что в определенных местах карты игрок телепортируется на немаленькие расстояния (движется рывками ). Статью просмотрел особо не вдумываясь но за старания +1.

Кстати а почему бы не создать тему где выкладывать различные статьи по непростым аспектам геймдева?
Вадим Буренков вне форума Ответить с цитированием
Старый 22.07.2009, 15:37   #3
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Для "быстрых" машин (свыше 1,8 ГГц) надо в коде убрать слэш коментария с задержки. Тогда движение будет плавным , без рывков

Код:
procedure MoveGosha(n,m: byte);
var i: byte;
begin
     for i:= 1 to (m * 30) do
     begin
       .  .  .   .   .   .
       Form1.Canvas.Draw(0,0,Buffer);
       //Sleep(30);   //  убрать комент
       x:= x+dx; y:= y+dy;
       InitSprite('BtnCtr.bmp',5,1,1,N_kadrB);
       LoadBuff(10,640,10,640,0);
    end;
end;
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 22.07.2009, 16:18   #4
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Есть пожелание, оформить это в теме "Уроки по созданию игр для новичков", только как полноценную статью, разделив на части, ...будет весьма наглядно и правильно.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.07.2009, 20:12   #5
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цитата:
разделив на части,
На какие части еще там делить? Всего то 4 странички материала, из них больше половины скриншоты.Вот если только добавить к "Урокам по графике" - http://depositfiles.com/files/rl0qvs73f - cсылка нерабочая (19.30)
Новая, рабочая ссылка - http://depositfiles.com/files/akgys12v5
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 22.07.2009 в 20:32. Причина: Не рабочая ссылка
DeKot вне форума Ответить с цитированием
Старый 22.07.2009, 21:08   #6
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Альтернативный вариант координат в изометрии

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

А я использую привычную координатную сетку, просто спрайты имеют изометрический вид, ...и заметил еще многочисленные вычисления, которых может и не быть. Вот так:
Изображения
Тип файла: jpg 2Dizom.jpg (46.8 Кб, 296 просмотров)
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.07.2009, 21:50   #7
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Многочисленные вычисления - это только на вид кажется, если не вникать в суть.А фактически приведенные выражения не сложнее , чем например :
Form1.ClientWidth:= Form1.Left + Form1.Width;
А фоновые рисунки в изометрии, понятнее описывать массивом, как бы привязанным именно к изометрической матрице.Но это, естественно, ИМХО.И как раз именно в программировании, как ни в чем другом , всегда множество альтернативных вариантов решений задач.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 22.07.2009, 22:59   #8
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Может это имеет значение для кого-то, и если позволит автор темы, я немножко приведу рабочие альтернативные варианты.
Вот так можно сразу перевести курсор на экране в координаты карты, по методу, что уже показал выше:

CellX := 1 + Trunc((MouseX - Form1.Left + {поправка по-X}) / Wp);
CellY := 1 + Trunc((MouseY - Form1.Top - {поправка по-Y}) / Hp);

MouseX, MouseY - это координаты курсора, как их берем не имеет значение, можно по таймеру через Mouse.CursorPos.X и Mouse.CursorPos.Y или из процедуры FormMouseMove.
Form1.Left, Form1.Top - присутствуют только в том случае, если игра работает в окне, которое можно перемещать по экрану. Поправка по-X и по-Y нужна для центровки курсора в точке, ...у меня например в Windows XP и Vista значение поправок разные, почему так я не знаю, но на экране центр будет одинаковый только если правильно его выбрать. Wp и Hp - это половина размера текстуры изометрической клетки карты, соответственно, пол длины и пол высоты в пикселях.

Отрисовка вообще элементарная. Вот так на задний план (сбор карты):

Код:
For t := 0 to N do
  Begin
    For z := 0 to M do
      Begin
        Buf.Canvas.Draw(z * Wp, t * Hp, {Bitmap});
      end;
  end;
...а вот так на объекты, например персонажа:

Код:
Buf.Canvas.Draw( Pers.PosX * Wp                              // положение по-X
                             + Pers.MoveX                                  // смещение по-X
                             + Abs(Wp - Pers.TexWidth) div 2    // центрирование по-X
                             , Pers.PosY * Hp                              // положение по-Y
                             + Pers.MoveY                                  // смещение по-Y
                             + Abs(Hp - Pers.TexHeight) div 2    // центрирование по-Y
                             , Pers.AnimTex);                             // граф. изображение кадра анимации персонажа
Статичные объекты отрисовываются точно так же, просто параметр MoveX и MoveY у них всегда равен нулю, ...или если здание может перемещаться, например как в StarCraft, то переменные динамически изменяются.

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

Еще проще и нагляднее метода не нашел, ...вся теория, обычно рушится, под напором оптимизации. Возможно это только мне этот метод ближе.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 22.07.2009, 23:54   #9
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Спасибо, Beermonza. Обязательно посижу просчитаю предложенные варианты расчета карты.Есть задумка написать универсальный модуль для таких случаев, надо только набраться еще практики и теории по этому вопросу. У меня так с модулем применения спрайтов получилось.Набралось информации из разных проектов, на их основе и собрал модуль.Сейчас зато просто - подключаю модуль в проект, а в самом коде пять-семь строчек вызова с параметрами и все "бегает", "стреляет"
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 23.07.2009, 00:27   #10
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клеточное поле в изометрии. proglamer HTML и CSS 10 26.05.2009 01:09
Графика StudentPolitech Помощь студентам 1 26.12.2008 19:13
графика ben95 Общие вопросы Delphi 3 06.02.2008 22:24
Графика С++ kommunist Общие вопросы C/C++ 6 14.01.2008 15:21
Графика Dizman Помощь студентам 20 17.12.2007 17:03