Shaos wrote:... далее буду выкидывать остатки C++ которые заключаются в 3 классах внутри (shSprite, shObject и ObjLib) - их надо заменить на структуры (ObjLib это динамический массив объектов shObject, которые могут ссылаться на разные либо один и тот же спрайт shSprite) - и 2 классах снаружи (Text и Line предназначенных для построения односвязных списков текстовых строк) - они используются для представления ссылок для перескоков и кеширования спрайтов - это я заменю статическими массивами.
P.S. При переписывании класса shObject на голимый си можно сразу добавить поддержку анимированных спрайтов и спрайтов которые с разных сторон выглядят по разному (как в DOOM). Пока в моём движке спрайт всегда повёрнут "лицом" к наблюдателю, причём один и тот же shSprite может использоваться во многих shObject-ах...
Shaos wrote:... анимацию можно сделать прямо сейчас. Ещё прям сразу можно поддержать "карты спрайтов", когда разные итерации персонажа (и даже разных персонажей) навтыканы в одну картинку с фиксированным шагом, например такой объект можно описывать так:
что может означать, что мы берём TXR-файл swin_2x3.txr и предполагаем, что там сетка 2х3 из которой мы берём 5-ую по счёту картинку (если считать слева-направо-сверху-вниз начиная с нуля), а если там анимация 2 Гц, то так:
Code: Select all
o0001 6.2 5.7 0 1.3 swin_2x3:5,swin_2x3:4
(т.е. 2 картинки через запятую дают анимацию 2 Гц, а 3 картинки - 3 Гц и т.д. что даёт цикл анимации всегда ровно в 1 секунду).
Shaos wrote:Всё-таки резать надо не по цифрам из имени, а по цифрам идущими следом:
o0001 6.2 5.7 0 1.3 swin:2x3:5
Можно также ещё спрайт зеркалировать по горизонтали указав например тильду после имени спрайта:
o0001 6.2 5.7 0 1.3 swin:2x3:5~
Анимацию которая крутится всегда можно обозначать специальным значком, например @
o0001 6.2 5.7 0 1.3 swin:2x3:5,swin:2x3:4@
Если значка нет, то надо показать первый спрайт и ждать команды от скрипта (либо от сишного кода, который будет дёргать некий API)
P.S. Наверное можно запрограммировать поворачивание спрайта (путём выбирания следующего спрайта при обходе) в зависимости от того с какой стороны на него смотрят:
o0001 6.2 5.7 0 1.3 swin:2x3:5,swin:2x3:4,swin:2x3:3,swin:2x3:2&
( в данном случае можно ограничиться только 4 сторонами т.к. мы всё-таки не дум тут делаем, где было 8 )
Shaos wrote:
Чтобы это всё поддержать надо добавить ещё один уровень абстракции:
- ObjLib это динамический массив объектов shObject;
- shObject это объект, который может ссылаться на разные либо один и тот же спрайт shSprite (+несколько спрайтов?);
- shSprite это абстрактный спрайт - сейчас один TXR-файл/картинка, но в будущем должен иметь возможность ссылаться на несколько картинок либо на разные части одной и той же картинки (чтобы поддерживать анимацию и вырезку кусочками);
- shImage это будет НОВЫЙ объект, обозначающий картинку, загруженную в память из TXR-файла (TXR формат это 2D картинка в 256-цветной палитре GamePal размером до 256х256 пикселов без сжатия).
P.S. Только надо будет переименовать эти штуки так, чтобы префикс был Virt, а не sh.
Я ещё нашёл в своих архивах код, который трогался последний раз в августе 2000 года, и он может рисовать настоящие 3D объекты внутри этого же самого движка, правда они должны быть выпуклыми и без текстур (цвет всей стороны одинаковый, но разные стороны могут быть окрашены в разный цвет). Ну ещё до кучи можно "проволочные" модели поддержать, когда объект рисуется не только полигонами, но и отдельными линиями. Рендерить это можно в тот же z-буфер, куда и плоские спрайты рендерятся, тогда они будут корректно закрываться кубами при необходимости. Такие типы объектов могут также представляться через shObject (т.е. теперь уже VirtObject).
Shaos wrote:P.P.S. В будущем надо будет ещё и мой графический формат 1995 года MYG поддержать - там есть прозрачность и RLE сжатие...
Пока можно обойтись TXR+SHAFF0