Добрый день!
Поиграл в старую игру меч и магия 4 и стало интересно как там реализован движок.
Как я понял там перемещение выполняется по клеткам и там не 3D движок, а набор картинок.
То есть клетка состоит из:
1. Текстуры поверхности трава, дорога, вода.
2. То что на поверхности : деревья, горы, предметы, здания, стены.
Есть общий фон неба который меняется.
Есть враги которые перемещаются не только по клеткам, но и по самой клетке.
А видимость состоит из клеток которые уменьшаются при удалении методом перспективы?
То есть перед собой видно например 4 клетки вперед, еще по 4 клетки вперед слева и cправа.
Текстуры просто натягиваются на размер клетки при удалении и приближении.
И там нет плавности перемещения, то есть при движении вперед сразу оказываемся на клетке.
Или все таки есть какие то конкретные технологии реализации псевдо 3D которые использовались?
Если вкратце, то всё вручную
Есть заготовленный набор спрайтов:
- объект на каждом возможном удалении (по 3)
- стена каждого типа вдоль/поперёк направления взгляда х на каждом возможном удалении
- пол каждого типа на каждой видимой клетке
В игре ты разом видишь 9 клеток, никакого 3д на лету не считается, просто соответстующие спрайты отрисовываются в нужном порядке в нужных местах на экране
https://gamedev.stackexchange.com/questions/92706/how-do-i-draw-l… eholder-style
Интересно.
Получается реализовать плавное перемещение персонажа вперед так не получится?
В играх где плавное перемещение получается уже полное 3D используется?
manking
> Получается реализовать плавное перемещение персонажа вперед так не получится?
Не получится.
> В играх где плавное перемещение получается уже полное 3D используется?
В целом да.
Но были читерские способы и это сделать - они особенно стали популярны с распространением CD-дисков. Это видео. Такая игра как Myst где в корне геймплея мы на экране с картинкой окружения щёлкаем по предметам (квест), но когда перемещаемся от экрана к экрану, то запускается видео с бесшовным переходом.
Можно поизвращаться с интерполированием, в середине 90х даже были прецеденты, но выглядеть будет плохо
Подобную систему придумали и использовали в своё время из-за технических ограничений, конкретно из-за того, что нельзя было налету эффективно трансформировать спрайты - вращать/масштабировать, только рисовать 1в1 попиксельно на экран
Если ты хочешь чтобы выглядело похоже, но с плавным перемещением, то самый эффективный метод - комбинировать 3д для стен/полов/поверхностей и 2д для объектов и персонажей, как в старых думе/дюке.
Там атлас со спрайтами для каждого типа клетки в каждой позиции. Поскольку видимость обычно клеток 5, то вариантов не очень много. Объекты поверх поверхностей, возможно, вторым слоем. Хотя, именно в MM3, 4, 5 такое было не особо нужно, я думаю.
Трансформация «на лету» бессмысленна уже тем, что в 3D она же будет сделана намного лучше (это если в наше время), а в 2D — будет многовато жрать процессорных мощностей (актуально во времена DOS).
Делать игру вот таким образом по нынешним временам — огромная и неоправданная морока.
3D и только 3D. По крайней мере, для окружения.
meekobold
alexyecu_wox2team
У меня несколько схожая проблема. Есть спрайт который меняет свои размеры и положение на экране 60 раз в секунду. Вместо спрайта я хочу воткнуть "гифку". Все это дело в браузере.
Гифки не дают менять свой размер и долго грузится, видимо загружает все кадры.
Соответственно вариант решения первый, создать атлас спрайтов и подгружать каждый тик нужный спрайт с нужным размером. Однако "объект" который нужно вращать, большой и вращается неторопливо (планета). То есть таких спрайтов придется рисовать очень много для обеспечения полного круга вращения.
Вариант второй. Сгенерить на сервере 3Д-шар, натянуть на него текстуру, сделать рендер(?) с нужного угла и готовый спрайт отправить пользователю. и так 60 раз в секунду...
Возможно еще какие варианты?
Ren
> Возможно еще какие варианты?
Нарисовать прямоугольник-"развертку" планеты и отображать её кусок, "протягивая" слева-напрво. Плюс скругленные границы.
html+js на сколько я помню позволяет нечто подобное.
А вобще, если у тебя пиксельарт (а иначе зачем ты пишешь в этой теме), хватит кадров 10-20 на планету (можно и гифкой), не надо там 60 раз в секунду обновлять
manking
> Получается реализовать плавное перемещение персонажа вперед так не получится?
Смотря что именно ты хочешь.
Если использовать технологии "прям как в прошлом" (в тех же старых m&m), то нет.
Если ты просто не хочешь заморачиваться с 3д - то в целом можно попробовать. Многие графические движки даже в режиме 2д позволяют отрисовать полигон с текстурными координатами. Т.е. клетка земли в текстуре - это просто квадратный тайл, но при отрисовке его на экран ты указывашь координаты четырех его вершин, которые будут образовывать искаженный четырехугольник (не квадрат). Придется заморочиться с математикой, но там по сути не особо сложно. Для движения вперед-назад будет норм выглядеть. Движение боком в стороны, возможно, тоже. Но вот повороты влево-вправо на месте вызовут дичайшую боль) В какой-то игре кстати видел реализацию таких поворотов "смещением" картинки, т.е. у нас есть текущий "кадр" - взгляд вперед, и при повороте, допустим, направо, сразу формируется кадр с изображением взгляда вправо, подставляется справа от текущей картинки и кадры смещаются налево, пока не придем к состоянию "смотрим вправо". Но выглядит это капец как ущербно.
А вобще, как уже советовали, делай полу 3д. Окружение (пол, стены потолок) трёхмерные, по факту - это просто кубы с текстурами, а объекты (монстры, деревья, разная фигня типа сундуков) - плоские (по сути тоже 3д, просто вертикальная плоскость, всегда повернутая нормалью к игроку)
(Я такое делал, например вот тут https://gamedev.ru/projects/forum/?id=253631, не сочтите за рекламу, проект заброшен. Там правда было в перемешку - 2д монстры и 3д модельки окружения - но не суть)
Tortugas
> Нарисовать прямоугольник-"развертку" планеты и отображать её кусок,
> "протягивая" слева-напрво. Плюс скругленные границы.
А есть возможность вырезать круг из прямоугольника "на лету"? Это тоже решение.....
> А вобще, если у тебя пиксельарт (а иначе зачем ты пишешь в этой теме), хватит
> кадров 10-20 на планету (можно и гифкой), не надо там 60 раз в секунду
> обновлять
Нет, не пиксель арт, а 60 кадров в секунду для расчета размера планеты в зависимости от расстояния и плавности изменений
Ren
>Все это дело в браузере
> А есть возможность вырезать круг из прямоугольника "на лету"?
>60 кадров в секунду
На чем пишешь то, для начала? )
> html+js
Если javascript с canvas, так можно произвольным образом рендерить на клиенте.
> Если javascript с canvas, так можно произвольным образом рендерить на клиенте.
https://rextester.com/PBOC9833
Или лучше так: https://rextester.com/NFZ21670
F8 чтобы запустить.
Tortugas
> На чем пишешь то, для начала? )
JS, да.
FordPerfect
то что надо
Tortugas
> А вобще, как уже советовали, делай полу 3д. Окружение (пол, стены потолок)
> трёхмерные, по факту - это просто кубы с текстурами, а объекты (монстры,
> деревья, разная фигня типа сундуков) - плоские (по сути тоже 3д, просто
> вертикальная плоскость, всегда повернутая нормалью к игроку)
3D конечно кажется интересней и проще в плане расчета координат, видимости, физики и.т.д.
С другой стороны 2D смотрится по особому, как то по иному и более красочно. Чем то цепляет.
Tortugas
> (Я такое делал, например вот тут https://gamedev.ru/projects/forum/?id=253631,
> не сочтите за рекламу, проект заброшен. Там правда было в перемешку - 2д
> монстры и 3д модельки окружения - но не суть)
Интересная игра, а движок сильно от unity отличается? Исходники не выложены? Язык C# такой же.
А в плане затрат на отрисовку текстуры 3D дороже будут стоить чем 2D спрайты? Чтобы в высоком разрешении и красочно было сделано?
Тема в архиве.