В начале этого урока, я бы хотел исправить несколько моментов. Сперва, давайте сделаем звук, когда объект выходит за дорогу, короче. Дело в том, что мне не нравится, что звук резко обрывается, когда объект снова попадает на дорогу. И мы это исправим. Итак, сокращаем звук по длине.
Затем удаляем это действие.
И теперь заменим Trigger Once на A Sound is being played (т.е. делать что-то если звук на канале 1 играет).
Но инвертируем это условие, т.е. делать что-то если звук на канале 1 не играет.
Получилось так: если, когда объект находится вне дороги, звук Ground Alarm не звучит, то надо его включить. Благодаря этому, когда объект попадет на дорогу, звук резко не оборвется.
Теперь исправим такой момент, когда объект Player выходит за границы экрана.
Создаем новую группу событий. Кликаем правой кнопкой мыши по Add a new event и выбираем Event group.
Называем ее “Не выпускать объект Player за пределы экрана”.
Теперь определим позицию X, когда объект Player находится на левом краю экрана.
Т.е. если объект выходит за границу экрана, то позиция по X становится меньше нуля. Давайте найдем условие, что делать, если позиция X для Player меньше нуля.
В действии мы запишем, что если позиция X будет меньше 0, то, позиция X объекта снова станет 0.
Проверяем. Должно все получится.
Теперь определяем позицию X когда объект находится на правом краю экрана.
Копируем наше условие и действие и чуть изменяем.
Если вы увидите, что ваш объект не достигает правого края, то значит у вас в настройках экрана стоит “Подогнать ширину под размер ширины экрана”, надо поставить “No changes to the game size”.
Теперь расставляем объекты. Для начала давайте изменим размер препятствий по умолчанию в редакторе Piskel. Они должны быть в два раза длиннее.
Теперь в ручную расставляем объекты. Чтобы во время расставления объектов вы случайно не выбирали дорогу, можно ее заблокировать.
Вот так вручную я расположил объекты.
Размещение вручную дает вам больше контроля для создания уровня. Но есть также процедурная генерация – когда программа сама создает и размещает объекты. Давайте ее изучим!) В начале удалим все препятствия, которые мы создали.
Теперь заходим в расширения и ищем Create multiple copies of a object.
Теперь создадим объекты в инициализации сцены.
Выбираем наше расширение и вводим такие данные.
Давайте по порядку теперь разберем каждый пункт.
Object – Здесь выбираем объект, который мы хотим копировать;
Number of rows – здесь как в таблице, один объект – это одна ячейка, и в этом пункте мы настраиваем количество строк, где будут генерироваться наши объекты. Т.е. по сути мы выбираем высоту площади для генерации объектов;
Number of colunms – на дороге по ширине помещается 6 объектов Obstacle, так что пишем 6;
Top-left starting position (X) и Top-left starting position (Y) – здесь мы указываем начальную точку для генерации объектов. В нашем примере мы указали верхний левый угол гороги;
Amount space bettwen rows и columns – расстояние между строками и столбцами;
(Optional) Identifier assigned to all objects created in this batch – здесь мы можем задать ID нашим объектам;
Layer – на каком слое будут создаваться объекты;
Z-order – расположение объектов по оси Z.
После того как вы все набрали, проверяем игру.
Мы видим строки, которые идут одна за другой, все как мы указали в расширении, но нам нужны пустоты в строках, чтобы проходить сквозь строки. Существует очень много способов как это сделать, но мы начнем с самого простого – рандомно удалим некоторое количество объектов.
Выбираем новое событие Repeat.
Это условие очень простое – оно повторяет действие то количество раз, которое мы укажем. Мы укажем 100.
В условии мы будем выбирать случайный объект Obstacle.
Конечно “Выбрать случайный объект” больше похоже на действие, но оно есть в условии в GDevelop.
В действии выбираем этот объект и удаляем его.
Проверяем. Как видим, теперь в строках появились пустоты. Но есть у этого способа один минус – если мы увеличим уровень, то также мы должны удалить большее количество случайных объектов. Но как удалить например только 50% от количества объектов?
На самом деле все просто, вместо 100 раз пишем следующее.
Count(Obstacle) возвращает количество объектов. Затем мы умножаем количество объектов на 0.5 – т.е. мы удалим половину этих объектов.