Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Ужасная проблема с изометрией... Помогите :)))   Найти похожие ветки 

 
Зелёный Буран   (2004-10-27 03:35) [0]

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

Есть карта такого вида:

    /\
   /\/\
 Y/\/\/\X
 /\/\/\/\
/\/\/\/\/\
/\/\/\/\/\/\
\/\/\/\/\/\/
\/\/\/\/\/
 \/\/\/\/
 X\/\/\/Y
   \/\/
    \/

То есть тайлы рисуются не слева направо и не сверху вниз, а по осям, которые я там выделил. Кучу времени протратил на рисование этой иллюстрации :)

У всех объектов есть слои - для земли - 0, для людей - 1, а для зданий - 2.
Координата каждой клетки - число клетки, то есть если 0, то рисуется без сдвига, а если 1, то сдвиг не 1 пиксел, а клетка. Если все это рисовать в цикле, то без проблем.

А вот когда надо нарисовать человека где-то между клетками, то он перекрывается. Например он идет между двух коробок, как рисовать, если по Y = 3 он перед коробками, а Y = 4 он уже между ними. Надо плавно его пперемещать. Я пробовал плавно, но ведь идет цикл типа

for i:=0 to height-1 do
for j:=0 to width-1 do
 drawtile(j, i);

То есть какая болжна быть координата, чтобы этот человек был между 3 и 4? Если естаелся 3, то человек рисуется повер стоящей ближе к камере коробке, а если 4, то поверх человека рисуется лежащий сзади тайл земли...

Фишка в том, что такой глюк только по одной координате, X или Y, в зависимости от того, какого вида цикл. Выше я показал, что сначала отрисовываются ряды, а потом колонки. Тогда глюк возникает, когда двигаю человека по Y. А если сначала рисовать колонки, а потом ряды, то такое будет уже по X... Как же рисовать???

Помогите :)


 
Зелёный Буран   (2004-10-27 03:37) [1]

Кривая там получалась


    /\
   /\/\
 Y/\/\/\X
 /\/\/\/\
/\/\/\/\/\
/\/\/\/\/\/\
\/\/\/\/\/\/
\/\/\/\/\/
 \/\/\/\/
 X\/\/\/Y
   \/\/
    \/


 
Ozzya   (2004-10-27 07:27) [2]

http://delphigfx.narod.ru/2d/2d_6.htm


 
Зелёный Буран   (2004-10-27 07:56) [3]

Там я сто лет назад бывал, фиговая статья.


 
NikeOLD ©   (2004-10-27 09:22) [4]

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

Статью тебе подсказали правильную.


 
П7   (2004-10-27 11:06) [5]

Я так понимаю, что ты сначала отрисовываешь тайлы, затем людей, затем дома... Если так, то конечно у тебя последние выведенные объекты будут перекрывать остальные.

Что значит "по осям"? Так или иначе отрисовка тайлов ложна весись от более дальних к более близким. Чтобы сохранить глубину. Иначе всё будет друг друга перекрывать.


 
nexxiss ©   (2004-10-27 13:40) [6]

тут лежит неплохой пример изометрии:
http://delphigfx.mastak.ru/samples7.htm


 
Зелёный Буран   (2004-10-28 05:13) [7]


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


Сама карта отрислвывается у меня правильно, но только когда человек находится например в 3й или 4й клетке. А вот если он между 3й и 4й, то тогда и виден глюк... Так как не принадлежит никакой клетке...

Просьба - посоветуте исходник, где помимо зданий есть еще и объекты, которые могут двигаться не по клеткам, а плавно.
Я давно исследовал http://delphigfx.mastak.ru/ и нашел бы там, если б было.


 
П7   (2004-10-28 07:34) [8]

Так или иначе он должен принадлежать какой-то клетке. Как ты не округляй значения его координат, всё равно "на одну из клеток он будет заезжать больше, чем на вторую". Что значит - посередине. Введи персу 2 типа координат - физические и изометрические. Изометрические используй для отрисовки и обновляй только тогда, когда "в своём движении персонаж заехал на соседнюю клетку", а физические всегда во время движения.
Или используй анимацию перса, как в Fallout. Там движение на клетку анимировано в спрайте.
Выложи-ка лучше бин своей проги, чтобы заценить глюк и понять, что же ты всё-таи пытаешься объяснить...


 
Megabyte-ceercop ©   (2004-10-28 08:35) [9]


> П7   (27.10.04 11:06) [5]
> Я так понимаю, что ты сначала отрисовываешь тайлы, затем
> людей, затем дома... Если так, то конечно у тебя последние
> выведенные объекты будут перекрывать остальные.


В том то и глюк, что Буран отрисовывает последовательно все тайлы и персонажей одновременно, а с\если бы сперва нарисовал всю карту, а потом спрайты, то спрайт был бы всегда поверх всех "коробок" и никогда не перекрывался бы ими.

Буран, делай так - рисуй сперва всю карту без учета спрайтов, а затем поверх все спрайты (слой 2) а затем и здания (слой 3).
Вроде это то что тебе нужно. :)


 
П7   (2004-10-28 13:58) [10]

Если грамотно организовать отрисовку "от дальних к ближним", то никаких перекрытий не будет. Другое дело, если вывдить ромбом, "по осям", но делать это не в той последовательности - тогда да, могут возникать свякие призабавнейшие глюки. Если проблема ещё не решена, а хочется, то могу нарисовать небольшую илюстрацию, для наглядности.

ГЫ. Выкладывай экзешник!!! (:


 
Mihey_temporary ©   (2004-10-28 15:16) [11]


> http://delphigfx.narod.ru/2d/2d_6.htm


Кстати, ИМХО абсолютно ужасная статья.


 
П7   (2004-10-29 14:06) [12]


> Mihey_temporary ©   (28.10.04 15:16) [11]

И что же в ней ужасного? Всё прозрачно написано. Бери и пользуйся. Даже, для особо одарённых, сделали семплы. Что ещё не хватает? Готового движка, который можно взять и использовать? Так и таких полно, поищи только...


 
Mihey_temporary ©   (2004-10-29 15:37) [13]

Могу сказать, что ужасного. Написано как раз таки весьма поверхностно. Ни слова про стыки тайлов. Ведь можно сделать тайлы с наложением, можно без. То, что ромбик то сам в высоту на единичку меньше всё-таки не так уж очевидно. Система координаты ну просто откровенно неправильная - такая, что автору пришлось разбивать карту на чётные и нечётные ряды. А об объектах он подумал? Сначала выводить на нечётных рядах, потом на чётных? Но самое смешное - это та разноцветная маска по которой определяются координаты тайла.


 
Зелёный Буран   (2004-10-30 06:15) [14]


>  Но самое смешное - это та разноцветная маска по которой
> определяются координаты тайла.

Ага :)

Я уже перепробовал все методы :) Вот смотрите, если рисовать сначала землю (0), потом чувака (1), потом коробки (2), то - Чел всегда будет поверх земли, это понятно, но: если коробки рисовать после чела, то коробки, которые лежат за чуваком, все равно будут поверх него, ведь так? Это если каждый слой со спрайтами рисовать "с нуля", а вот если в каждой клетке рисовать слои по порядку, тогда другой глюк - какой клетке будет принадлежать чел если он между ними? Например, он находится между 3й и 4й клетками по вертикали, а по горизонтали пусть точно на какой-нибудь. Тогда, если его рисовать вместе с 3й клеткой, то будет мешать 4я, а если наоборот, то 3я :( Вот такая беда!

Сейчас создам всременную страничку, скину туда BIN, а также SRC на всякий косяк :)


 
Зелёный Буран   (2004-10-30 07:57) [15]

Вот создал - скачайте, посмотрите :)

http://kiramidjr.hotbox.ru/izosadomazosrc.exe - исходник, нужен DelphiX

Немного не доделано, но идея надеюсь будет понятна :))


 
Зелёный Буран   (2004-10-30 07:59) [16]

Блин, надо так :(((

http://kiramidjr.hotbox.ru/IzoSadoMazoSRC.exe


 
П7   (2004-10-30 14:45) [17]

Гляну сегодня вечером...


 
Mihey_temporary ©   (2004-10-30 19:19) [18]


> Я уже перепробовал все методы :) Вот смотрите, если рисовать
> сначала землю (0), потом чувака (1), потом коробки (2),
> то - Чел всегда будет поверх земли, это понятно, но: если
> коробки рисовать после чела, то коробки, которые лежат за
> чуваком, все равно будут поверх него, ведь так? Это если
> каждый слой со спрайтами рисовать "с нуля", а вот если в
> каждой клетке рисовать слои по порядку, тогда другой глюк
> - какой клетке будет принадлежать чел если он между ними?
> Например, он находится между 3й и 4й клетками по вертикали,
> а по горизонтали пусть точно на какой-нибудь. Тогда, если
> его рисовать вместе с 3й клеткой, то будет мешать 4я, а
> если наоборот, то 3я :( Вот такая беда!


Зависит от того, что представляет собой игра. Например, я использовал такой способ - рисовал поверхность, а потом все объекты, сортируя их по координатам (координаты нижнего ближнего к зрителю угла). Но, например, в Red Alert такая фишка не пройдёт - там ведь переменная высота поверхности.


 
Зелёный Буран   (2004-10-31 01:06) [19]


> Но, например, в Red Alert такая фишка не пройдёт - там ведь
> переменная высота поверхности.


Вот! Я тоже пытаюсь сделать что-то в этом роде :)


 
П7   (2004-10-31 08:26) [20]

Высота поверхности может выражаться в двух видах:
1. Уровни (этажи), как, например, Fallout Saxtics (:
2. Ландшафт

В Первом случае нужно выводить поуровнево, сначала нижний уровень "сверху-вниз" затем второй и т.д.

Во втором случае лучше использовать 3D реализацию ландшафта и в этом случае все "глубинные" опирации возьмёт на себя карточка.



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.065 c
4-1102968498
Mihey_temporary
2004-12-13 23:08
2005.02.06
Hook wanted


1-1106500619
ZL
2005-01-23 20:16
2005.02.06
Line


14-1106019766
Думкин
2005-01-18 06:42
2005.02.06
С Днем Рождения! 18 января


1-1106578926
viola
2005-01-24 18:02
2005.02.06
Как изменить цвет фона некоторой строки StringGrid-а


1-1106438788
FFFFF
2005-01-23 03:06
2005.02.06
Как запретить внесение изменений Items в ComboBox?