- "да" - подтверждение действия
- "НОМЕР" - нажать на элемент #НОМЕР
- "НАЗВАНИЕ ТОВАРА" - поиск товара по названию и описанию
- "написать ФРАЗУ" - вводит ФРАЗУ в поле ввода
- "вниз | вверх | в начало | в конец" - прокрутка страницы
- "закрыть" - закрыть меню каталога
- "назад | вперед" - переход на предыдущую/следующую страницу
Приложение ”Умный игральный кубик”
Оглавление "Программирование для игр"
Одно из преимуществ визуального программирования состоит в том, что оно позволяет перейти к решению практических задач без необходимости изучать язык программирования, как это мы увидели на предыдущем занятии. Но его главный недостаток – проблемы с реализацией. Команда из 3-4 разработчиков может создать визуальную платформу, но осуществлять её полное тестирование они физически не имеют возможности. В результате на выходе получаются вечные бета-продукты, при помощи которых можно решить немало задач, но далеко не все.
На прошлом занятии мы сделали приложение для имитации броска одной игральной кости d6. Думаю, у многих возникло желание сделать его более функциональным, чтобы можно было использовать несколько костей с разными гранями, добавить 3D-анимацию кубиков, объёмный звук и прочее. Получится ещё одно навороченное приложение с недостатком, который есть у десятков подобных решений – необходимость располагать смартфон в пределах досягаемости руки и постоянно нажимать пальцем на экран. Для устранения этого недостатка сделаем приложение с голосовым управлением.
Задача: создать приложение для имитации броска игрального кубика d6 при помощи голосовой команды. При этом режим голосового ввода должен работать постоянно и без сигналов начала и окончания распознавания.
В качестве голосовой команды можно использовать, например, слово “бросок”. Но мы пойдём дальше и в самой голосовой команде будем указывать нужное число граней, например, при команде “d6” будет брошен кубик с шестью гранями, а при команде “d20” – с двадцатью. Недостаток данного подхода заключается в необходимости следить за тем, чтобы игроки давали правильную команду (если вы будете играть с кем-то ещё), что потребует впоследствии добавления механизма защиты от ввода некорректной команды.
Thunkable X имеет все необходимые компоненты и блоки для создания такого приложения, но баги не дадут это реализовать. Приходится искать бросать клич: “Але, на базе, есть кто это может?”. Есть, но только для Android – DroidScript, где придётся использовать кодирование на JavaScript. Но вы же обещали без кода? Увы, визуальное программирование бессильно перед поставленной задачей. Если с распознаванием команд многие справляются без труда, то о постоянном прослушивании эфира и без сигналов можно только мечтать. Но, как настоящие программмисты, мы скопируем 99% кода из готового примера.
Из магазина приложений Google Play установите на смартфон DroidScript и запустите его.
В панели управления нажмите кнопку с символом ракеты. На вкладке Samples найдите пример Voice Command и запустите его. Откроется приложение, в котором нужно произнести одну из указанных в списке команд. Работает? Отлично, но, к сожалению, постоянно слышны сигналы готовности к голосовому вводу и окончания распознавания. Когда-то при помощи параметра NoBeep их можно было отключить, но после многочисленных обновлений что-то пошло не так и приходится брать в руки лом – выключать громкость перед воспроизведением сигналов и включать её обратно для сообщения результата. Нет, конечно, можно было бы написать запрос разработчику, и поинтересоваться, будет ли исправлен данный баг. Но нам приложение нужно сейчас, а не через час.
DroidScript имеет свой редактор и отладчик для разработки приложений на устройстве, но удобнее это делать в браузерной среде разработки. Для этого в панели управления нажимаем значок Wi-Fi и полученный адрес копируем в адресную строку браузера. Открывается среда разработки.
Создайте новое приложение (пиктограмма New JavaScript) и скопируете в область редактора следующий код, как показано на рисунке выше.
var oldVolume = null; // старое значение громкости сигнала телефона function OnStart() // при старте приложения { app.SetDebugEnabled(false); // отключаем вывод отладочной информации app.EnableBackKey(false); // отключаем действие по умолчанию для системной кнопки Back speech = app.CreateSpeechRec("NoBeep,Parxtial") // создаём объект распознавания речи speech.SetOnResult( speech_OnResult ) // обработчик успешного распознавания speech.SetOnError( speech_OnError ) // обработчик ошибок oldVolume = app.GetVolume(app); // запоминаем текущее значение громкости app.SetVolume(speech,0.5); // установка громкости звука на 50% app.TextToSpeech( "Говорите", 1, 1.5, Listen ) // воспроизведение текста } function Listen() // включаем прослушивание эфира { app.SetVolume(speech,0); // выключаем громкость для подавления сигнала включения режима speech.Recognize(); // включаем режим распознавания речи } function say(text){ app.SetVolume(speech,0.5); app.TextToSpeech( text, 1, 1.3, Listen ); } function speech_OnResult( results, partial ) { var cmd = results[0].toLowerCase() // голосовые данные app.ShowPopup(cmd); // всплывающая подсказка для контроля данных if( cmd[0] == "д" || cmd[0] == "d" ) // произнесли команду, а не что-то ещё { var limit = parseInt( cmd.match( /\d+/ ) ); // получаем число из строки cmd = Math.ceil( Math.random() * limit ); // возвращает случайное целое из диапазона var timerId = setTimeout(say, 600, cmd); // задаржка для подавления сигнала распознавания } else { speech.Recognize() } } function speech_OnError( error ) // обработка ошибок при распознавании { if( !speech.IsListening() ) speech.Recognize() } function OnPause() // переход приложения в фоновый режим { app.SetVolume(speech, oldVolume); } function OnResume() // активация приложения (переход из фонового режима) { app.SetVolume(speech, 0); } function OnBack() // выход из приложения по системной кнопке Back { app.SetVolume(speech, oldVolume); // восстанавливаем громкость app.Exit(); }
По команде Alt + R запускаем приложение на устройств и даём команды "д6", "д100". Мобильные устройства туповаты, да и глуховаты, поэтому стараемся говорить внятно и четко.
Если вы хотите установить приложение, то для генерации файла приложения в DroidScript необходимо приобрести недорогой плагин DroidScript Apk Builder. В противном случае приложение можно запускать из оболочки DroidScript.
Одно из существенных преимуществ DroidScript является то, что он поставляется с десятками примеров по использования различных функций, начиная от примеров создания интерфейсных элементов и заканчивая примерами работы с камерой, беспроводной связью, мультимедиа, датчиками, графикой, простыми играми и др. Не скажу, что данный инструмент является мечтой разработчика, но в сравнении с альтернативами продукт интересный.