Когда мы решили переносить героев на 1С, план был только ориентировочный:
1. В «Героях III» есть общая карта, она 2D, состоит из клеток. Поэтому берем поле табличного документа, красим фон в зеленый, желтый, синий и другие цвета — это ландшафт: трава, песок, вода и все остальное. В ячейки выводим картинки с помощью свойства «Картинка» — это объекты на карте: замки, герои, сундуки, монстры. Потом при возникновении каких-либо событий убираем или добавляем картинки в нужные ячейки.
2. В «Героях III» есть поле боя, оно 2D, cостоит из клеток. Поэтому берем поле табличного документа и далее по тексту из пункта 1.
3. В «Героях III» есть интерфейс замков, он 2D… Короче, вы поняли :).
Вот с этими вводными мы приступили к созданию нашего проекта.
Содержание
- Справочники-шаблоны.
- Справочник «Игры».
- Расчет маршрутов.
- Анимация передвижения.
- Форма города.
- Обмен существами.
- Поле боя.
Справочники-шаблоны
Первое, что мы добавили в нашу базу — это справочники для хранения информации. Например, количество ХП у скелета, сколько стоят бараки, сколько в день приносит капитолий. Поэтому у нас появились справочники-шаблоны:
- шаблоны существ;
- здания в городе;
- здания на карте;
- города;
- герои.
В них содержится постоянная информация, которая не меняется от игры к игре, и подразумевается, что она не будет изменяться пользователями. Также хранится шаблон картинки, который будет отображаться в самой игре. Вот примеры того, как выглядят эти справочники:
Примеры справочников
Справочник «Игры»
Вся информация, которая относится к конкретному сеансу игры, хранится в справочнике «Игры». Он содержит информацию о том, какой день и какая неделя в конкретном сеансе игры, ход какого игрока сейчас, на какой карте играем. В табличных частях хранится информация о городах, героях, зданиях, существах на карте и многом другом, подробнее можете посмотреть на скриншоте, там все понятно по названиям.
Справочник «Игры»
Во всех табличных частях присутствует служебный реквизит «КлючСвязи» (тип: уникальный идентификатор) для того чтобы связывать информацию из различных таблиц.
Для примера, в данном сеансе игры по ключу 7b74e203-d17f-40c7-8683-e71646c6b13b мы понимаем из таблицы «Координаты объектов на карте», что этот объект — замок, и вход в него находится по координатам R9C7.
Координаты объекта «Город»
Из таблицы «Города» мы можем понять, что этот город называется «Гоствинд», фракция Некрополис и принадлежит красному игроку
Таблица «Город»
Из таблицы «Гарнизоны городов» мы узнаем, что в городе 23 скелета и 10 мертвецов.
Таблица «Гарнизоны городов»
А из таблицы «Здания в городах» узнаем, что построена пока только «Сельская управа».
Таблица «Здания в городах»
Хранение всей информации организовано, теперь нужно ее визуализировать. Для отображения у нас используется форма элемента справочника «Игры».
Форма элемента справочника «Игры»
Вот так оно выглядит в финальном варианте. Но в процессе разработки мы наткнулись на первый подводный камень: изначально планировали использовать реквизит «Картинка» у ячеек табличного документа, чтобы не связываться с расчетом абсолютных координат, а работать только с именами ячеек. Но при таком подходе у нас получались сундуки размером с героя, герои размером с замок,
корова размером с цех. Выглядело нелепо:
Изначальный вариант
Поэтому у нас было два варианта: разрезать картинку на несколько частей и выводить в ячейку только часть картинки или все-таки использовать картинки табличного документа. Мы выбрали второй вариант. Для связи с данными в название каждой картинки поместили «ключ связи» этого объекта. Стало выглядеть гораздо лучше.
Поле после изменений
Расчет маршрутов
Теперь у нас есть карта, на которой расположены картинки, изображающие замки, здания, существ, ресурсы. Дальше мы добавили возможность героям перемещаться по этой карте. И тут мы столкнулись со вторым подводным камнем: нужно каким-то образом прокладывать маршруты в обход препятствий.
Изобретать велосипед не стали, использовали общепринятый метод «Поиск в ширину с ранним выходом». Подробно этот метод расписывать не буду, т.к. это тема для отдельной статьи. Кому интересно, можете почитать тут. Эту статью я использовал как источник информации.
Анимация передвижения
После того как мы научились строить маршруты, мы должны были научить героев ходить по ним. Не хотелось, чтобы герой сразу «телепортировался» в конец маршрута, хотелось чтобы он действительно шагал по маршруту. Для анимации мы использовали процедуру обработки передвижения на один шаг с обработчиком ожидания в конце, который через 0.1 секунду вызывал эту же процедуру только для следующего шага.
ПодключитьОбработчикОжидания("ШагПоМаршруту", 0.1, Истина) ;
Вот так это выглядит в самой игре.
Анимация передвижения
Форма города
После того как общая карта была готова, мы стали реализовывать строительство зданий в городах.
Вот так выглядит город в оригинальных «Героях».
Верхнюю половину экрана занимает интерактивное изображение города. Нам хотелось максимально соответствовать оригиналу, поэтому было решено перенести эту особенность в нашу версию на 1С.
Изначально был вариант пойти по проверенному пути — использовать поле табличного документа, так мы и сделали. Вывели в фон табличного документа фон города, в картинки ячеек табличного документа выводили здания, выглядело это приемлемо, но появился неприятный баг. При прокрутке колесиком мыши, фон оставался на месте, а все здания за счет прокрутки табличного документа улетали в небеса. :) Вот так это выглядело:
Баг
После тщательного изучения этого вопроса нашли два варианта: использовать поле html-документа или вывести на форму декорации-картинки, порезать фон на несколько частей и выводить каждую часть в свою декорацию. Нам хотелось максимально использовать функционал 1С и не хотелось разбираться с html. Поэтому мы пошли по второму пути.
Форма
На форму выведены 42 декорации, 6 рядов по 7 декораций, в каждую выводится соответствующий кусок фона или кусок с прифотошопленным зданием, если таковое построено в городе.
В итоговом варианте выглядит так.
Финальный вид после изменений
У декораций обрабатываются события нажатия и, в зависимости от того, на какое здание нажали, открывается либо форма строительства, либо форма найма существ, либо форма найма героев.
Форма строительства
Форма найма героев
Форма найма существ
Метод с 42 декорацией сработал, но у него была своя цена. Программно в декорацию-картинку можно выводить только картинки из библиотеки картинок. Поэтому пришлось все 42 картинки фона + картинку фона с каждым прифотошопленнным зданием добавлять в библиотеку, а таких комплектов нужно 8 для каждой фракции. В итоге библиотека картинок выглядит подобным образом.
Библиотека картинок
Обмен существами
Как вы знаете, в «Героях» можно нанять существ в замке и закинуть их в армию героя или обменяться существами с другим героем. В нашей игре такой обмен тоже есть.
Обмен в игре
Работает через 1С-ный механизм «перетаскивания» картинок. На форме расположены 7 картинок-слотов для города и 7 для героя. В начале события перетаскивания вызывается процедура, которая запоминает откуда мы взяли существ. При окончании перетаскивания вызывается процедура, которая в зависимости от содержания ячейки, либо перемещает туда существ с объединением, либо меняет существ местами.
Процедура
Тут используется еще и проверка перетаскивания, но там:
&НаКлиенте
Процедура СуществоПроверкаПеретаскивания (Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Без этого работать не будет.
Поле боя
Ну и последнее, что было сделано, сами битвы.
Поле боя
Поля боя — это общая форма, которая открывается, когда на общей карте герой нападает на существ или другого героя. На общей форме расположено поле табличного документа, по которому перемещаются картинки, маршруты и анимация. Рассчитываются, как и на общей карте.
При битве с существами на карте используется некоторое подобие искусственного интеллекта. На самом деле это система условий, по которой компьютер выбирает жертву своей атаки с учетом некоторых параметров и потом наносит удар.
Вот такие вот «Герои III» на 1C!