Форум: "Игры";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизУжасная проблема с изометрией... Помогите :))) Найти похожие ветки
← →
Зелёный Буран (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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c