Как сделать игру Fruit Ninja на Scratch
Кружок «Робикс» приветствует вас на новом уроке по разработке игр для начинающих. Сегодня вас ждет необычный урок. Мы будем изучать модуль «Видео распознавание«. С помощью видео распознавания мы сделаем игру Fruit Ninja на Scratch.
Напомним, что Scratch — это доступная среда программирования для новичков в программировании и разработке игр. Программа не требует самостоятельного написания кода, внутри нее уже есть все необходимые блоки, которые складываются в пазл и образуют циклы. Scratch бесплатный и для начала его можно даже не скачивать. Все, что необходимо, уже есть в онлайн-версии. Переходим на сайт Scratch и начинаем.
На нашем сайте уже есть подробный обзор интерфейса и основных инструментов Scratch. Если вы впервые столкнулись с программой, то советуем начать с него – вам будет проще ориентироваться в уроке.
Полезные ссылки из нашей базы знаний:
Если вы будете внимательно читать урок и разберете каждый шаг, то уже совсем скоро сможете самостоятельно написать игру без нашей помощи или усовершенствовать эту. Вперед!
Fruit Ninja — виртуальная нарезка фруктов
Смысл оригинальной игры: на экран вылетали разные фрукты и с помощью сенсора, пальцем, игрок разрубал их и получал очки. После нескольких пропусков фруктов или неожиданно взорванной бомбы игра заканчивалась. Несмотря на простой геймплей, игра покорила многих пользователей своей графикой, а именной красочностью и сочностью ярких фруктов, которые аппетитно разлетались по экрану. Сам же игрок ощущал себя искусным самураем, орудующим острым клинком.
В чем основная фишка нашей версии Fruit Ninja на Scratch? Мы будем рубить фрукты рукой! Вместо сенсорного пальца-меча мы будем водить руками перед веб-камерой и благодаря модулю видео распознавания наша рука превратится в меч и разрубит все фрукты, части которых также разлетятся в разные стороны, как в оригинале.
Модуль видео распознавания
Для начала разберемся как включить модуль «Видео распознавания». По умолчанию он недоступен. В левом нижнем углу находится синяя иконка «Добавить расширение», кликаем на нее и выбираем «Видео распознавание». Вместо привычного белого фона на сцену выводится изображение с нашей веб-камеры.
В самом низу в группе блоков появляется новый, с таким же название «Видео распознавание».
Давайте посмотрим, какие блоки нам теперь доступны.
Блоки «Видео распознавания»
Первый блок — «Когда скорость видео > 10» — это показатель динамичности видео. Например, если мы быстро подвигаем рукой, динамика кадра увеличится и спрайт поменяет свое положение.
Второй блок – «Видео движение на спрайт». Блок может отвечать за движение относительно спрайта. У нас на сцене есть спрайт, фон – наше видео, и если мы поведем рукой через спрайт, то переменная будет меняться.
Следующие два блока «Включить видео» и «Установить прозрачность» настраивают параметры камеры. Мы можем включить видео либо в нужный момент его выключить, либо «включить в обратную сторону», то есть отразить изображение зеркально. А с помощью последнего блока сделать изображение более ярким и четким или полупрозрачным. Если прозрачность видео 100 – нас совсем не видно, видео прозрачно. Если же прозрачность 0 – видео полностью непрозрачно, с таким значением самое яркое и четкое изображение, нас отлично видно. Вы можете настроить видео как вам нравится.
Самый важный для нас – второй блок. Он единственный выступает контроллером (*При помощи игрового контроллера игрок управляет движением и действиями элементов игры). Попробуем протестировать, чтобы лучше разобраться с новым модулем.
Тестируем новый модуль
Создадим переменную. Для этого перейдем в группу блоков «Переменные» и нажмем «Создать переменную» и назовем ее «Тест».
Начинаем строить цикл. Для того, чтобы это сделать переходим в группу «События» и выбираем блок «Когда зеленый флажок нажат». Именно эта кнопка запускает игру. Перетаскиваем его на рабочую панель справа. Мы будем перемещать сюда все блоки кода. Блоки магнитятся, достаточно приблизить их друг к другу.
Обратите внимания, что блоки разной геометрической формы – это подсказка. Если в блоке отверстие в виде ромба, то ни квадратный, ни круглый блок туда не подойдут. Нужно искать условие в соответствии с формой.
Далее: группа «Управление» и перетаскиваем блок «Повторять всегда».
Все действия, которые мы переместим внутрь этого блока, будут повторяться бесконечное количество раз, пока нажат зеленый флажок.
Мы создали переменную для того, чтобы посмотреть как реагирует видео распознавание на наше движение. Заходим в группу «Переменные» и выбираем блок «Задать переменной значение» и выбираем нашу переменную «Тест».
Вместо значения перетаскиваем новый блок из группы «Видео распознавания» — «Видео движение на спрайт».
Взаимодействуем со спрайтом
Сейчас мы наблюдаем, что переменная Тест изменяет свое значение. Если ваш спрайт находится в статичной части камеры, например, на стене, то значения переменной колеблются вокруг ноля: 0, 1, 2, 0, 1, 0. Но если спрайт попадает на часть изображения, где сидите вы и двигаете рукой, то значения резко возрастают до двузначных цифр и даже доходит до 100.
Строго понять, по какому принципу меняются эти цифры сложно, можно лишь опытным путем выявить закономерность. Нам не нужны точные значения. Достаточно заметить, что при статике значение переменной не увеличивается выше 30-40. Как только значение выше, мы из своей реальности воздействуем на спрайт. У вас могут быть свои значения. Советуем подвигаться перед камерой 🙂
После того, как вы поймете уровень чувствительности веб-камеры, переменную тест можно удалить.
Переходим к Fruit Ninja на Scratch
Мы готовы к самому интересному!
Давайте выберем фрукты из галереи спрайтов. Вы можете нарисовать их самостоятельно, но нам уже не терпится поиграть, тем более в коллекции большой выбор фруктов для нашей игры.
Наводим мышь на круглую кнопку с мордочкой кота и щелкаем мышкой.
Через верхнее меню галереи спрайтов переходим во вкладку «Еда».
Мы можем выбрать следующие спрайты: яблоко, бананы, апельсин, арбуз и клубника. То, что надо для Fruit Ninja на Scratch!
Код у фруктов будет почти одинаковый, поэтому давайте разберемся с одним из них, а дальше продублируем код во все спрайты. Иначе, если мы прямо сейчас добавим все необходимые спрайты, на сцене будет настоящий фруктовый салат.
Режем спрайты
Мы решили начать с бананов. Не у всех спрайтов уже есть костюмы в разрезанном виде. Нам придется сделать их самостоятельно.
Важно! Если мы нарисуем две части фрукта прямо в костюмах спрайта, то обе части будут падать одновременно. В оригинальной игре Fruit Ninja, да и в жизни тоже, кусочки разлетаются и летят хаотично. Поэтому мы сделаем не просто новый костюм, а два дополнительных спрайта – для каждой части разрезанного фрукта, который будет иметь собственную траекторию падения.
Для этого дублируем спрайт Бананов на панели спрайтов еще два раза. Сделать это можно правой кнопкой мыши — щелкаем на спрайт и выбираем «Дублировать».
У нас должно получиться 3 спрайта. Один оставляем целым – в таком виде бананы будут вылетать на экран. Выбираем второй спрайт бананов и переходим во вкладку «Костюм». Нам нужно определить ориентир, по которому мы поделим бананы на верхнюю и нижнюю части. Смотрите на белые и темные квадратики — можно ориентироваться на них. Дальше берем «Ластик», проводим линию и стираем нижнюю часть спрайта.
Переходим в третий спрайт бананов и делаем то же самое, только в этот раз удаляем верхнюю часть.
Чтобы не запутаться, советуем переименовать каждый спрайт. Первый будет называться просто – Бананы, следующий – Бананы-верх и последний – Бананы- низ.
Режем фрукты
Что должно происходить дальше? Целый спрайт Бананов появляется на экране, мы его режем и целый спрайт прячется, а вместо него появляется верх и низ. Но мы столкнулись с проблемой. Если мы просто спрячем основной спрайт, то он не будет виден глазу, но его чувствительность на наши движения останется. Получается, что Бананы будут спрятаны, но все равно будут разрезаться и разлетаться. Чтобы этого не происходило, мы спрайту Бананы сделаем дополнительный костюм. Переходим во вкладку «Костюм» и дублируем уже имеющийся с помощью правой кнопки мыши, ничего в нем не меняем. Этот костюм выполняет чисто техническую, вспомогательную функцию. Костюм 2 нужен для дополнительного условия.
В этом уроке мы столкнемся с многими трудностями, но оно того стоит. Мы детально повторим физику оригинальной игры. Вперед, несмотря на сложности!
Полет бананов
Давайте начнем писать цикл в спрайте «Бананы» (цельный спрайт). Переходим в группу «События» и выбираем блок «Когда зеленый флажок нажат», далее «Управление» и цикл «Повторять всегда».
Фрукты будут вылетать с 2 сторон сцены, значит у одних направление будет от 0 до 180 градусов — это правая сторона, а у других фруктов направление будет отрицательным — от -180 до 0 — это левая сторона.
Так как варианта для вылета фруктов у нас два, то и спрайт будет передавать 2 сообщения в зависимости от того, какое направление у банана выпадет.
Внутрь блока «Повторять всегда» помещаем два условия из группы «Управление» — «если, то». Нам нужно сделать тройное условие. Переходим в группу «Операторы» и выбираем два оператора со знаком И. Начальная структура кода выглядит так (см. Рис. 15)
Условия для резки фруктов
Первое условие будет указывать на номер костюма, нам нужен костюм 1, третье условие — блок из новой группы «Видео распознавание», который отвечает за прикосновение нашей руки к спрайту, а второе условие – это направление. Направление у нас может быть положительное: от 0 до 180 и отрицательное: от 0 до -180. Добавляем эти условия. Направление > 0 и наоборот – 0 > направление. Внутрь каждого оператора добавляем по еще одному оператору с соответствующим знаком. А именно: равно, >, >.
Из группы «Внешний вид» выбираем блок «Номер костюма» и вставляем в первый оператор. Из группы «Движения» выбираем блок «Направление» и в первом условие вставляем его на первое место (Направление > 0), а во втором — на второе (0 > Направление). В третий оператор добавляем наш новый блок из группы «Видео распознавание» — «Видео движение на спрайт» и вписываем необходимое значение. В нашем случае при активном движении тела переменная была больше 40, это значение и запишем. Если вам сложно воспринимать такое количество блоков в виде текста, обязательно смотрите на наши скриншоты. Структура кода Рис. 17.
Если эти условия соблюдены, то наш спрайт Бананов должен сменить костюм на второй и спрятаться. А также передать нашим частям сообщения, что его разрубили.
Передаем сообщения «Разрубил банан»
Переходим в группу «Внешний вид» и выбираем «Изменить костюм» на второй — bananas2. В той же группе выбираем блок «Спрятаться». Наши целые бананы спрятались и теперь нам нужно передать сообщение частям, чтобы они появились. Переходим группу «События» и выбираем «Передать сообщение», по стрелочке на блоке выбираем «Новое сообщение». Будем передавать — Разрубил банан и Разрубил банан 2.
Чтобы с костюмами не было путаницы, давайте напишем параллельный цикл, который будет задавать спрайту Бананы в начале игры первый костюм.
«События» -> «Когда зеленый флажок нажат» и «Внешний вид» -> «Сменить костюм на bananas» и «Показаться», ведь при разрубке спрайт спрятался.
Мы обязательно сделаем так, чтобы фрукты в нашей игре Fruit Ninja на Scratch вылетали, но пока, для проверки добавим блок, по которому бананы будут просто крутиться на месте. Из группы «Управление» выбираем цикл «Повторять всегда», а в группе «Движения» возьмем блок «Повернуть на 15 градусов».
Для того, чтобы понять, получилось ли у нас, нужно дописать код частям бананов. Он будет почти одинаковым.
Условия для частей бананов
Когда игра начинается, мы не должны видеть эти спрайты. Значит выбираем блок из группы «События» — «Когда зеленый флажок нажат», а из группы «Внешний вид» перетаскиваем блок «Спрятаться».
Когда же они должны появиться? Правильно, в тот момент, когда главный спрайт бананов будет разрезан. Мы специально добавили блоки «Передать сообщение». Значит, когда спрайты «Бананы-верх» и «Бананы-низ» получат сообщения, они должны появиться в том месте, где только что был спрайт Бананы, унаследовать его положение.
В группе «Движения» есть блок «Перейти на …», который поможет нам в этом. Части бананов должны перейти на место спрайта Бананы. Выбираем нужный спрайт.
После того как части бананов переместили в нужное нам место, они должны появиться. Переходим в группу «Внешний вид» и выбираем блок «Появиться».
Части бананов должны двигаться до тех пор, пока не коснутся края сцены. Значит следующий блок условия должен быть «повторять пока не» и в качестве условия из группы «Сенсоров» выбираем «Касается края».
Движение частей бананов
Прежде чем прописывать траекторию падения частей бананов, мы должны вспомнить как выглядят оси координат в Scratch. Центр сцены — это 0. Ось x — горизонтальная, то есть расположена слева-направо. Двигаясь в право значения по этой оси увеличиваются, а влево — уменьшаются. Ось y — вертикальная, то есть сверху-вниз. Выше центра — положительные значения, ниже — отрицательные.
В качестве блока из группы «Движения» мы выберем «плыть 1 секунду в точку по x и y». Следуя этому блоку, наши части бананов будут двигаться вниз по оси y, поэтому значение для y будет -180, где-то совсем низко, на границе сцены. Это значение одинаково и для команды «Разрубил банан» и «Разрубил банан 2».
А вот по оси x значения будут отличаться. Нам нужно, чтобы части — верх и низ- как будто отталкивались друг от друга. Поэтому значение по x будет выдаваться случайным число в диапазоне слева и в диапазоне справа.
Для того, чтобы выдать случайное число, переходим в группу «Операторы» и выбираем блок «Выдать случайное от и до». При сообщении «Разрубил банан» по оси x наша часть бананов будет получать случайное число от -40 до 10, где-то в левой части сцены. При сообщении «Разрубил банан 2» случайное число будет от 10 до 40, где-то в правой части сцены. Наш код выглядит следующим образом. (см. Рис. 23)
Код для верха и низа бананов одинаковый, но нужно поменять сообщения местами. Если верх сначала получается «Разрубил банан», то первое условия для низа — «Разрубил банан 2». Это нужно для того, чтобы верх и низ бананов по оси x двигались в разные стороны, отталкивались друг от друга.
Динамика Fruit Ninja на Scratch
Перед тем как тестировать, давайте добавим частям бананов динамики, ведь не может же фрукт после разреза лететь в таком же положении, какое у него было до. Для этого внутрь цикла перед блоком движения, добавим блок поворота. Поворачиваться наши части будут на произвольное число градусов, чтобы каждый фрукт разлетался по-своему. Добавляем блок из группы «Движения» — «Повернуть на 15 градусов».
Обратите внимание, что в двух условиях должен быть разный поворот. Если, при сообщении «Разрубил банан» поворот налево, то при «Разрубил банан 2» — направо. Так же нужно сохранить рассинхрон верха и низа. Если в спрайте «Бананы-верх» сначала налево, потом направо, то в спрайте «Бананы-вниз» сначала направо, потом налево. Это может показаться сложным и запутанным, но если вы поймете механизм, останется только проследить, чтобы разница между кодом сохранялась.
Из группы «Операторов» выберем блок «выдать случайное число», добавляем в блок «повернуть» и вписываем значения от 1 до 90. В нашем случае — это градусы.
Теперь каждый раз фрукты разлетаются по-разному. Проверяйте. Попробуйте разрезать бананы несколько раз, начиная и заканчивая игру. Отлично! Только о-о-о-очень медленно. Давайте уменьшим 1 секунду в блоке «плыть» на 0.5. Так намного лучше.
Еще немного динамики
Сейчас наш банан крутится на экране, а не вылетает. Но ведь так никуда не годится.
Фрукты в нашей версии Fruit Ninja на Scratch будут вылетать на экран слева и справа.
Добавляем в начало кода спрайта Бананы условие «если, то, иначе». В условие для цикла нам нужно добавить блок из группы «Операторы» со знаком =. И мы вновь добавим генератор случайного числа. У нас всего два варианта. Фрукты сыпятся либо справа, либо слева. Значит случайное число от 1 до 2, сразу после знака = пишет цифру 1. Читаем наше условие: если «выдать случайное число от 1 до 2» = 1, то ….., иначе (то есть, если это случайное число 2). Какое же условие мы должны дописать внутрь цикла?
Нам нужно два условия начала игры. Для этого переходим в группу «Движение» и выбираем блок «Положение по x, y». В первом случае, значение по оси x будет положительным — 200, где-то справа. А во втором случае, значение по x будет -200, где-то слева. По оси «у» у каждого нового вылетающего фрукта свое значение. Один фрукт вылетит выше, другой ниже. В область y вновь добавляем генератор случайных чисел из группы «Операторы». Мы напишем числа от -100 до 100, не слишком высоко и не низко. Вы можете экспериментировать.
Осталось добавить направление. В том случае, когда фрукт будет в точке 200 по оси х, он должен лететь в противоположную сторону, то есть влево. Давайте посмотрим на Рис. 14. Положительные значение справа, а нам нужно двигаться в противоположную сторону. Значит направление для этого фрукта будет -90. А для другого 90. (см. Рис. 26)
Свободное падение фруктов
При падении предметы не летят линейной. Они сначала набирают высоту, а затем плавно снижаются. Это связано с гравитацией. Помните, мы уже сталкивались с этим явлением, когда делали игру Динозаврик.
Переходим в группу «Переменные» и создаем новую – Гравитация.
Начинаем новый кусок кода с блока «Когда зеленый флажок нажат». Из группы «Переменные» выбираем блок «задать значение» и обозначаем, что в начале игры наша переменная ровна 20. Если поставить слишком большое число, то фрукт будет лететь у самого края сцены и мы не сможем его разрезать. Далее добавляем условие «Повторять всегда», внутри которого будет следующее. Из группы «Движение» выбираем блок «Изменить y на», и присвоим оси y значение переменной Гравитация и будем менять значение переменной на -1. Так как у нас зависимость у от Гравитации, фрукт будет плавно двигаться по оси у в сторону и падать.
Фруктопад
Бананы в нашей игре Fruit Ninja на Scratch должны падать к нам неограниченное количество раз, снова и снова, то есть движение спрайтов нужно зациклить. Поместить этот код в цикл невозможно, поэтому мы вновь обратимся к передаче сообщения.
Когда начинается игра, мы будем бесконечно, то есть «повторять всегда» передачу сообщение «Появись банан». И когда наши Бананы будут получать сообщение, они будут двигаться. Так как сообщение будет передаваться все время, то и бананы будут двигаться бесконечно. Чтобы мы успевали резать фрукты, сообщение должно передаваться раз в какое-то время. Мы добавляем блок «ждать 1 секунду», но лишь секунда – это тоже быстро, поэтому можно заменить значение на 2 или 3. Если вы профессиональный ниндзя, можете оставить 1 секунду!
Поменяем блок «Когда зеленый флажок нажат» на блок «Когда я получу «Появись банан».
Давайте проверим, все ли работает? Проверяйте, все ли вы сделали правильно. Бананы вылетают с разных сторон? Вы успеваете их разрезать? Части бананов летят в разные стороны? Если на все вопросы вы ответили положительно, продолжаем. Если что-то не получилось, перечитайте наш урок и попробуйте выставить наши значения.
Бананы + яблоко
Добавляем новый спрайт в нашу игру Fruit Ninja на Scratch. Это будет яблоко.
Логика наших действий такая же, как и в работе со спрайтом бананов. Дублируем спрайт Яблоко три раза — один спрайт будет целый, два части — верх и низ. Не забывайте менять названия спрайтов. Для удобства предлагаем повторять за нами. 3 спрайта — Яблоко, Яблоко-верх, Яблоко-низ. В спрайте Яблоко создаем дополнительный костюм.
Переносим все блоки из спрайта Бананы в спрайт Яблоко. Код будет очень похож, подправим только мелочи:
- У яблок свой костюм — apple2
- Частям яблока мы будем передавать сообщения «Разрубил яблоко» и «Разрубил яблоко 2»
- Яблоки будут сыпаться по команде «Появись яблоко»
Точно также нужно перенести кусочки кода со спрайтов частей бананов в части яблок. Здесь точно так же будут минимальные изменения.
- Сообщения «Разрубил яблоко» и «Разрубил яблоко 2»
- Часть яблока должна переходит на место спрайта Яблоко
Проверяйте, чтобы в яблоках ни осталось и следа бананов 🙂
Появись!
Когда мы проверяли наш код на бананах, мы отправляли сообщение «Появись банан». Но у нас будет 3-4-5 разных фруктов, которые должны появляться друг за другом, поэтому мы напишем код для Сцены и добавим необходимое количество условий.
Переходим в Фон. Для этого кликаем по области «Сцена» в правом нижнем углу.
Нам нужна переменная «Фрукт», она будет отвечать за то, какой именно фрукт будет вылетать на сцену. Переходим в группу «Переменные» и создаем новую. В зависимости от значения переменной мы будем видеть на сцене разные фрукты.
Начинаем новый кусок кода. «События» -> «Когда зеленый флажок нажат», «Управление» -> «Повторять всегда»
Фрукты должны вылетать в хаотичном порядке, значение переменной должно задаваться случайно, поэтому далее добавляем блоки из группы «Переменные» — «задать фрукт» и дополняем оператором «выдать случайное число» от 1 до 2. Пока напишем так, потому что сейчас мы добавили в игру Бананы и Яблоки, далее мы дополним этот код.
Добавляем два условие «если, то», в который вставляем оператор со знаком =.
Получает, что если переменная Фрукт будет 1, то мы передаем сообщение «Появись банан», а если Фрукт равен 2, то «Появись яблоко».
Фрукты должны вылетать на сцену постоянно, но при этом мы должны успевать их рубить. Поэтому добавляем в условие «ждать 2-3 секунды», подбирайте значение для себя.
В нашей версии игры будет всего 3 фрукта — бананы, яблоко и арбуз. Но в галерее спрайтов есть еще апельсин и клубника, вы можете добавить все, что уже есть в Scratch и получить максимально полную и разнообразную игру. Мы же хотим как можно скорее научить вас разным крутым фишкам, поэтому остановимся на трех фруктах!
Добавляем арбуз
Надеемся, что на третий раз вы уже запомнили механизм включения спрайта в игру. Мы написали для вас укороченный список действий. Если что-то непонятно, перечитайте еще раз про бананы или яблоко и все встанет на свои места.
- Добавляем 3 спрайта — целый арбуз, арбуз-верх и арбуз-низ
- Добавляем второй костюм целому спрайту
- Дублируем код для целого спрайта и частей арбуз
- Меняем сообщения на команды со словом арбуз, меняем костюм
- Добавляем арбуз в условия в коде Фона. Случайное число от 1 до 3, если переменная Фрукт = 3, то сообщение «Появись арбуз»
Прячем фрукты
Чтобы наши фрукты прятались, когда падают за черту сцены, мы создадим новый цикл. «Когда зеленый флажок» + «повторять всегда» + условие «если, то». В условие добавляем оператор со знаком <. В первый промежуток из группы «Движение» добавляем «положение y». Если положение по оси y меньше -180, то фрукт прячется. Дублируем это правило для всех фруктов.
Промежуточный результат
Уже на этом этапе нашу демо-версию Fruit Ninja на Scratch можно протестировать. Потренироваться рубить фрукты, посмотреть на чувствительность камеры, скорость вылета фруктов. Сделать настройки под себя. Мы закончили делать основной геймплей и переходим к дополнениям.
В одно из режимов оригинальной версии Fruit Ninja игроку дано ограниченное количество времени. За минуту нужно показать лучший результат. Именно этот режим мы постараемся воспроизвести. Добавим счетчик времени и счетчик очков.
Дополнения для игры Fruit Ninja на Scratch
Добавляем таймер
Отсчет времени мы сделаем с помощью переменной. Создадим новую и назовем ее — Время. Так как функция времени относится ко всей игре сразу, эти блоки мы будем ставить в код сцены. Добавим этот блок в начало кода. Присвоим переменной значение 30 – 30 секунд для игры.
Мы можем изменить вид переменной на сцене, щелкнув по ней правой кнопкой мыши. Чтобы нас не отвлекала большая надпись, мы же и так помним, что это Время, мы представим ее в виде крупного значка – «Крупный вид».
Теперь нам необходим параллельный цикл, в котором время будет убавляться.
«Когда зеленый флажок» + «повторять всегда». Нам нужно ждать одну секунду и убавлять значение переменной. Выбираем нужный нам блок из группы «Управление» — «Ждать1 секунду». А затем переходим в группу «Переменные» и выбираем «Изменить Время на -1».
Когда время будет равно 0, игра должна остановиться. Добавим в первый цикл в коде Фона условие «если, то, иначе». Для этого нужно подвинуть предыдущие строчки. См. Рис. 35.
И в первое условие «если», нужно добавиться оператор со знаком больше. Если наша переменная Время> 1, то игра продолжается, иначе, она закончится. Для того, чтобы игра остановилась, переходим в группу «События» и выбираем блок «стоп все». Отлично, теперь у нас есть ограниченное время, чтобы рубить фрукты.
Давайте создадим счетчик очков, который покажет сколько фруктов за 30 секунд мы успели разрубить.
Добавляем счетчик очков
Создаем новую переменную – Очки. Ее мы так же, как и время, сделаем в крупном виде и оставим на сцене.
Изначально, наши очки будут равны нулю. Добавляем значение переменной под блок со временем.
Когда мы разрезаем фрукт, нам должны начисляться очки. Еще мы сделаем так, чтобы за каждый фрукт прибавлялось время, чтобы можно было играть дольше. Больше очков, дальше игра, а значит еще больше очков.
Основной контроллер игры у нас в сцене, так мы даем общие указания для всего. Поэтому фрукты будут передавать сообщение «Разрубил» именно туда, и уже в сцене мы пропишем код, который будет увеличивать наше время и количество очков.
Сейчас нам нужно добавить одинаковый блок «Передать сообщение Разрубил» под каждое сообщение «Разбил банан», «Разрубил банан 2», «Разрубил яблок», и т.д. Каждый блок должен оканчиваться вот так. (см. Рис. 38)
Далее переходим в код Сцены и создаем новый цикл, который будет начинаться блоком «Когда я получу «Разрубил». И добавляем два блока — переменная Очка изменяется на 1, а переменная Время — на 2.
Давайте проверять? Запускаем игру Fruit Ninja на Scratch и рубим фрукты!
Отлично, у нас все работает, а у вас?
Если вы хотите, можно остановиться на этом моменте. Игра отлично работает, мы рубим фрукты рукой 30 секунд и получаем очки.
А мы пойдем дальше и усложним игру. Сделаем так, что со временем фрукты будут лететь быстрее и поймать их будет все сложнее.
Ускорение Fruit Ninja на Scratch
Нам нужно придумать формулу, по которой скорость фруктов будет обратно пропорциональна времени, которое мы находимся в игре. Когда мы начинаем игру – интервал вылета фруктов будет 3 секунду, чем дольше играем, тем меньше становится этот интервал.
Нам необходимо добавить таймер: еще один измеритель времени, с которым мы напишем формулу.
Включить таймер можно в группе «Сенсоры». Напротив «Таймера» нужно поставить галочку, а чтобы он каждый раз обновлялся, добавим блок «сбросить таймер» в начало кода.
Давайте обговорим логику наших действий. У нас есть блок «ждать 3 секунды», который отвечает за то, чтобы фрукт вылетал каждые 3 секунды. Нам нужно из этого интервала вычитать таймер. Но если мы будет из 3 секунд вычитать значение таймера, то практически сразу это значение уйдет в минус. Ничего не получится. Значит нам нужно искусственно уменьшать значение таймера, умножая его на число. Мы взяли 0,04. Так значение таймера будет увеличиваться медленнее, а игра ускорится плавнее. Если мы будем играть 25 секунд, то интервал между фруктами сократится на 1 секунду. 25*0.04 = 1 секунда.
Чтобы это сделать берем два оператора: со знаком минус и со знаком умножить.
Помните какое действие в примерах выполняется в первую очередь? Умножение или вычитание? Подумайте несколько секунд, вспомните. Один, два, три. Умножение. Надеемся, вы не забыли школьную программу.
Теперь мы можем заметить, что если у нас вылетает банан, и случайным числом следующий фрукт – тоже банан, то первый банан прекращает свой полет и переносится за сцену и снова вылетает. Это происходит потому, что у нас летает один и тот же спрайт. Один не успевает закончить свой полет и уже вылетает второй. Нам нужно добавить переменную и новое условие, по которому два одинаковых фрукта не будут вылетать подряд.
Неслучайная случайность
Создадим новую переменную и назовем ее – Предыдущий фрукт. В каждом условии нужно присвоить этой переменной значение от 1 до 3 в соответствии с фруктом.
Кроме этого, нам нужно добавить новое условие «если, то, иначе». Нам снова нужно достать кусок кода, чтобы вставить его чуть ниже.
Благодаря этому условию, мы сможем сказать нашей игре – если переменная Фрукт = переменной Предыдущий фрукт, то выбери другое случайное число, иначе – пусть код продолжается и фрукты вылетают.
Первое условие оставим пустым, а во второе – поместим наш предыдущий кусок кода. Когда будет начинаться цикл и значение переменных будет одинаковым, то программа просто будет возвращаться на предыдущий шаг, где мы выбираем случайное число для переменной Фрукт. Этот блок дублировать не нужно.
Запускаем! Вы можете проверить не повторяются ли фрукты, просто понаблюдав за игрой.
Минус время
Пока что наша игра достаточно легкая, потому что очень много времени, которое только увеличивается и очень много фруктов, которые приносят нам много очков. Где же экшен? Давайте сделаем так, что за пропуски время будет уменьшатся. Именно такое условие было в классической игре оригинальной версии.
В тот момент, когда фрукт упал и спрятался, нам нужно передавать сообщение – «Упал». Не забывайте, что подобный цикл у нас есть в каждом фрукте, значит нужно добавить сообщение «Упал» в 3 цикла. (Если у вас больше фруктов, добавляем сообщение во все)
Но если мы просто отправим сообщение «Упал» и будем отнимать жизни, то спрайт, который лишь спрятался с наших глаз, но продолжает лежать внизу сцены, отправит множество сообщений и заберет все наше время.
Поэтому мы вспомним нашу хитрость с костюмами. Если мы не успели разрезать фрукт, то у него первый костюм. Давайте дополним наше условие, по которому фрукт прячется – не только положение по оси y меньше -180, но и первый костюм. Для этого достанем условие «положение по y» и добавим новый оператор со знаком и. В каждую из частей оператора добавляем по еще одному оператору. Первый со знаком <, а второй со знаком =. Получилась структура Рис. 50.
Передадим сообщение «Упал» и сразу же сменим костюм на второй, на который наше условие не будет распространяться. И спрячемся.
Не забудьте продублировать код для всех фруктов, и сменить костюм для каждого фрукта отдельно.
Затем переходим в сцену и создаем новый кусок кода, который начнется блоком из группы «События»: «Когда я получу сообщение упал», переменная Время должно уменьшиться на 2 секунды.
Мы закончили игру Fruit Ninja на Scratch! Поздравляем. Это было трудно, но мы справились! Задание под звездочкой для самых-самых усидчивых. А тем, кто уже устал, мы предлагаем сыграть в нашу рабочую версию. Играть!
(*) Визуальные, звуковые эффекты и комбо-очки
Визуальный эффект для жизней и счетчика очков в игре Fruit Ninja на Scratch
Сейчас наше время и очки меняются незаметно. В активном процессе игры мы можем не понять, что секунды уменьшаются и мы скоро проиграем. Добавим яркие цифры под переменные, которые будут сообщать нам молодцы мы или близки к поражению.
Для этого добавим новый спрайт. Перейдем в галерею спрайтов и в самом низу, около букв найдем цифры.
Мы выберем цифру 2 — именно столько секунд у нас отнимают за промах. Переходим во вкладку «Костюм» и с помощью заливки меняем цвет, а кисточкой дорисовываем знак минус.
С помощью мыши перетаскиваем спрайт с цифрой под переменную времени. На панели спрайтов уменьшаем размер со 100 до 50, чтобы цифра смотрела аккуратно.
Когда игра начинается, наша цифра должна быть спрятана. Начинаем новый цилк: «Когда зеленый флажок нажат» и из группы «Внешний вид» берем блок «Спрятаться». А когда спрайт будет получаться сообщение, что один из фруктов «Упал», он будет появляться и немного двигаться, напоминая о том, что количество времени уменьшилось. Движение мы создадим при помощи чередования поворотов и задержек. Выбираем блок «повторять 10 раз» и чередуем две команды. В конце снова прячемся.
Абсолютно также сделаем заметный счетчик очков. Переходив галерею спрайтов и выбираем цифру 1. Также во вкладке «Костюм» с помощью заливки раскрашиваем его. Если хотите, можно добавить знак плюс.
Звуковой эффект
Мы можем добавить звуковые эффекты для наших сообщение «Упал» и «Разрубил». Для этого в группе «Звуки», перетаскивайте блок «Включить звук» и выбирайте тот, который вам понравится! Галерея звуков находится во вкладке «Звук» внизу.
В галерее звуков Scratch огромный выбор. Для сообщения «Разрубил» мы выбрали этот звук (см. Рис. 57.), он наиболее похож на звук в оригинальной игре – взмах меча.
Комбо-очки
Почти в каждой игре, где нужно что-то ловить или резать, есть комбо-очки, которые увеличиваются из-за того, что игрок выполняет действие несколько раз подряд. В нашей игре Fruit Ninja на Scratch будет комбо за пять разрезанных фруктов подряд.
Создаем переменную — Комбо. Изначально она будет ровна 1, мы присваиваем ей значение в начале цикла, где у нас хранятся все переменные.
Когда мы получается сообщение «Упал», то значение переменной Комбо должно становится 1. Но когда мы получается сообщение «Разрубил», комбо должно увеличиваться, если оно не равно 5. 5 – это наше максимальное количество очко за один разбитый фрукт. Значит мы должны добавить условие «если, то», в которое пропишем комбо < 5.
Теперь нарисуем спрайт для комбо. Мы написали слово «combo» и продублировали этот костюм еще 4 раза. Каждый последующий костюм показывает какое значение у комбо: комбо 2, комбо 3 и т.д. Мы дорисовали цифру под каждым словом. Вы можете оформить этот спрайт как угодно, используйте свою фантазию. Значение комбо у нас от 1 до 5, значит и костюмов всего 5.
Нам нужно сделать бесконечный цикл, который будет устанавливать спрайту костюм в зависимости от значения переменной Комбо. Начинаем новый цикл: «Когда зеленый флажок нажат» -> «повторять всегда». Из группы «Внешний вид» выбираем блок «изменить костюм на» и внутрь добавляем оператор «Объединить» (Рис. 60).
Подставляем в него наши значения — костюм и переменная Комбо.
Финал Fruit Ninja на Scratch
Игра готова и наш урок Fruit Ninja на Scratch подошел к концу. Игра требовала от нас повышенного внимания, но это было интересно. Мы изучили новый модуль и по взаимодействовали со спрайтами из своей реальности!
Дальше вы сможете усложнить игру и придумать новые уровни, добавить больше фруктов или сделать запретный фрукт, разрезав который, игрок автоматически проигрывает. Удачи!
Еще больше игр на Scratch на нашем онлайн-курсе! Итог каждого урока — новая игра. На курсе мы создаем змейку, Subway Surfers и даже свою версию культовой игры Пэкман. Почитать о курсе вы можете ЗДЕСЬ.
Рабочая версия проекта по нашей инструкции