Генерация рандомной бесшовной текстуры

Favourite 70 favourites
Tutorial written by UnrealMediaOriginally published on 9th, August 2012 - 3 revisions

Translation Team:

2 total revisions

Я собираюсь продемонстрировать метод, которым я пользуюсь, что бы генерировать рандомные карты основанные на бесшовных текстурах. Это очень удобно, когда вы хотите создать уровни для своей игры, но не хотите/у вас нет времени сидеть создавать каждый уровень собственноручно.

Я привязал обычный .capx файл для процесса изучения: Download .capx

Настраиваем окружение

Из-за того, что я очень педантичен в вопросе чистоты окружения, первое, что необходимо сделать, это создать новый слой с названием 'Tiles'. В нем и будут храниться наши tiles(бесшовные текстуры) и переименовать 'Layer 0' в 'Background'. Так же я изменю разрешение слоя и окна на 800, 640.


Матрицы в Construct2 (Arrays)

Матрицы в Construct2 требуют немного практики для того, чтобы с ними разобраться. Лучший способ, который я обнаружил - это просто кинуться в бой и попробовать несколько вещей с ними. В данном случае неплохая идея, сначала разобраться с ними, по этому если вы все еще этого не сделали, то пожалуйста начните с изучения матриц (Array).

http://www.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

Вот и все! Теперь запустите свою игру и полюбуйтесь кртинкой сгенерированной для вас случайным образом. Перезапустите игру и она изменится.


Как вы видете текстурки, которые я использовал не идеально подходят для генерируемой карты, но для объяснении сути метода они вполне годятся. Поэкспериментируйте с другими текстурками и условиями.

После "небольших преобразований" у вас может получиться настоящий генератор уровней, как тот, что я использую в своей игре :)

Удачи со всеми вашими разработками!!!

Unlock your full gamedev potential

Upgrade to the Personal Edition of Construct 2, it has way more features and won't holding back from making money and using your full creativity like the free edition does. It's a one off payment and all Construct 2 editor updates are free for life!

View deals

Plus, it's got a lot of additional features that will help you save time and make more impressive games!

Congratulations on finishing this tutorial!

Did you learn a lot from it? Share it now with your friends!

Comments

1
lolish 2,438 rep

СПАСИБО ЗА УРОК ПРО РАНДОМНУЮ ГЕНЕРАЦИЮ УРОВНЯ!

Friday, December 27, 2013 at 6:20:23 PM

Leave a comment

Everyone is welcome to leave their thoughts! Register a new account or login.