PDA

Просмотр полной версии : Как кодируются изометрические уровни с перепадом высот и наклонными поверхностями?



Smalovsky
15.06.2023, 15:10
Есть игры, в которых есть сложная изометрия с разным наклоном поверхностей. Это игры:Quazatron, Fairlight 2 и др.

https://zoneg.ru/wp-content/uploads/kak-igrat-v-mehanik_3.jpg

С Fairlight 2 вообще тёмная история, так как там произвольный угол наклона у поверхностей и с этими поверхностями происходит проверка коллизий.

https://www.myabandonware.com/media/screenshots/f/fairlight-ii-yj5/fairlight-ii_6.png

Мне интересно, какая структура данных уровней у таких игр?

NEO SPECTRUMAN
15.06.2023, 16:05
https://zoneg.ru/wp-content/uploads/kak-igrat-v-mehanik_3.jpg
это вообще можно описать картой высот и картой наклонов
фактически 2д плоскость

Smalovsky
15.06.2023, 17:14
это вообще можно описать картой высот и картой наклонов
фактически 2д плоскость

Как это будет выглядеть в асм-файле?

Я придумал так - у меня уровень кодируется двумя картами. Карты - физическая и графическая.
Для физической карты элемент массивы размером в байт. Его струкутура:
0-3 биты - четыре младших бита - блок или наклонная поверхность на высоте от 0 до 16;
4 бит - 0 - блок, 1- наклонная поверхность;
5 и 6 биты - тип блока (проходимый/непроходимый,несет урон) или ориентация наклонной поверхности;
7 бит - 0 - блок или наклонная поверхность это индивидуальный элемент, 1 - это сплошная колонна блоков с верхним блоком или наклонной поверхностью.( В принципе с этим битом можно не делать графическую карту, но усложнится алгоритм вывода)

Ну и сама физическая карта в ассемблере для примера 5 на 5:
;физическая карта 5 на 5 элементов
.db 0, 0, 0, 0, 0
.db 0, 1, 1, 1, 1
.db 0, 1, 2, 2, 1
.db 0, 1, 1, 1, 1
.db 0, 0, 0, 0, 0
; rulez forever!!!
По физической карте проверяются коллизии.

Графическая карта кодируется отдельно как обычная тайловая карта не связанная с физической. Элемент массивы графической карты - байт с номером тайла.

NEO SPECTRUMAN
15.06.2023, 17:33
для наклона можно иметь и 2 карты
наклон по x
и наклон по y
когда надо считать много столкновений

ну или вмещать в 1 байт
16 наклонов по x
16 наклонов по y

или 256 фиксированных рандомных наклона которых для игры хватит
вплоть до с разной "шераховатостью"


чтоб не считать "стены" на основе высоты
в некоторых случаях
можно так же хранить и доступные направления движения

Smalovsky
15.06.2023, 17:41
для наклона можно иметь и 2 карты
наклон по x
и наклон по y
когда надо считать много столкновений

ну или 16 наклонов по x
16 наклонов по y


Зачем две карты?
Для байта четыре младших бита - наклон по x, четыре старших бита -наклон по y. По икс наклон идёт направо и в глубину, для игрека вниз и в глубину. Как интерпретируются разности наклонов - может же получиться что наклон переходит в другой наклон не гладко? Нужен ещё байт высоты добавлять, чтобы указывать с какой высоты идёт наклон.

NEO SPECTRUMAN
15.06.2023, 20:33
Зачем две карты?
если ты захочешь сверху скинууть 600 шариков
твои попытки сэкономить 30 байт temp буфера
явно не ускорят процесс...
тыж на спецтруме

- - - Добавлено - - -


может же получиться что наклон переходит в другой наклон не гладко?
утя карту рисует человек
и если "пила" не нужна по игровому ппроцессу
то ее и не надо рисовать и выдумывать себе проблемы

впридачу на изичах можнно выщитать
ибо утя высота ТОЛЬКО для центра столбика

- - - Добавлено - - -

да и для каждого типа столбика (в варианте где 256 типов готовых)
может быть своя карта смещений высот
можешь хоть впукло/сфероидные столбики делоть
и шарики будут туда скатыватсо
если те надо перемещение с точностью больше чем размер столбика

Bedazzle
15.06.2023, 22:56
С Fairlight 2 вообще тёмная история, так как там произвольный угол наклона у поверхностей и с этими поверхностями происходит проверка коллизий.


Тут на форуме есть дизасм, я с польского на английский комменты переводил.

https://zx-pk.ru/threads/26129-grax-%E2%80%94-graficheskij-dvizhok-igry-fairlight.html?p=1071190&viewfull=1#post1071190

BlaireCas
16.06.2023, 01:46
С Fairlight 2 вообще тёмная история
ЕМНИП там специальный редактор Grax использовался, и он вовсе не был прямо изометрическим (первый fairlight тоже, не обязательно приводить второй, выглядел в изометрии конечно, но всякие вещи там сдвигались попиксельно и имели вес какой-то, навроде бочку толкать было сложнее чем "конфету"). Как строился уровень в Fairlight наверное надо спросить его автора шведа Bo Jangeborg, там у него еще была темная история как его кинул издатель игры и почему недоделан Fairlight 2 и он такой косячный и не особо хорошо играбельный.

Возможно лучше не брать игру эту Fairlight за пример уровней 3d в изометрии.
(а вообще это офигенная игра, первая ее часть, и ее музыка на спикере ZX компа через Wham - The music box - очень замечательная)

Lethargeek
16.06.2023, 23:13
даже для сложной многоуровневой трёхмерности выпуклые многогранники, например
их немного надо будет на одну комнату, просто потому что комнаты небольшие
а для блоков регулярной формы проще массивом

отрисовка - вообще отдельный вопрос, внутренней модели точно соответствовать не обязана

goodboy
16.06.2023, 23:16
отрисовка - вообще отдельный вопрос
в фарлайтах всё рисуется из примитивов, потом производится заливка

BlaireCas
17.06.2023, 14:14
отрисовка - вообще отдельный вопрос
А как отрисовать допустим уровень 2д сам? Пусть будут там на каждый квадратик свои высоты.
Идти "снизу вверх" и держать максимальные высоты на прошлом проходе чтобы понять рисовать или нет? Ну так оно в изометрии, там часть может быть закрыта, а часть - нет.

Bedazzle
17.06.2023, 14:24
А как отрисовать допустим уровень 2д сам? Пусть будут там на каждый квадратик свои высоты.
Идти "снизу вверх" и держать максимальные высоты на прошлом проходе чтобы понять рисовать или нет? Ну так оно в изометрии, там часть может быть закрыта, а часть - нет.

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

BlaireCas
17.06.2023, 14:44
цикл отрисовки идёт от дальнего к близкому
Вроде логичнее наоборот. Но при изометрии половина кубика стоящего на следующей линии все-равно может быть отрисована. Тут нужно какое-то пояснение в картинке.

https://i.imgur.com/81xQZDC.png

Lethargeek
18.06.2023, 18:44
А как отрисовать допустим уровень 2д сам?
да как хочешь, хоть как вообще двухмерную картинку без всякой связи

goodboy
19.06.2023, 15:22
вот вам игра Sentinel с видимой прорисовкой