Занятие № 5. Взаимодействие с сенсорами мобильного устройства

Задачи

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

Задание № 1. Компас

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

Для того, чтобы определить азимут, используем компонент image-20240313153732625СенсорОриентация. Координаты поможет определить компонент image-20240313153742594СенсорМестоположения.

Создайте новый проект под именем Compas.

Загрузка медиа-ресурсов

Из папки compas загрузите в проект файл compas.png:

Настройки проекта

Нажмите кнопку image-20240301192257937, чтобы открыть настройки приложения. В разделе General (Общие настройки) измените свойство AppName (Название приложения) на текст Компас. Это название будет показываться в списке приложений после установки.

Измените свойство Иконка на compas.png.

Нажмите Close, чтобы закрыть окно с настройками проекта.

Проектирование интерфейса

Интерфейс экрана Screen1 содержит следующие компоненты:

Настройте свойства компонентов согласно следующей таблице:

Компонент Свойства
Screen1 TitleVisible=нет галочки
ОриентацияЭкрана=Альбомный режим
image-20240307183520657ГоризонтальноеРасположение Ширина=Наполнить родительский
image-20240306215519782НадписьШирота Ширина=50 percent
image-20240306215519782НадписьДолгота Ширина=50 percent
image-20240301193850770Холст1 Высота=Наполнить родительский
Ширина=Наполнить родительский
image-20240303193955340СпрайтКомпас Изображение=compas.png
image-20240313153742594СенсорМестоположения1 ИнтервалРасстояния=10

Программирование компонентов

Перейдите в раздел Блоки.

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

Стандартное имя процедура замените на разместить_компас. Поместите внутрь блока-процедуры следующие команды:

Это описание процедуры. Добавим вызов процедуры в обработчик события Инициализировать. Блок с вызовом процедуры возьмите в категории Процедуры:

Вызов процедуры запустит выполнение блоков внутри описания данной процедуры:

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

Компонент СпрайтКомпас обладает свойством Курс, отвечающим за направление, в которое повёрнут спрайт. Создайте блок-процедуру повернуть_компас с параметром курс, для поворота спрайта в указанном направлении:

Составьте скрипт, который будет считывать текущий азимут и менять направление спрайта с помощью блока-процедуры повернуть_компас:

Широту и долготу выведем в компоненты НадписьШирота и НадписьДолгота:

Время тестирования!

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

Проект готов.

Задание № 2. QR-чат

Разработаем мобильное приложение с помощью которого пользователь может сканировать QR-коды с текстовыми сообщениями и создавать изображение с QR-кодом на основе указанного текста.

Для разработки понадобится компонент image-20240316164033680СканерШтрихКода.

Для создания QR-кода используем веб-API. Обратившись по адресу

https://api.qrserver.com/v1/create-qr-code/?data=Привет

мы получим изображение с QR-кодом в формате png. В коде будет закодирован текст указанный в параметре data.

Используем компонент Интернет, чтобы сохранить полученный файл и показать его в компоненте Изображение.

Создайте новый проект под названием QR_chat.

Проектирование интерфейса

Интерфейс экрана Screen1 содержит следующие компоненты:

Настройте свойства компонентов согласно следующей таблице:

Компонент Свойства
Screen1 TitleVisible=нет галочки
image-20240316165827379ИзображениеQR Высота=250 pixels
Ширина=Наполнить родительский
image-20240307183520657ГоризонтальноеРасположение Ширина=Наполнить родительский
image-20240316165921545ТекстСообщение Ширина=Наполнить родительский
Подсказка=Ваше сообщение
image-20240316165841318КнопкаОтправить Текст=Отправить
image-20240316165842617КнопкаСканировать Ширина=Наполнить родительский
Текст=Сканировать
image-20240306215519782НадписьРезультат ЖирныйШрифт=есть галочка
РазмерШрифта=20
image-20240316164033680СканерШтрихКода1 UseExternalScanner=нет галочки
image-20240322223720631ИнтернетQR НазваниеФайлаОтвета=qr.png
СохранитьОтвет=есть галочка
Timeout=5000

Программирование компонентов

Перейдите в раздел Блоки.

Добавьте запуск сканера QR-кода по нажатию кнопки КнопкаСканировать:

Перед вызовом сканеры мы убираем с экрана текст предыдущего сканированного сообщения.

Как только код отсканирован, возникает событие ПослеСканирования. Добавьте скрипт, который выведет результат сканирования в компонент НадписьРезультат:

Время тестирования!

Запустите приложение. Нажмите кнопку Сканировать и наведите камеру на следующий QR-код:

На экране телефона должен появится текст, зашифрованный в QR-коде.

Теперь будем генерировать QR-код на основе введённого пользователем сообщения. Чтобы сделать правильный запрос к веб-API, создадим собственный блок-функцию адрес_запроса с параметром сообщение.

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

Переименуйте блок-функцию в адрес_запроса и добавьте параметр сообщение:

Функция будет возвращать результат сложение двух строк:

https://api.qrserver.com/v1/create-qr-code/?data=

и значения параметра сообщение:

Добавьте скрипт обработчик нажатия на кнопку КнопкаОтправить. С помощью блока-функции адрес_запроса сформируем URL, запроса и запустим его:

Вызов функции адрес_запроса работает следующим образом:

Через некоторое время после запроса, сервер отправит ответ в виде png-изображения. Компонент Интернет сохранит это изображение под именем qr.png (см. таблицу со свойствами). Составьте скрипт, который покажет полученный файл в компоненте Изображение:

Время тестирования!

Запустите приложение. Наберите текст сообщения в текстовое поле и нажмите кнопку Отправить. Через некоторое время на экране телефона должен появиться QR-код с закодированным сообщением. Попросите соседа отсканировать код с экрана вашего телефона и сравните результат скана с вашим сообщением.

Проект готов.

Задание № 3. Космический курьер

Космический курьер потерял уйму подарков в космосе. Помогите курьеру собрать подарки.

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

Создайте новый проект по названием Space.

Загрузка-медиа ресурсов

Из папки space загрузите в проект файлы с изображениями ракеты и подарка, а также звук:

Настройки проекта

Нажмите кнопку image-20240301192257937, чтобы открыть настройки приложения. В разделе General (Общие настройки) измените свойство AppName (Название приложения) на текст Космический курьер. Это название будет показываться в списке приложений после установки.

Измените свойство Иконка на raketa.png.

Нажмите Close, чтобы закрыть окно с настройками проекта.

Проектирование интерфейса

Интерфейс экрана Screen1 содержит следующие компоненты:

Настройте свойства компонентов согласно следующей таблице:

Компонент Свойства
Screen1 TitleVisible=нет галочки
ЦветФона=Чёрный
ОриентацияЭкрана=Альбомный режим
image-20240316182455216Холст1 ЦветФона=Чёрный
Высота=Наполнить родительский
Ширина=Наполнить родительский
image-20240316182512646СпрайтКоробка Изображение=box.png
image-20240316182513648СпрайтРакета Изображение=raketa.png
image-20240306215519782НадписьСчет ЖирныйШрифт=есть галочка
РазмерШрифта=25
Ширина=Наполнить родительский
ЦветТекста=Белый
ВыравниваниеТекста=центр
image-20240316182543294ЗвукПодарок Источник=pick.wav

Программирование компонентов

Перейдите в раздел Блоки.

Создайте блок-процедуру разместить_ракеты. Блок будет принимать два параметра: наклон_x и наклон_y. Наклон телефона будет влиять на изменение координаты компонента СпрайтРакета. Также повернём нос ракеты в сторону расположения спрайта с подарком:

Добавьте обработчик события ОриентацияИзменена компонента СенсорОриентации. Каждый раз после изменения наклона телефона, будем вызывать блок-процедуру разместить_ракету:

Время тестирования!

Запустите приложение. Направление движения ракеты будет определятся тем, в какую сторону наклонён телефон. Нос ракеты должен быть всегда повёрнут в сторону спрайта с подарком.

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

Создайте блок-процедуру разместить_подарок, вызов которой перемещает спрайт в случайную точку холста:

Дополните существующий скрипт обработчика ОриентацияИзменена:

  1. Добавьте условный оператор.
  2. С помощью блока НакладываетсяНаДругой определяем соприкасаются ли два спрайта.
  3. Вызываем процедуру разместить подарок, чтобы переместить его в новую позицию.
  4. Воспроизводим звук
Время тестирования!

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

Добавим подсчёт собранных подарков. Объявите глобальную переменную счёт:

Для изменения значения переменной и одновременного вывода значения в компонент НадписьСчёт, объявите блок-процедуру изменить_счёт с параметром значение:

Дополните существующий скрипт обработчика ОриентацияИзменена вызовом блока-процедуры изменить_счёт. Новое значение счёта будет равно старому, увеличенному на 1:

Время тестирования!

Запустите приложение. Теперь каждый раз после пересечения двух спрайтов, счёт должен увеличиваться на единицу.

Чтобы начать игру заново и обнулить счёт придётся завершить работу приложения. Добавим возможность сбросить счёт, встряхнув телефон.

Добавьте описание блока-процедуры старт_игры, который разместить подарок в новой случайной позиции, обнулит счёт и запустит вибрацию на 500 мс:

Вызывать блок-процедуру старт_игры будем в двух случаях: после запуска приложения и после события Вибрация компонента СенсорАкселерометра1:

Время тестирования!

Запустите приложение. После запуска приложения телефон должен завибрировать. Это означает, что произошёл вызов процедуры старт_игры. Подберите несколько подарков а потом встряхните телефон. Он должен снова завибрировать, а счёт сбросится до нуля.

Проект готов.

Задание № 4. Сейсмограф

Разработаем приложение, которое сможет построить график изменения усреднённого значения ускорения телефона.

Для измерения ускорения используем компонент image-20240317202253927СенсорАкселерометра. Для того чтобы построить график, используем два компонента - image-20240317202505735Chart (общие настройки графика) и вложенный в него компонент image-20240317202519604ChartData2D (данные для построения графика). Оба компонента находятся в категории Charts.

Создайте новый проект под названием Graphic.

Проектирование интерфейса

Интерфейс экрана Screen1 содержит следующие компоненты:

Настройте свойства компонентов согласно следующей таблице:

Компонент Свойства
Screen1 TitleVisible=нет галочки
ОриентацияЭкрана=Широкоформатный режим
image-20240317202505735Chart1 Высота=Наполнить родительский
Ширина=Наполнить родительский
image-20240317202519604ChartData2D1 LineType=curved
image-20240317204452015Часы1 ТаймерВсегдаЗапущен=нет галочки
ИнтервалТаймера=50

Программирование компонентов

Перейдите в раздел Блоки.

Сенсор ускорения проводит измерения по трём пространственным осям - x, y, z. Вычислим длину суммарного вектора ускорения (зелёная стрелка)1:

Длина суммарного вектора вычисляется по следующей формуле: \[ a = \sqrt{x^2+y^2+z^2} \]

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

Длину вектора будем рассчитывать с помощью собственного блока-функции под именем скаляр. Функция будет принимать три параметра - x, y и z:

Составьте выражение, которое будет вычислять длину вектора:

Чтобы добавить третье слагаемое к блоку суммирования, нажмите на image-20240317210331385 и перетащите третье слагаемое в шаблон блока:

Готовый блок-функция выглядит так:

Объявите глобальную переменную счётчик. Значение этой переменной будет служить координатой x для добавляемой к графику точки:

По событию таймера вычислим усреднённое значение ускорения и добавим новую точку к графику:

Время тестирования!

Запустите приложение. Попробуйте подвигать телефоном в разные стороны. График наглядно покажет изменение ускорения движения телефона, независимо от направления движения. Но сейчас все добавленные точки показываются на графике одновременно. Исправим это.

С помощью блока SetDomain компонента Chart можно изменить отображаемую область данных. На графике будут показываться точки, для которых выполняется следующее неравенство: \[ (счётчик - 200) \lt x \lt (счётчик + 200) \] Таким образом вместе с значением счётчика будет меняться отображаемая область графика.

Добавьте к существующему скрипту следующий блок:

Время тестирования!

Запустите приложение. Теперь на графике будут видны только те точки, что добавлены недавно.

Проект готов.