Начал переписывать проект на ZenGL. Зачем, почему - нет ответа: рефакторинг, бессмысленный и беспощадный. По идее, лучше было бы попробовать перейти на OpenGL 3.0+, но для 2d игры все эти VBO и шейдеры имхо не нужны, а вот предоставляемая ZenGL кроссплатформенность была бы кстати. Но на кроссплатформенности ставит крест мой переход с FPC на Delphi и активное использования Delphi-specific фич (лямбды, специализация функций). С другой стороны, рано или поздно в FPC они тоже появятся.
Зато в ZenGL нет проблем с выводом текста, а главное - прикольные демки по интеграции со световым движком, с партиклами частицами и с физикой Chimpunk. Надеюсь, до всего этого дойдет очередь.
Базовую структуру (таймер, обработку клавиш) - перевел, дело за графикой. С огорчением обнаружил, что в ZenGL нет трансформаций матриц - только одна движущаяся камера. Так что код рисования GUI будет не таким красивым. Хотя тут мас
Ну и главная потенциальная проблема - как раз GUI. С ZenGL придется отказаться от формошлепских фич дельфи и делать весь интерфейс на движке. Парсер файлов dfm в мой формат уже сделал, но все эти списки, текстовые поля... и главное все это без особой пользы для играбельности.
В моей системе квестов тоже обнаружились недочеты - у случайной генерации есть некоторые тонкости, и пока не знаю как решить их изяшнее. Например - есть квест "помочь Х". У него есть потомок - собственно квест помощи. На этапе генерации этим потомком становится... скажем квест "отнести посылку Y и вернутся". Но при генерации этого потомка может выпасть, что Y живет в той же деревне, что и Х, что делают доставку бессмысленной. Передавать потомку информацию о родительском квесте я не хочу - нужно промежуточное звено, чтобы и первый и второй квесты были независимы. Ну и аналогично для остальных типов квестов. И все это чтобы оставалось data-driven, т.е. считывалось из текстовых файлов и при этом без использования скриптов.
Концепция минималистического UI: всякие скроллбары и текстовые поля пока не нужны, думаю обойтись всего тремя основными элементами:
1 - "панель" - набор элементов, которые вместе отображаются либо прячутся. Примерно соответствует окну, но элементы могут быть расположены где угодно. Например панель интерфейса локальной карты, содержит список источников, список активных скиллов, игровое поле, мини-карту, кнопки вызова инвентаря\списка квестов\повышения уровня.
2 - "кнопка" - прямоугольник, отображающий любой графический объект (надпись, спрайт, источник частиц и т.д.) и способный реагировать на события от мыши. При инициализации параметризуется двумя функциями - OnDraw возвращает графический объект, OnMouse вызывается при событиях от мыши.
Забавно, но к примеру основное игровое поле является частным случаем "кнопки"(игровое поле наследуется не от кнопки, а от базового класса, но не суть) - в качестве объекта оно возвращает компоновщик всех рисуемых на поле монстров\препятствий\заклинаний, а по OnMouse управляет игроком.
3 - "список" - компонент, способный создавать последовательность однотипных кнопокэлементов GUI. Например списком будет полоска с источниками справа или список умений для повышения. Параметризуется прототипом создаваемой кнопки и двумя функциями - OnGenList возвращает или обновляет список кнопок, а OnItemEvent обрабатывает события от мыши для любого элемента.
Все это считывается из ини-файла, но как параметризовать события On... пока не уверен - либо с помощью наследования (т.е. будет TMinUIList -> TSourcesList, TActiveSkillsList...) либо по именам процедур (будет
[TMinUIList]
X1=0.86
...
OnItemEvent=PlayerSelectSource
OnGenList=PlayerSourcesList
)
Из далеких планов: будет четыре ветки навыков. При старте можно выбрать "класс", который определяет, сколько очков навыка будет выдаваться по каждой ветке с новым уровнем.
1. Магия потоков:
(это та, что уже присутствует в игре, т.е. основанная на соединении источников линиями магия)
2. Магия источников - при ней ведьма связывается с находящимся рядом источником и может использовать его энергию для заклинаний. Это проще, чем рисовать линии, но и менее эффективно по затратам энергии.
3. Ближний бой - ведьмовской стиль боя с использованием посоха или двух клинков. Атаки тратят запас выносливости.
4. Чары. Эта магия использует внутренний потенциал ведьмы (аналог "маны"). Обладает в основном непрямым действием и почти бесполезна против нежити.
А у меня очередная перестройка проекта.
Я собрал и настроил кросскомпилятор из под винды под Андроид.
И так как FPC+ZenGL поддерживают Android 2.1+, а у меня как раз планшет с Android 2.1, то я не мог удержаться от искушения и начал переводить Ведьму на Андроид.
Правда версия для винды тоже останется, т.к. отлаживать ее намного удобнее, но она будет просто копией приложения на Андроиде, весь интерфейс будет заточен именно под него.
Основная проблема - придется мигрировать назад с Delphi XE2 на FPC 2.6.0. А я уже так привык к лямбдам и итераторам со словарями. Всего этого на фрипаскале нет (лямбд нет и не предвидится, а генерики есть, но такие глючные что лучше бы их не было).
В общем, в данном случае жажда славы (ололо, среди приложений для андроида у меня точно будет меньше конкурентов, чем среди приложений для windows) перевесило стремление к красивому и лаконичному коду.
Пока у меня работает загрузка текстур и файлов данных, две сотни спрайтов показывают на моем относительно слабом планшете 25fps, в общем я полон оптимизма. Ах да, для ZenGL появился редактор частиц, так что всякую кровь и языки пламени тоже можно реализовать без особых проблем.
без измене шутка.
Сделал многопоточную загрузку, но выяснилось, что текстуры грузятся слишком быстро чтобы пользователь мог это заметить.
Перенес еще несколько простых модулей. Удалось даже откомпилировать, но проверять на девайсе не стал.
Перенес uGraph (обертку над графикой), начал переносить uMinUI (интерфейс) и uClass (игровую логику).
uMinUI перенесен, гуи работает.
Не удержался и оставил в версии для фрипаскаля генерики, но постараюсь использовать их по минимуму (т.е. только специализацию TList, никаких хеш-таблиц и енумераторов) - чтобы не напороться на какой-нибудь связанный с ними баг компилятора.
Осталась только собственная игровая часть.
uClass.pas исправил на 3/4.
uClass исправил, заодно сделал эффекты линий и фиксированные карты считываемыми из датафайло, теперь компилируется, но пока крашится при загрузке карты.
Подсел на ryzom, так что да, без прогресса.
Тема в архиве.