Занятие 6.5 Продвинутая работа с текстом и таймерами
Цель: реализовать логику второй сцены образовательного проекта "Урок английского", соответствующую техническому заданию.
Задачи:
- Закрепить навыки работы с логическими блоками ботов в Blockly
- Закрепить навыки настройки логики ботов
- Закрепить навыки тестирования своих проектов
- Создать необходимые функции для реализации проекта
- Реализовать логику задания второй сцены
- Закрепить навыки работы с активацией/деактивацией объектов в Blockly
- Научиться работать с расширенным функционалом таймера
- Научиться использовать переменные внутри текста
- Научиться настраивать несколько таймеров в проекте (глобальный и локальный таймеры)
Сборка логики второго Урока.
Поскольку основа логики второго урока во многом повторяет первую, то мы не будем разбирать все аспекты подробно, но остановимся подробнее на создании логики таймеров.
Объявление переменных.
Нам понадобятся следующие переменные:
- Переменная X - для генерации случайного числа, аналогично переменной Случайный выбор вопроса из предыдущей сцены.
- Переменные Время на ответ и Время игры - в этих переменных хранятся значения для соответствующих таймеров, а именно количество их срабатываний до наступления определенного события. Для корректировки сценария мы можем быстро менять эти значения.
- Переменные Ответ и Вопрос - аналогично предыдущему кейсу.
- Переменная Результат - также аналогична предыдущему кейсу, будет увеличиваться на один при правильном ответе.
- Переменная Фраза друга - в этот раз у нашего Бота будет гораздо больше текста, поэтому для оптимизации кода мы будем хранить его стандартные фразы в переменных, вы убедитесь, что это гораздо удобнее, когда мы будем собирать функции.
- Наконец, список Предметы - в этом списке мы собираем названия предметов на английском языке.
Примечание: в Varwin элементы в списке индексируются автоматически, в соответствии с их расположением в Blockly по порядку сверху - вниз, начиная с единицы и далее по порядку целыми числами (1, 2, 3, 4, 5... и так далее).
В целом блок “В момент инициализации” у нас должен выглядеть так, но у вас могут быть и свои особенности:
Далее сразу же собираем событие при нажатии на UI “Готов!”:
Это событие инициализирует таймер Время игры (30 секунд) и запускает функцию Вопрос.
Функция Вопрос.
Итак, функция Вопрос активирует таймер Время на ответ (10 секунд) и генерирует случайное целое X от 1 до 8 (в соответствии с количеством индексов в списке, у вас предметов может быть больше).
Далее переменной Вопрос присваивается значение элемента из списка с соответствующим индексом X. После этого Бот произнести составную фразу из двух переменных Фраза Друга + Вопрос. Фраза друга в момент инициализации: “Начали! Первый предмет: “ и далее предмет, случайным образом выбранный из списка Предметы.
Переменная Фраза Друга будет меняться в зависимости от наших ответов, без этой переменной нам бы пришлось создавать логику для каждого из новых вариантов, что в несколько раз увеличило бы сложность Blockly.
Логика выбора предмета.
Далее, аналогично предыдущему кейсу создаем блоки, которые управляют выбором одного из интерактивных предметов.
Данные блоки присваивают новое значение переменной Ответ, в зависимости от того на какой предмет нажимает Игрок, останавливает таймер Время на ответ, если не прошло 10 секунд и запускает функцию Проверка ответа.
В отличие от предыдущего Урока мы не запускаем сразу функцию Следующий вопрос, поскольку иначе было бы сложно реализовать реакцию Бота на наш ответ, поэтому реализуем это в теле функции Проверка ответа.
Функция проверка ответа.
Посмотрим на то, как выглядит эта функция:
Во первых, каждый раз, когда мы нажимает на предмет Бот будет к нам побегать, чтобы задать следующий вопрос, это удобно с точки зрения UX-дизайна, чтобы всякий раз не подбегать к Боту для получения следующего задания.
Далее все очень просто:
- Если Вопрос = Ответ, то мы увеличиваем Результат на единицу, обновляем значение на UI Результат, присваиваем Фразе Друга значение: “Правильно! Следующий предмет: “ и активируем функцию следующий Вопрос.
- Иначе, если Вопрос не равен Ответу, то Результат не увеличивается и Фраза друга становится иной.
Наконец, возможен еще один дополнительный вариант, когда мы не успеваем найти предмет за 10 секунд, для этого случая соберем отдельное событие:
Мы запускаем таймер Время на ответ каждый раз, когда активируется функция Вопрос с интервалом в 1 секунду. Т.е.таймер срабатывает каждую секунду и мы должны проверять определенные условия при каждом срабатывании.
Первый блок отвечает за обновление UI Таймер ответа при каждом срабатывании.
Блок с условным оператором проверяет, что число срабатываний с момента запуска меньше 10, если же это условие наступает, что Фраза друга становится иной: “Не успел... Я дам время подумать на этот раз. Следующий предмет: “ и запускается функция Вопрос.
Как видите, мы предусмотрели все варианты развития событий.
Примечание: если бы не хранили текст Фраза Друга в переменной, то нам пришлось бы как минимум создавать три функции Вопрос с различными вариантами фраз, вместо одной (Вопрос, если предыдущий ответ правильный, Вопрос, если предыдущий ответ неправильный и Вопрос, если мы не успели), согласитесь, что это было бы менее практично? Постарайтесь найти применение этой практике в своих будущих проектах!
Глобальный таймер и финал игры.
Соберем событие, которое будет отвечать за обновление UI Осталось времени игры:
В этот раз игра заканчивается, когда заканчивается глобальный таймер, поэтому для финала игры у нас должно быть создано следующее событие:
Самостоятельная работа: все, что есть в этом финальном блоке мы уже ранее разбирали, поэтому для вас не должно составить особого труда собрать условия для финала игры. Можно заметить, что после завершения глобального таймера мы запрещаем игроку возможность использовать предметы, чтобы он не сломал логику приложения, а также даем возможность либо повторить текущий сценарий, либо вернуться к предыдущему Уроку с числительными - таким образом, мы зацикливаем все наше приложение, что может быть удобно с точки зрения UX/UI-дизайна.
Примечание: как мы уже разбирали до этого, свойства объектов, которые мы можем настраивать в инспекторе можно также менять через Blockly в разделе Переменные:
Если вы все сделали правильно, то в финале вы увидите примерно такой экран.
Поздравляем с завершением работы над еще одним кейсом, впереди нас ждет финальный самый сложный и интересный проект!
Контрольные вопросы (выборочно можно использовать на этапе рефлексии, для проверки усвоения знаний, полученных на занятии):
- Какой блок из категории «Текст» обеспечивает перенос на следующую строку?
- Где находится блок «Активации/Деактивации объекта»?
- Какие логические блоки есть у объекта таймер в Blockly?