Fallout на WPF
На днях вспомнил про свой пет-проект семилетней давности и подумал, что будет интересно поделиться тем, как я почти "сделал" Fallout на WPF с 20 fps-геймингом.
В 2016–2017 годах мы с братом любили играть в Fallout Online, золотое время было. Неофициальные серверы, приключения, 50–100 человек онлайна, необычная атмосфера. Часто встречаешь знакомых игроков, которые либо помогали тебе когда-то, либо убивали на просторах Пустоши.
И в тот период между мной и братом возникали разговоры: а не поднять ли нам свой сервер?
Всё это я не воспринимал всерьёз, так как казалось технически сложно реализуемым. Постепенно сервер на котором мы играли пустел и вскоре закрылся, переходить на другой сервер уже не было желания, а идея о собственном сервере навсегда осядет в этом посте.
Время шло, я учился на программиста в универе, а в общаге было особо нечего делать. И тут мне пришла мысль: а почему бы не попробовать сделать Fallout? Не в смысле игру в жанре Fallout, а прямую копирку. Почему и как я тогда решился — уже не вспомню. Сейчас бы точно не стал этим заниматься, это была бы очень глупая трата времени, но тогда я всё же начал. Слабоумие и отвага, не иначе.
Перед тем как приступить к разработке, нужно было выбрать, на чём делать игру. На тот момент у меня был небольшой опыт работы с WinForms — на нём я делал лабораторные работы и простенькую игру.
В то время Unity казался мне слишком сложным, и желания его изучать не было, а зря. WinForms был устаревшим, и делать игру на нём мне не хотелось. Недолго поискав альтернативу, которая не потребовала бы слишком болезненного перехода, я нашёл WPF — относительно современную замену WinForms. А в Visual Studio был удобный редактор для работы с формами, и быстро созданное нечто выглядело так:
На игру не похоже, но это только начало. Помимо инвентаря нужно было добавить поле, по которому игрок будет перемещаться.
Как перемещаться по карте, представления не было. Не помню, чтобы на первом курсе рассказывали про такие алгоритмы. Снова интернет объяснил, что мне нужен волновой алгоритм. Скопировав готовый код с горем пополам прикрутил к карте.
С квадратами получилось, теперь надо было пересесть на сетку гексагонов. Но с этим были проблемы. В WPF нет встроенной поддержки гексагонов, а дорабатывать самому было очень сложно. Это должны были быть кнопки нестандартного размера. С облегчением нашел готовое решение и ведь кому-то тоже нужны были шестиугольники в WPF. Итог генерации:
Без визуала все это навевает тоску. Настал момент откуда брать спрайты. Точно не помню, либо я их достал из самой игры, либо нашёл где-то на форумах, посвящённых игре. На руках у меня лежали гифки дефолтного персонажа, спрайты интерфейса, фоны локаций и пропсов, в общем все что есть в оригинале.
Теперь, имея карту, алгоритм поиска пути и кое-какое меню, можно было переходить к встраиванию спрайтов. Свой фолыч за пять минут так близок, только руку протянуть!
Встраивая графику, я столкнулся с проблемой анимации и перемещения персонажа. Возможно, WPF не умел или плохо работал с gif. В общем, первоначально передвижение выглядело как телепортация персонажа, и о плавном перемещении объекта между точками я, кажется, даже не думал.
Для решения проблемы с анимацией подключил либу WpfAnimatedGif. Результат стал лучше: персонаж стал анимироваться, и его телепортация уже была не так заметна, как раньше.
После персонажа я переключился на локацию. Нужно было сделать так, чтобы передний план перекрывал задний. Для этого использовался местный аналог sortingOrder, как в Unity. Позиция Z у компонента Image изменялась для корректного отображения слоёв. Выставив спрайты для локаций, получаем вылитый фолыч. Но только на посмотреть, играть нельзя.
После всей работы с окружением настал черёд UI. Стартовое меню я сделал сам — получилось аутентично, не хватает только фона с горой черепов.
В конце концов я был горд собой! Сделал то, что очень хорошо мимикрирует под тот самый фолыч. Далее захотелось уже привязать онлайн. Пост начинался с воспоминаний о Fallout Online не просто так.
Архитектурой сети был выбран клиент-сервер, так как мне виделось это проще, а протоколом соединения TCP. Почему именно этот протокол, не вспомню, вроде потому что недавно делал лабораторные работы по нему и мне было проще работать.
Обработчик команд от клиента на стороне сервера был switch-case на 600 строк, который парсил строку. Если в начале была циферка 1 — это регистрация, если циферка 2 — аутентификация, и так далее.
Из-за технических сложностей, таких как разворачивание базы данных, полностью войти в онлайн-режим не получилось. Сейчас настраивать базу данных было лень, но удалось попасть на экран с комнатами, удалив часть сетевого кода.
А так как подразумевалось взаимодействие между игроками, была перенесена механика рукопашного боя, вместе с анимацией смерти. Прикреплю просто gif, так как в онлайн мне не зайти. Плюс-минус было то же самое, только странных дерганий и лагов было больше.
Рассказал в той мере, в которой смог. Реализация проекта похожа на экспонат из кунсткамеры. Оставлю его здесь на всеобщее обозрение.
Оставлю ссылку на живые сервера по Fonline, попробуйте, если не были в курсе про такие проекты.
Дочитавших приглашаю в свой тг-канал, где я рассказываю о текущей разработке мини-стратегии.