К одной из моей прошлых статей, про генерацию ландшафта с видом сверху, оставили комментарий про то, что уровень, составленный там, был непроходимым.
Я согласилась с этим комментарием, потому что это действительно так - показанная там механика выполняет скорее декоративную роль.
Тогда я задумалась, как сделать так, чтобы уровень был проходимым, на основе того, что уже было использовано для урока.
и начинать больше думать, как программист, а не художник.
Поэтому сейчас расскажу, что такого нужно сделать с механикой, чтобы получилось вот это:
Суть в том, чтобы уровень генерировал графику самостоятельно каждые несколько секунд. Красные места - это препятствия, на которые нельзя наступать. Если игрок наступает на них, то у него отнимается hp (в данном случае, квадрат игрока меняет цвет).
Передо мною встала задача сделать какую-то логику для прохождения уровня, и я решила что-то сделать с анимацией.
Я сделала первую попытку - когда игрок ходил по уровню и знал, где опасные места, все было в порядке, но когда из-за анимации все резко менялось, игрок мог сразу же проиграть. И это было проблемой.
Само собой, нужен был какой-то тормозящий фактор, чтобы игрок был предупрежден заранее, что туда-то вставать нельзя. Поэтому мною был добавлен таймер. И он же повлек за собой полупрозрачность плиток.
Я не буду останавливаться на том, как создать само поле - об этом написано в статье про генерацию ландшафта.
Помимо самого поля, я еще добавила небольшой черный квадратик, который может перемещаться по экрану - его создание я тоже опишу ниже.
Игрок
За игрока у меня отвечает квадрат размером 16х16 (меньше генерируемого квадрата для пола, который составляет 32х32).
У меня на холсте уже расставлены квадраты, в окошке "Animation frames" создано 9 цветных кадров и 1 красный, а так же скорость анимации поставлена на 0. Это тот минимум, который нужен для этого урока. Как все это подготовить, написано в статье о генерации ландшафта, ссылка на которую была указана выше.
Сейчас я добавлю игрока и поставлю ему поведение 8 direction. Это поведение позволяет игроку перемещаться в любую сторону при игре.
Добавление игрока: нажимаю правой клавишей мыши и выбираю Insert new object --> Insert --> нажимаю на холст, чтобы проявить объект --> в открывшемся редакторе нажимаю Resize в верхней панели --> в открывшемся окошке ставлю значения 16, 16 --> OK --> с помощью Fill из боковой панели редактора заливаю квадрат черным цветом и закрываю редактор без сохранения
Также добавлю второй кадр для игрока, чтобы при попадании на опасный квадрат он подавал знак.
Добавление нового кадра: открываю редактор двойным нажатием на квадрат или через правую кнопку мыши (Edit animations) --> в окошке Animation frames нажимаю правой клавишей мыши на нулевой кадр и выбираю Duplicate --> перекрашиваю кадр 1 под другой цвет с помощью Fill --> в отдельном окошке Animation нажимаю на Default --> в левой основной панели проекта проверяю, чтобы напротив Speed стояло значение 0 --> закрываю редактор без сохранения
Добавление поведения: нажимаю на объект игрока (черный квадрат) --> в левой основной панели проекта ищу Behaviors, выделенный синим цветом, и нажимаю на него --> в появившемся окошке нажимаю на иконку плюса --> 8 direction --> Add --> закрываю окошко
Теперь при запуске игры можно свободно перемещаться по экрану. После этого я перехожу к механике.
Механика
Если в уроке про генерацию ландшафта поле рассчитывалось один раз при начале уровня, а обновлялось только при ручном перезапуске, то здесь оно должно изменяться каждые десять секунд самостоятельно (можно чаще или реже, в зависимости от игрового процесса).
Я перехожу в Event sheet и начинаю настраивать сам пол.
(событие) Генерация пола каждые 10 секунд: перехожу в Event sheet в верхних вкладках --> нажимаю правой клавишей мыши по пространству и выбираю Add event --> System --> Next --> Every X seconds --> Next --> в появившемся окошке напротив Interval (seconds) выставляю значение 10.0 --> Done
(действие 1) Генерация пола каждые 10 секунд: напротив события нажимаю Add action --> нажимаю на спрайт пола --> Next --> Set opacity --> Next --> напротив Opacity выставляю значение 50 --> Done
(действие 2) Генерация пола каждые 10 секунд: напротив события нажимаю Add action --> нажимаю на спрайт пола --> Next --> Set frame --> Next --> напротив Frame number пишу random(12) --> Done
(действие 3) Генерация пола каждые 10 секунд: напротив события нажимаю Add action --> System --> Next --> Wait --> Next --> напротив Seconds выставляю 2.0 --> Done
(действие 4) Генерация пола каждые 10 секунд: напротив события нажимаю Add action --> нажимаю на спрайт пола --> Next --> Set opacity --> Next --> напротив Opacity выставляю значение 100 --> Done
Механика первого события должна выглядеть так:
Второе событие отвечает за то, что случится с игроком, если он наступит на особую плитку.
(событие 1) Ограничение для игрока: нажимаю правой клавишей мыши по пространству и выбираю Add event --> выбираю спрайт игрока --> Next --> On collision with another object --> Next --> напротив Object выбираю спрайт пола --> Done
(событие 2) Ограничение для игрока: нажимаю правой клавишей мыши по пространству и выбираю Add event --> выбираю спрайт пола --> Next --> Compare frame --> Next --> напротив Comparison должно стоять = Equal to, а напротив Number значение 10 --> Done
(событие 3) Ограничение для игрока: нажимаю правой клавишей мыши по пространству и выбираю Add event --> выбираю спрайт пола --> Next --> Compare opacity --> Next --> напротив Comparison должно стоять = Equal to, а напротив Opacity значение 100 --> Done --> перетаскиваю оба событие к первому, чтобы они состыковались, а опустевшие ячейки удаляю с помощью delete
(действие 1) Ограничение для игрока: напротив созданного события выбираю Add action --> нажимаю на спрайт игрока --> Next --> Set frame --> Next --> Напротив Frame number ставлю 1 --> Done
(действие 2) Ограничение для игрока: напротив события выбираю Add action --> System --> Next --> Wait --> Next --> напротив Seconds должно стоять 1 --> Done
(действие 3) Ограничение для игрока: напротив созданного события выбираю Add action --> нажимаю на спрайт игрока --> Next --> Set frame --> Next --> Напротив Frame number ставлю 0 --> Done
Механика должна выглядеть так:
Запуск проекта
Когда механика готова, я запускаю проект. Сейчас я специально изменила генерацию пола на каждые 3 секунды, чтобы не ждать много времени.
Заранее скажу, что данная статья показывает простую логику. Ее можно развивать еще и еще, создавать для генерации особые зоны, которые не будут задевать весь холст. Но это уже другая тема.
Помимо данной статьи на моем канале есть такие уроки, как создание гибкой системы жизней для босса или как сделать сумку с картой.