Оглавление "Программирование для игр"

Одно из преимуществ визуального программирования состоит в том, что оно позволяет перейти к решению практических задач без необходимости изучать язык программирования, как это мы увидели на предыдущем занятии. Но его главный недостаток – проблемы с реализацией. Команда из 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 является то, что он поставляется с десятками примеров по использования различных функций, начиная от примеров создания интерфейсных элементов и заканчивая примерами работы с камерой, беспроводной связью, мультимедиа, датчиками, графикой, простыми играми и др. Не скажу, что данный инструмент является мечтой разработчика, но в сравнении с альтернативами продукт интересный.