shiru8bit

shiru8bit 

Программист, музыкант, самоделкин, ретрогеймер

89subscribers

914posts

Showcase and bundles

1
A bundle is a collection, compilation, playlist, or catalog of posts that saves you from searching through the blog and lets you buy the entire content series in a single click.

Карты в Bloodshot

Я очень люблю всякие допотопные технологии псевдо 3D графики. Люблю изучать ранние попытки изображать объёмные уровни и геометрию, всевозможные трюки, какие использовались в играх — встречаются крайне занимательные вещи. И среди этого интереса есть одна частность: «вид из глаз» в играх для Sega Genesis. Их на платформе всего около пяти штук, и каждая использует уникальные трюки.
Мой личный фаворит даже не супер-классный Zero Tolerance, в котором тоже много умопомрачительных трюков (типа лифта и лестницы, или спрайтовых дверей), а страшненький и тормозной Bloodshot.
Во-первых, как все давно уже заметили, стены в нём рисуются на половину их высоты, а другая половина отражена зеркально, и за счёт смены палитры вносится небольшая асимметрия (череп на двери). Во-вторых, из-за этого игра вынуждена отображать спрайты не на слое фона, а на отдельном слое аппаратных спрайтов, динамически конструируя его, чтобы покрыть нужные части экрана.
Но есть ещё в-третьих, и я всегда догадывался об этом, но не имел подтверждения. И в Bloodshot, и в ZT есть «диагональные» стены — если бы посмотреть на них сверху. Обычно в простых рейкастинг-движках мир состоит из клеток, и стена — это ребро куба, занимающего клетку, поэтому все стены расположены под 90 градусов друг к другу.
Диагональные стены в таких движках делать сложно, так как клетки проходятся алгоритмами типа DDA, и чтобы засечь попадение луча в диагональную стену, нужно выдумывать трюки. В ZT это скорее всего сделано увеличением разрешения прохода луча для «диагональных» клеток. Но есть ещё способ математически проверять принадлежащий клетке отрезок на пересечение с лучом. Клетка играет роль сектора, а DDA ищет видимые сектора.
Есть ещё один интересный момент, не сразу бросающийся в глаза. В Bloodshot есть «тонкие» колонны, размером в четверть клетки. И ещё один: двери в нём имеют толщину, включая текстуру на торце двери, а не являются тонкой анимированной текстурой, как в большинстве Wolf 3D-подобных игр. Почему? Исходя из этих визуальных наблюдений я очень давно предположил: в Bloodshot мир кодируется не клетками, а набором отрезков, и весь рейкастинг в нём работает на математической проверке пересечений луча и каждого отрезка. И именно поэтому он так тормозит.
Чтобы доказать это, я когда-то пытался разобрать формат карт, найти, где они вообще есть. Если бы они были просто клеточными, их легко было бы найти в бинарных данных просто глазами. Я нашёл текстуры, сделал их экспорт, но карты так и не нашёл. Это утвердило меня в мысли о верности теории, но прямого доказательства не было. И вот наконец я снова вернулся к этой теме, и обнаружил, что для игры сделали редактор карт. И да: они реально векторные! Дело закрыто!
Subscription levels6

Микро 16

$0.2 per month
Просто потому что нельзя 8. Даже самая малая поддержка важна. Спасибо!

База 128

$1.58 per month
Для тех, кто просто хочет поддержать. Спасибо!

Супер 256

$3.2 per month
Для тех, кто хочет поддержать. Спасибо!

Кило 320

$4 per month
Для тех, кто сильно хочет поддержать. Спасибо!

Мега 640

$7.9 per month
Для тех, кто очень хочет поддержать. Спасибо!

Гига 1024

$12.6 per month
Для тех, кто крайне хочет поддержать. Спасибо!
Go up