Приветствую всех.
Итак, минутка бесполезной (или не очень) информации...
В общем, как мы знаем, 1С - это великий язык программирования, который регулярно одаряет нас прекрасными фичами, возможностями и... и да! Естественно, любители творить безумие не прошли мимо и не раз пробовали написать ту или иную игру на этом языке - Герои? Легко! Различные текстовые рпг? Да как нефиг делать!
Но лично я хотел опробовать реализовать именно 3Д (будь то реальное или псевдо 3Д). Множество попыток были опробованы мною (и изометрия, и иные подключения внешних инструментариев), чтобы получить идеальный итоговый результат и наконец-то оно удалось! Решением было использовать технологию древнего мира, забытую на годы, - Raycasting! Это "невероятная" технология, которая позволяет на основе 2D проекции получить полноценную (ну почти) 3D картинку используя принцип, связанный с пусканием лучей и получения расстояния (это прям если совсем кратко).

Собственно пример работы с Ray casting, взятая на просторах интернета
И как удачно, именно компания id software опробовали её в те самые бородатые годы и на свет появился великий и могучий Wolfenstein 3D. Именно он и стал моей музой.

Скриншот из оригинала игры
В общем, эту технологию и в целом проект от id software я и использовал как основу для своих коварных задумок.
По итогу, потратив некоторое время, мне удалось вывести на свет данное детище: Wolf 3D на 1С.
На текущий момент считаю этот проект завершенным в части поставленных целей - реализовать рабочий прототип (т.е. демо версию).
Если вернуться вообще к основам, зачем, какая цель? То все просто, мне хотелось продемонстрировать возможность сделать на 1С что-то от себя в 3D (или очень близкое к его истокам).


Что на текущий момент работает?
Для более удобного пользования я подготовил рабочий вариант обработки, которая позволяет визуально увидеть все стадии разработки, настроить (включить/отключить) различные "технические" фичи, которые позволили игре работать более-менее.

Каждая форма содержит в себе только код, который используется именно для этой стадии. Сделал так, чтобы проще было копаться во всем этом добре и понимать, зачем я сделал то или иное решение именно так. Плюсом ко всему, мне проще было так находить различные "дыры" в работе и моменты, которые сильно тормозили игру.
Если перечислять всё-таки, что сделано, то:
- Рабочий генератор уровней. Каждый уровень генерируется случайным образом размером 1024*1024 ячейки (ширина прохода персонажа 32 ячейки). Всего получается от 30 до 80 различных вариантов движения. В целом для теста вполне достаточно;
- Возможность "запекать" полученный результат для более быстрой работы. Проблема в том, что лучи и отрисовка картинки занимает очень много времени. Как итог я добавил болванчика, который пробегает по карте и сохраняет для вас весь результат;
- Анимации. Да, плавность движения есть (но не такая);
- Декорации и враги. Поведение постарался сделать близкое к реальному, но без построения кратчайших маршрутов. Это занимает слишком много времени. Построение маршрутов я сделал в иной игре (в следующий раз расскажу подробнее).
- Мультиплеер - Он рабочий, но требует небольшие доработки. В ближайшее время постараюсь обновить файл;
Что пока не сделано или в процессе:
- Текстуры карты - пока использую только один вариант. Заготовки есть и остальных, но для демо версии пока достаточно;
- Текстуры врагов/объектов - либо не соответствуют оригиналу, либо частично изменены для адаптации под 1С;
- Визуальные артефакты - неверное перекрытие текстур, видимость сквозь стены, некорректное соотношение размеров. Данные проблемы мне знакомы и я всячески стараюсь их поправить, но в рамках текущей реализации придется немного пострадать;
- Нет смены уровней и логичного завершения после победы над всеми ботами - опять же, так как это демо "движка" игры, некоторые моменты я не реализовывал;
- Неверное или частично неправильное наполнение интерфейса;
- Частый баг самой 1С - картинки не всегда перерисовываются. Видимо из-за перегрузки табличного документа рисунками они подвисают. Достаточно сделать шаг, чтобы вызвать перерисовку, и всё становится на свои места;
Если же рассказать о конкретно интересных моментах, то:
- Отрисовка всех текстур на экране выполняются с учетом глубины (т.е. перекрытия). Что значит? Противники/предметы не будут находиться перед стеной, хотя физически расположены за ней. В процессе отрисовки все рисунки сортируются с учетом расстояния и выводятся в нужном порядке (спасибо 1С, что хоть так можно)
- Вся игра работает исключительно на клиенте (лишь операция загрузки сохраненных файлов делается на сервере при старте). Я старался всячески исключать серверные вызовы (явные/не явные), чтобы избежать проседаний в работе.
- Самые тяжелые моменты были отрисовка картинок на экране и быстрая загрузка сохраненных кадров для отрисовки. В первом случае было нереально сложно и непонятно, как срастить ячейки (и отрисовка на них) и экранное пространство, чтоб картинка была правдоподобной и соответствовала реальности. Ведь на тех же c++ и т.д. в этом плане гораздо проще, а тут мы имеем разные сущности, и не все формулы легко накладывались. Во втором случае сложность заключалась в том, что некоторые методы поиска сохраненных данных выполняли неявные серверные вызовы или были слишком медленные. Приходилось придумывать своего рода псевдо аналог индекса и т.д., чтобы ускорить поиск и не вызывать серверные походы.
Если показать на примерах... То проще накинуть несколько gif анимаций:


Повторюсь еще раз, все сделано только с использованием 1С и её функционала.
- Управление:
Ходить W S A D, а также Q и E для того, чтобы шаг вбок сделать (стрейф), стрельба на F, смена оружия на 1 2 3 4.
(Иногда баг происходит и надо кликнуть мышкой на экран, чтобы рисунки обновились.)
Как работать с обработкой:
При открытии обработки необходимо указать путь до хранения временных файлов игры. Лучше выбирать сетевую папку или ту, к которой есть доступ у 1С (согласен, интересная реализация). Затем рядом с путем есть кнопка, куда вы по нажатию сохраните Демо вариант мира (он запихнут в двоичные данные внутри обработки, поэтому и вес такой большой).
После сохранения демо файлов у вас будет возможность воспользоваться сразу всеми "фичами". Если хотите генерировать свой мир, то просто нажимаете на Запустить генерацию мира, после чего в папке, которую вы указали выше, появятся файлы с именем вашего пользователя и будут запускаться уже они.
Желательно после этого перезапустить обработку, чтобы подгрузить новые файлы.
Вы также можете не сохранять демо файлы, но тогда у вас будут сильные просадки по скорости. Имейте в виду.
Работоспособность проверялась на версиях 8.3.23.1865 и 8.3.27.1786
Скачивайте, наслаждайтесь! Буду рад обратной связи и рекомендациям. Надеюсь, любителей творить дичь я также смог вдохновить)
Всем спасибо за внимание!
ЗЫ.
Отвечу сразу на самый частый вопрос - Зачем? Да собственно, потому, что могу и есть на это время))))
Вступайте в нашу телеграмм-группу Инфостарт