Платформер на Construct 2. Список уровней

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

 

Чтобы лишний раз не повторяться и уменьшить размер статьи, я не буду подробно расписывать элементарные действия, пройденные в прошлых уроках. Если что-то забыли, вы всегда можете вернуться назад.

 

Для более быстрого изучения Construct 2, рекомендую полностью проделать этот урок на своем компьютере. Для этого загрузите небольшой набор графики (21 Кб), который я использовал в уроке.

 

Приступим. Запускаем программу и открываем проект (FileOpen…) из прошлого урока.

Напоминаю, что макет под список уровней мы уже создавали. Открываем его и в параметрах указываем такой же размер, как у видимой части игры.

Платформер на Construct 2. Создание списка уровней (скриншот 1)

Затем открываем список слоев (вкладка Layers) этого макета.

Выбираем стандартный нулевой слой и называем его background (фон).

В параметре Parallax вводим значения 0 по X и 0 по Y, чтобы зафиксировать слой по центру экрана.

Платформер на Construct 2. Создание списка уровней (скриншот 2)

Для чего фиксировать слой, если макет не больше видимой части игры? На всякий случай. Существуют разные варианты масштабирования игры. При некоторых слой может смещаться. Поэтому лучше зафиксировать.

 

С фоном предлагаю не мудрить, давайте используем такой же, как на первом уровне. Из дерева проекта перетаскиваем спрайт background_1 на макет. И устанавливаем фоновое изображение по центру.

Платформер на Construct 2. Создание списка уровней (скриншот 3)

Чтобы фоновое изображение не мешало, заблокируйте соответствующий слой, нажав на кнопку с замком.

 

Теперь создаем новый слой и называем его objects (объекты). Здесь также установите нулевое значение параметра Parallax.

Платформер на Construct 2. Создание списка уровней (скриншот 4)

На слое objects создаем новый Sprite, называем его level (кнопка выбора уровня).

Платформер на Construct 2. Создание списка уровней (скриншот 5)

В редакторе спрайта импортируем все три кнопки из нашего набора графики. Не забываем удалять пустой нулевой кадр и устанавливать нулевую скорость проигрывания стандартной анимации.

Платформер на Construct 2. Создание списка уровней (скриншот 6)

Для чего нужны три кадра? Первый кадр с замком — это закрытый (недоступный) уровень. Второй кадр — это открытый уровень, но не пройденный. Третий кадр — это успешно пройденный уровень.

 

Закрываем редактор. Затем добавляем к этому спрайту переменную. Называем ее number, выбираем числовой тип и вводим 1 в начальное значение.

Платформер на Construct 2. Создание списка уровней (скриншот 7)

Создаем копии объекта и расставляем кнопки по макету.

Платформер на Construct 2. Создание списка уровней (скриншот 8)

Каждую кнопку (подряд) необходимо пронумеровать.

Платформер на Construct 2. Создание списка уровней (скриншот 9)

Пока мы пронумеровали уровни только для себя (под события). А давайте еще пронумеруем уровни для пользователя. Создаем новый текстовый объект, называем его level_number.

Платформер на Construct 2. Создание списка уровней (скриншот 10)

В параметрах выбираем более крупный размер шрифта, меняем цвет и устанавливаем центральное выравнивание текста.

Платформер на Construct 2. Создание списка уровней (скриншот 11)

Затем, создавая копии текстового объекта, подписываем каждую кнопку.

Платформер на Construct 2. Создание списка уровней (скриншот 12)

Также можно создать дополнительный текстовый объект (называем header) для заголовка.

Платформер на Construct 2. Создание списка уровней (скриншот 13)

В более поздних уроках мы изучим текстовый объект Sprite Font и сможем создавать более красивые заголовки. А пока так.

 

Продолжаем. Переходим на список событий, который называется list of levels.

Добавляем новую глобальную переменную, которая будет хранить прогресс прохождения игры. Называем переменную progress, выбираем числовой тип, вводим 1 в начальное значение.

Платформер на Construct 2. Создание списка уровней (скриншот 14)

Теперь сделаем так, чтобы при успешном прохождении уровня переменная прогресса увеличивалась на единицу.

 

Переходим в список событий levels.

Находим событие, связанное с победой на уровне. И добавляем второе под-событие (Add sub-event).

Под-условие: объект System → Compare variable → в Variable выбираем переменную progress, в Comparison выбираем Less or equal (меньше или равно), в Value вводим int(LayoutName) без кавычек → Done

В условии проверяется, переменная прогресса меньше или равна номеру уровня.

 

Для чего такая проверка? Чтобы за прохождение одного уровня, переменная увеличивалась только один раз. Если не использовать такую проверку, получится следующее. Вот прошли мы первый уровень, в прогресс добавилась единица, стало 2. Затем мы еще раз прошли первый уровень, стало 3. То есть уже открылся третий уровень, хотя второй мы даже не начинали. А с этой проверкой такого не будет.

 

Теперь по записи int(LayoutName) подробнее. LayoutName — это имя макета. Хоть макет и называется у нас 1, но мы не можем сравнивать число и название макета. Поэтому мы преобразуем название в числовой тип командой int().

 

Добавляем действие (ссылка Add action).

Действие: объект System → Set value → в Variable выбираем переменную progress, в Value вводим int(LayoutName)+1 без кавычек → Done

В этом действии в переменную прогресса записывается номер уровня (также с преобразованием в числовой тип) плюс единица.

Платформер на Construct 2. Создание списка уровней (скриншот 15)

Полностью под-событие звучит так: если переменная прогресса меньше или равна номеру уровня, то в эту переменную добавляется единица.

 

Возвращаемся в список событий list of levels. Создадим механизм открытия уровней.

Добавляем новое событие (Add event).

Условие 1: объект level → Compare instance variable → в Instance variable выбираем переменную number, в Comparison выбираем Greater than (больше), в Value вводим progress (без кавычек) → Done

Условие 2: объект System → Trigger once while true

В первом условии проверяется, номер уровня больше ли значения переменной прогресса. Во втором условии говориться, выполнить действие один раз.

 

Второе условие крайне важно для оптимизации игры. Без него действие будет выполняться постоянно, а соответственно будут тратится ресурсы системы впустую.

 

Добавляем действие (Add action).

Действие: объект level → Set frame → в Frame number вводим 0 → Done

В этом действии у кнопки устанавливается нулевой кадр.

Платформер на Construct 2. Создание списка уровней (скриншот 16)

Полностью событие звучит так: если номер уровня больше переменной прогресса, то у кнопки устанавливается нулевой кадр (закрытый уровень с замком).

 

Добавляем следующее событие (Add event).

Условие 1: объект level → Compare instance variable → в Instance variable выбираем переменную number, в Comparison выбираем Equal to (равно), в Value вводим progress (без кавычек) → Done

Условие 2: объект System → Trigger once while true

В первом условии проверяется равенство номера уровня и переменной прогресса. Во втором действии также задается однократное выполнение действия.

 

Добавляем действие (Add action).

Действие: объект level → Set frame → в Frame number вводим 1 → Done

В этом действии у кнопки устанавливается кадр с номером 1.

Платформер на Construct 2. Создание списка уровней (скриншот 17)

Полностью событие звучит так: если номер уровня равен переменной прогресса, то кнопка получает кадр с номером 1 (открытый, но не пройденный уровень).

 

Добавляем еще одно событие (Add event).

Условие 1: объект level → Compare instance variable → в Instance variable выбираем переменную number, в Comparison выбираем Less than (меньше), в Value вводим progress (без кавычек) → Done

Условие 2: объект System → Trigger once while true

В первом условии проверяется, номер уровня меньше ли переменной прогресса. Во втором условии задаем однократное выполнение действия.

 

Добавляем действие (Add action).

Действие: объект level → Set frame → в Frame number вводим 2 → Done

В этом действии у кнопки устанавливается кадр с номером 2.

 

Оставляем комментарий к трем последним событиям: Закрытые и открытые уровни.

Платформер на Construct 2. Создание списка уровней (скриншот 18)

Полностью событие звучит так: если номер уровня меньше переменной прогресса, то кнопка получает кадр с номером 2 (успешно пройденный уровень).

 

Теперь добавим переходы на открытый уровень. Добавляем новое событие (Add event).

Условие 1: объект Touch → On touched object → в Object выбираем объект level → Done

Условие 2: объект level → Compare frame → в Comparison выбираем Not equal to (не равно), в Number вводим 0 → Done

В первом условии отслеживается нажатие на кнопку. Во втором условии проверяется, не равен ли номер кадра кнопки нулю.

 

Добавляем действие (Add action).

Действие: объект System → Go to layout (by name) → в Layout вводим str(level.number) → Done

В этом действии выполняется переход на выбранный макет.

 

Рассмотрим предпоследнюю часть действия. Строчка level.number получает номер кнопки (значение переменной). А команда str() преобразует числовой тип в текстовый (в название). И уже по названию выполняется переход.

 

Оставляем комментарий: Переход к открытому уровню.

Платформер на Construct 2. Создание списка уровней (скриншот 19)

Полностью событие звучит так: если мы нажимаем на кнопку уровня и эта кнопка не с нулевым кадром (не с замком), то выполняется переход на определенный макет (по номеру).

 

Отлично! Мы реализовали основные задачи списка уровней всего за четыре события. Многие начинающие разработчики делают здесь ошибку, создавая отдельные события под каждую кнопку и каждый макет. А в итоге получается двадцать, тридцать, а то и сотни событий.

 

Что еще можно добавить? Например, на макете списка уровней выводить общее количество собранных бонусов. Под эту задачу не будем создавать отдельный текстовый объект.

Перетаскиваем на макет текстовый объект score. Устанавливаем его в левом верхнем углу.

Платформер на Construct 2. Создание списка уровней (скриншот 20)

Переходим в список событий list of levels и добавляем новую глобальную переменную.

Называем ее score (общее количество), выбираем числовой тип и вводим 0 в начальное значение.

Платформер на Construct 2. Создание списка уровней (скриншот 21)

Добавляем новое событие для отображения счета (Add event).

Условие: объект System → On start of layout

В условии говорится, выполнить действие при старте уровня.

 

Добавляем действие (Add action).

Действие: объект score → Set text → в Text вводим score (без кавычек) → Done

В этом действии в текстовый объект помешается значение глобальной переменной общего счета.

 

Оставляем комментарий: Отображение общего счета.

Платформер на Construct 2. Создание списка уровней (скриншот 22)

Полностью событие звучит так: при запуске макета в текстовое окно помешается общее количество собранных бонусов.

 

Снова идем в список событий levels.

И в основное событие, связанное с победой на уровне, добавляем седьмое действие (Add action).

Действие: объект System → Add to → в Variable выбираем переменную score, в Value вводим player_animation.bonus (без кавычек) → Done

В этом действии в глобальную переменную счета добавляется количество собранных бонусов на уровне (из переменной спрайта).

Платформер на Construct 2. Создание списка уровней (скриншот 23)

Давайте проверять, что у нас получилось.

Платформер на Construct 2. Создание списка уровней (скриншот 24)

Замечательно. Уровень засчитывается, новый открывается, а также выводится общий счет игры.

 

Но это далеко не все! Глобальные переменные необходимо сохранять. Иначе они будут сбрасываться до стандартных значений при перезапусках игры. И вот этим мы будем заниматься в следующем уроке.

 

А пока сохраняем проект (меню File Save). Вопросы по этому уроку оставляйте в комментариях.