Я собираюсь продемонстрировать метод, которым я пользуюсь, что бы генерировать рандомные карты основанные на бесшовных текстурах. Это очень удобно, когда вы хотите создать уровни для своей игры, но не хотите/у вас нет времени сидеть создавать каждый уровень собственноручно.
Я привязал обычный .capx файл для процесса изучения: Download .capx
Настраиваем окружение
Из-за того, что я очень педантичен в вопросе чистоты окружения, первое, что необходимо сделать, это создать новый слой с названием 'Tiles'. В нем и будут храниться наши tiles(бесшовные текстуры) и переименовать 'Layer 0' в 'Background'. Так же я изменю разрешение слоя и окна на 800, 640.
Матрицы в Construct2 (Arrays)
Матрицы в Construct2 требуют немного практики для того, чтобы с ними разобраться. Лучший способ, который я обнаружил - это просто кинуться в бой и попробовать несколько вещей с ними. В данном случае неплохая идея, сначала разобраться с ними, по этому если вы все еще этого не сделали, то пожалуйста начните с изучения матриц (Array).
scirra.com/tutorials/307/arrays-for-beginners
Метод, который мы сейчас рассмотрим в этом уроке предполагает использование матрицы, которая содержит в себе анимационный ID для каждой бесшовной картинки.
1)Создайте новую матрицу с названием ‘Tile_Array’ в слое ‘Tiles’.
2)Откройте свой файл событий (events), что бы создать следующие события:
EVENT: System: On start of layout (Событие: При создании уровня)
ACTION: Tile_Array: Set size (25, 20, 1) (Действие:'Бесшовная матрица' задать размер (25,20,1))
Это задаст матрице 25 строк, 20 столбцов и один слой. Для того, чтобы представлять это визуально, пожалуйста обратитесь к ссылке, которую я прикрепил выше.
Раз матрица была создана, нам необходимо задать значение для каждой ячейки. Мы сделаем это через повторную запись рандомного номера для каждой Х и Y ячейки в матрице, задав тем самым кадр анимации для нашего бесшовного сета.
Добавьте следующее в ваш список действий как 'sub event' под ‘On start of layout’:
EVENT: For each element: XY
ACTION: Tile_Array: Set at XY (Tile_Array.CurX, Tile_Array.CurY, Floor(Random(0, 5)))
Программа пройдется по каждой строке и назначит случайное число между 0 и 5, округлив его в меньшую сторону. Округление не обязательно для достижения результата, но я рекомендую его вам для чистоты эксперимента.
Мы оставим эти события в таком виде и перейдем к созданию нашей бесшовной текстуры.
Создание бесшовной текстуры
Вернитесь к своему уровню и создайте новый спрайт ‘Map_Tiles’ на слое ‘Tiles’. Я собираюсь использовать бесшовные текстуры из пакета Jungle Sprite, который идет с платной версией Construct. Откроем окно с анимацией. Нажимаем правой кнопкой мыши на панели анимации и выбираем ‘Import Sprite Strip’ и выбираем спрайты, которые вы хотите использовать. В настройках для анимации ‘default’ задайте скорость 0 для того, чтобы наши кадры не переключались без надобности.
Я собираюсь изменить размер моего ‘Map_Tiles’ спрайта на 64 х 64, тем самым мы сможем создавать более детальную картину. Закройте окно анимации и переместите спрайт за пределы видимого слоя
Генератор
Теперь, когда наша матрица настроена, и наша текстура подготовлена, настало время генерировать бесшовную текстуру основанную на матрице. Перейдите назад к своему списку условий (events sheet) и создайте новое действие под 'For each XY element' :
ACTION: System: Create object (Map_Tiles, “Tiles”, 32 + (Tile_Array.CurX 64), 32 + (Tile_Array.CurY 64))
А теперь давайте я объясню, что тут происходит, так как формулу необходимо подкорректировать исходя из размеров вашей текстуры. Текстура, которую я использую 64 х 64. Точка ЦМ (центр массы) каждого спрайта находится по середине спрайта (32 пикселя от края). Это не проблема, но для того, чтобы выровнять текстуры по верхнему левому углу экрана, мы должны учесть эти 32 пикселя. Вот почему мы прибавляем по 32 пикселя для X и для Y координат. 'Tile_Array.CurX' и 'Tile_Array.CurY' используются для того, чтобы получить нужное место в матрице, тем самым мы можем брать текстуры в том порядке, в котором они находятся в матрице. И на конец умножение на 64 - это ширина текстуры и применяется для того, чтобы следующая текстура не налегал на предыдущую. Не бойтесь поменять значения в этом действии и посмотреть, что получится когда вы сгенерируете карту.
Наконец, нам надо настроить анимационный кадр для каждой текстурки в соответствии с рандомным числом, которое мы генерировали для матрицы. Для этого просто создайте действие описанное ниже.
ACTION: Map_Tiles: Set frame: Tile_Array.CurValue
Вот и все! Теперь запустите свою игру и полюбуйтесь кртинкой сгенерированной для вас случайным образом. Перезапустите игру и она изменится.
Как вы видете текстурки, которые я использовал не идеально подходят для генерируемой карты, но для объяснении сути метода они вполне годятся. Поэкспериментируйте с другими текстурками и условиями.
После "небольших преобразований" у вас может получиться настоящий генератор уровней, как тот, что я использую в своей игре :)
Удачи со всеми вашими разработками!!!