Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
1-1106232953
Eraser
2005-01-20 17:55
2005.02.06
Baloon Hint в трее + win 98


1-1106673942
Pers
2005-01-25 20:25
2005.02.06
Папки и файлы


14-1106164322
matt
2005-01-19 22:52
2005.02.06
CAN - переходники


3-1104474508
ceval
2004-12-31 09:28
2005.02.06
Как настроить ADO что бы быстрее работало с dbf,а то


1-1106148177
DSKalugin
2005-01-19 18:22
2005.02.06
нечитаемая кодировка строк





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский