Advertisement
  1. Game Development
  2. From Scratch
Gamedevelopment

Сделайте игру Match-3 в Construct 2 Chaining и Game Overs

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Make a Match-3 Game in Construct 2.
Make a Match-3 Game in Construct 2: Eliminating Pre-Made Matches

Russian (Pусский) translation by Liliya (you can also view the original English article)

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

Кроме того, мы выполним сценарий потерь и добавим экран игры. Наконец, я расскажу о вещах, над которыми вы можете работать в свое время, чтобы улучшить и расширить игру за пределы того, что мы рассмотрели. Итак, без дальнейших церемоний, давайте начнем ...


Последняя игровая демонстрация

Вот демонстрация игры, над которой мы работали, и которая будет построена в конце этой части серии:




Поиск матчей

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

Во время работы над этой статьей я обнаружил проблему, которую вы можете увидеть в GIF ниже:

Match-3 Construct 2 tutorial

Как вы можете видеть в этом первом GIF, когда блок отбрасывается только на один блок, чтобы попытаться сформировать совпадение с группой блоков в нижней части падения, он отлично работает.

Match-3 Construct 2 tutorial

Однако в этом втором GIF становится ясно, что когда блок отбрасывается на большее расстояние в одном и том же сценарии, он не может определить совпадение, пока мы не выполним другой обмен. Причиной этого является то, что игра не часто ищет совпадений.

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

Чтобы исправить это, мы изменим, когда мы проверим FindMatches.

Сначала перейдите в функцию SwapBlocks и удалите финальное событие из функции, чтобы он вообще не вызывал FindMatches.

SwapBlocks должен выглядеть следующим образом:

Match-3 Construct 2 tutorial

На данный момент нет события, вызывающего FindMatches. Мы исправим это, добавив новое действие к событию, которое обнаруживает, когда возможны совпадения. Найдите это событие и добавьте это действие в конец события Else:

Теперь ваш результат должен выглядеть так:

Match-3 Construct 2 tutorial

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

Если вы сейчас запустите игру, вы сможете выполнить описанный выше сценарий без проблем.


Цепочка

Исправлена ​​эта проблема, мы собираемся внедрить систему цепочки, которая дает игроку дополнительные очки для матчей, вызванные уничтожением другого матча.

Вы можете увидеть пример типа ситуации, который я имею в виду ниже:

Match-3 Construct 2 tutorial

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

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

Создание работы

Чтобы эта система работала, мы собираемся создать новую переменную Chain, а затем внести несколько небольших изменений в существующие функции. Итак, сначала создайте новую глобальную переменную:

Ваша переменная должна выглядеть так:

Match-3 Construct 2 tutorial

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

Теперь перейдите к событию, которое заставляет блоки упасть, и удалите событие Else, которое вызывает функцию FindMatches.

Теперь перейдите в FindMatches и найдите места, где вы создаете объекты FloatingPointsText. Измените инструкции Set Text, чтобы они использовали новую формулу:

Это изменение изменяет плавающий текст так же, как и сами очки.

Затем перейдите в раздел FindMatches, где вы снова вызываете FindMatches в конце события, и удалите этот вызов функции и оператор Wait. Зачем? Потому что, если мы не удалим их, то FindMatches в конечном итоге получат вызов слишком много раз, и цепи никогда не будут инициированы правильно.

(Из-за изменений, которые мы сделали ранее в этой статье, FindMatches будут вызываться всякий раз, когда все блоки находятся в сетке, и ни одна из них не падает. Наличие нескольких областей, где мы вызываем FindMatches, просто приведет к одновременному запуску нескольких экземпляров функции, и может испортить систему баллов.)

Наконец, мы сделаем еще одно изменение этой функции. Перейдите в конец функции и добавьте это действие после того, как вы установили PointsGiven в 0:

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

Новая версия FindMatches должна выглядеть так:

Match-3 Construct 2 tutorial

Затем перейдите к функции GivePoints и измените оба действия, которые увеличивают значение показателя так, чтобы они учитывали значение «Цепочка»:

С этим изменением, GivePoints должны теперь выглядеть так:

Match-3 Construct 2 tutorial

Сброс цепочки

Мы реализовали переменную Chain как множитель для точек, которые игрок получает (и количество точек, отображаемых в плавающих текстовых объектах), но нам еще нужно сделать одно: добавить инструкцию которая сбрасывает значение Chain, чтобы он не просто увеличивался бесконечно.

Мы добавим этот оператор в результат On Start DragDrop, чтобы каждый раз, когда игрок начинает перетаскивать новый блок, он рассматривается как новая цепочка. Другая причина, по которой мы это делаем, заключается в том, что она предотвращает преждевременный сброс значения цепочки, тем самым делая все совпадения в последней части цепочки менее ценными.

Перейдите в событие On DragDrop Start и добавьте это действие в Actions список:

Теперь ваш результат должен выглядеть так:

Match-3 Construct 2 tutorial

Если вы проверите игру на этом этапе, вы увидите, что если вы создадите цепочку, подобную той, которую я продемонстрировал ранее в gif, вы получаете 90 очков вместо 60 очков.

С этой работой система цепочки завершена, и вы должны иметь возможность создавать такую цепочку, какую вы хотите без проблем.


Фиксация падения

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

Вы можете видеть, что я имею в виду на изображении ниже:

Match-3_Game_Construct-2_BrokenFalling

Несмотря на отсутствие блока ниже желтого блока, он все еще не попал в пустое пространство. Это редкая проблема, но если в ней не наводить порядок, она все равно может испортить чей-то счет и не дать им получить цепочку, которую они создали, или даже заставить их проиграть, когда мы добавим функцию Game Over.

Проблема исходит от переменной BlockBeingMoved, которая пользуется событием, которое определяет, когда Blocks должен упасть, чтобы гарантировать, что блоки не будут перемещены, когда он сообщает блоку заполнить пустое пространство. В некоторых сценариях, когда игрок перемещает блок, эта переменная никогда не сбрасывается, и блоки не падают, пока другой блок не будет перемещен, и он сбрасывается правильно. Чтобы исправить это, мы добавим пару событий, которые будут правильно устанавливать и перезагружать эту переменную, и мы удалим текущие действия, которые устанавливают переменную, так как они работают неправильно.

Сначала перейдите в OnDragDrop Start и On DragDrop Drop результат и удалите все действия, связанные с переменной BlockBeingMoved из этих событий. В каждом событии должно быть одно действие, которое необходимо удалить.

Затем перейдите к событию, которое обнаруживает, когда пустое место находится под блоком. Мы собираемся изменить Условия этого события. Сначала убедитесь, что Условие, которое проверяет, является ли BlockBeingMoved равным 0, находится в начале. Затем добавьте еще одно условие в конец события, которое проверяет, не перемещаются ли блоки.

Это условие, которое вы добавите:

Теперь ваш результат должен выглядеть так:

Match-3_Game_Construct-2_ModifiedBlockFalling

Наконец, мы собираемся добавить еще два события в конце листа событий, которые будут обрабатывать переменную BlockBeingMoved. Перейдите к концу своего списка событий и добавьте следующие события:

Ваши новые события должны выглядеть так:

Match-3_Game_Construct-2_BlockBeingMovedEvent

Эти события будут эффективно изменять BlockBeingMoved от 0 до 1 и от 1 до 0 всякий раз, когда блок перемещается или не перемещается соответственно. Если вы тестируете игру в этот момент, вы должны будете играть столько раз, сколько хотите, не сталкиваясь с какими-либо проблемами с падением блока.


Игра закончена

Теперь, когда наша цепочечная система находится на месте, мы добавим сценарий потерь и экран Game Over.

Первое, что нам нужно сделать, это добавить новый макет, который будет действовать как наша игра поверх экрана:

  1. В правой части экрана щелкните правой кнопкой мыши папку «Макеты» (Layouts) и выберите «Добавить макет» (Add Layout).
  2. Выберите «Добавить лист событий» (Add Event Sheet).
  3. Перейдите в новый макет и создайте новый объект BG Tile.
    1. Выберите изображение GameOverBGTile.png из папки BG Images в графическом пакете, который вы загрузили во время первого учебника.
    2. Установите положение на -6, -7.
    3. Установите размер 613, 619.
  4. Создайте новый объект Sprite.
    1. Выберите изображение GameOverText.png из графического пакета.
    2. Установите положение на 303, 200.
  5. Создайте новый объект Button.
    1. Установите имя на RestartButton.
    2. Установите положение на 262, 410.
    3. Установите размер в 100, 30.
    4. Установите текст для перезапуска.

Теперь, когда у вас установлен экран Game Over, вернитесь к исходному макету, макету 1 (Layout 1) и добавьте к этому новому пункту новый элемент:

  1. В Layout 1 создайте новый объект Sprite.
  2. Используйте инструмент Paint Bucket, чтобы нарисовать этот спрайт полностью красным.
  3. Закройте редактор анимации.
  4. Установите имя в GameOverArea.
  5. Установите положение на 196, -30.
  6. Установите размер до 344, 150.
  7. Установите непрозрачность на 0.

Вы должны заметить, что этот спрайт находится в том же положении и имеет тот же размер, что и верхняя часть игрового поля. Мы будем использовать этот объект спрайта для обнаружения, когда игрок потерял, обнаружив, когда блок столкнулся с ним. Перейдите в Лист событий 1 (Event Sheet 1), чтобы мы могли начать его реализацию.

Остановка блоков вверху

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

Теперь перейдите к событию, в котором вы перемещаете блоки и добавляете это условие:

Ваше движение результата должно теперь выглядеть так:

Match-3 Construct 2 tutorial

Теперь, когда движение использует нашу новую переменную, мы добавим событие, которое определяет условие потери:

Событие, которое мы только что сделали, вызовет функцию Game Over, когда блок перекрывает GameOverArea. Теперь мы фактически создадим функцию GameOver.

Два новых результата должны выглядеть так:

Match-3_Game_Construct-2_GameOverEvents

Причина, по которой мы создали отдельную функцию вместо того, чтобы делать эти действия в рамках события, которое фактически определяет игру, заключается в том, что это событие рассматривает только определенные блоки из-за событий, которые его запускают. Как вы можете видеть в сделанной нами функции, мы отключим функции перетаскивания Блока, чтобы игрок не смог продолжить выполнение матчей после обнаружения игры. Если мы это сделаем в случае обнаружения игры, это приведет к отключению блоков, которые вызвали игру, и каждый другой блок все равно можно перетащить.

Теперь перейдите к «Таблице результатов 2» (Event Sheet 2); мы добавим некоторые функции в объект RestartButton, который мы сделали ранее. Добавить новый результат в лист результатов 2:

Ваш результат должен выглядеть так:

Match-3 Construct 2 tutorial

Сброс значений

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

Чтобы сбросить их, нам нужно добавить действие к нашему событию On Start Layout, которое будет вручную сбрасывать их для нас.

Перейдите к событию On Start Layout и добавьте это действие в начальное событие до появления циклов For:

Теперь ваш результат должен выглядеть так:

Match-3 Construct 2 tutorial

Если вы повторите тест, у вас больше не будет этой проблемы.


Что делать дальше?

На этом этапе мы рассмотрели каждую функцию, которую я хотел охватить в рамках этого урока.

Вы заметите, что ваша игра еще не совсем такая же, как и в предыдущей демонстрации, причем большая разница заключается в том, что в вашей игре нет экрана «Пуск». Я решил не задумываться над созданием экрана «Пуск», так как это почти то же самое, что и создание экрана «Игра поверх экрана». Я оставляю это как упражнение для вас.

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


Специальные блоки

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

Большинство игр Match-3 включают специальные блоки, которые помогают разбить действие и сделать игру более захватывающей. Как бы то ни было, игра теоретически может продолжаться вечно, но игровой процесс никогда не меняется. Внедрение специальных типов блоков время от времени может помочь сделать игру более интересной, когда она уже долго длится.

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

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

Блоки бомб

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

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

На изображении ниже вы можете увидеть два типа блоков бомб из популярной игры Candy Crush Saga:

Match-3 Construct 2 tutorial

Блоки бомб обычно довольно просты в интеграции:

  • Начните с результата, который прослушивает уничтожение любых блоков бомб.
  • Всякий раз, когда кто-то уничтожается, он должен передать свое положение функции, которая затем найдет и уничтожит все блоки, которые также будут уничтожены этим блоком бомб.
  • Например, если ваш блок бомб должен уничтожить все окружающие блоки, вы должны передать позицию блока бомбы функции, которая будет смотреть на каждую из окружающих позиций, чтобы увидеть, есть ли там какие-либо блоки.
  • Если он найдет какие-либо блоки в этих позициях, он уничтожит их.

Замедление или блоки замедления

Еще один тип специализированного блока, который вы найдете во многих играх, - это тот, который замедляет скорость перемещения блоков или полностью их останавливает.

Блоки, подобные этим, очень просты.

  • Так же, как с блоками бомб, вам понадобится событие, которое слушает, когда один из этих блоков уничтожен.
  • Всякий раз, когда это происходит, вы должны либо изменить MovementsPossible на 1, чтобы блоки остановились, либо изменили speed так, чтобы блоки двигались очень медленно.
  • Затем вы должны запустить таймер, который длится в течение короткого периода времени, возможно, 10-15 секунд. Как только этот таймер закончится, вы сбросите скорость блоков и нормально продолжите.

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


Другие игровые режимы

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

Временной режим

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

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

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

Режим головоломки

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

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

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

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

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


Заключение

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

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

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.