Авторизация
×

Логин (e-mail)

Пароль

Интерактивные истории, текстовые игры, квесты и визуальные новеллы
Гиперкнига

Библиотека    Блог

Элементы интерфейса. Экранная клавиатура

Борис Семёнов (Morych), 09.06.13 | Практика ASM

Экранная клавиатура предназначена для ввода пользователем какой-либо последовательности символов. Конечно, в ASM для этих целей есть специальный макрос input, который отображает текстовое поле ввода. Однако экранная клавиатура по сравнению со стандартным средством обладает некоторыми особенностями.

Во-первых, используя рассматриваемый элемент управления, мы можем ограничить длину вводимой последовательности и задать диапазон разрешённых символов (например, только цифры или буквы русского алфавита).

Во-вторых, экранная клавиатура может содержать нестандартные символы (любые символы Юникода). Разумеется, при должном усердии те же символы мы можем ввести и в стандартное текстовое поле. Но нажать символ на экране гораздо проще.

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

А вот и полный код тестовой истории:

:: StoryTitle
Элементы интерфейса. Экранная клавиатура

:: Start
<<set $result = "">>
<<set $maxLength = 8>>
<<random $code = 999999>>
<<set $code = $code + "">>
<<set $len = 6 - $code.length>>
<<loop $len>>
    <<set $code = "0" + $code>>
<<endloop>>
[[Тест]]

:: Тест
<<set $passage = "Тест">>
<<set $okPassage = "Результат">>
===''Экранная клавиатура''===
----
===Введите код доступа.===
<<display "ЭкраннаяКлавиатура">>
//Сердце вам подсказывает, что нужно ввести «<<print $code>>»...//

:: ЭкраннаяКлавиатура
<<if $result.length gt $maxLength>>
    <<set $result = $result.substr(0, $maxLength)>>
<<endif>>
<<set $len = $maxLength - $result.length>>
<<set $screen = "">>
<<loop $len>>
    <<set $screen = $screen + "&nbsp;">>
<<endloop>>
==={{{''|__<<print $screen + $result>>__|''}}}===
===[[{{{1}}}|Обновить {$result = $result + "1"}]]{{{ | }}}[[{{{2}}}|Обновить {$result = $result + "2"}]]{{{ | }}}[[{{{3}}}|Обновить {$result = $result + "3"}]]<<br>>[[{{{4}}}|Обновить {$result = $result + "4"}]]{{{ | }}}[[{{{5}}}|Обновить {$result = $result + "5"}]]{{{ | }}}[[{{{6}}}|Обновить {$result = $result + "6"}]]<<br>>[[{{{7}}}|Обновить {$result = $result + "7"}]]{{{ | }}}[[{{{8}}}|Обновить {$result = $result + "8"}]]{{{ | }}}[[{{{9}}}|Обновить {$result = $result + "9"}]]<<br>>[[{{{C}}}|Обновить {$result = $result.substr(0, $result.length - 1)}]]{{{ | }}}[[{{{0}}}|Обновить {$result = $result + "0"}]]{{{ | }}}[[{{{→}}}|Обновить {$passage = $okPassage}]]===

:: Обновить
<<clrscr>>
<<display $passage>>

:: Результат
===''Экранная клавиатура''===
----
<<if $result eq $code>>
    <<style 'sepia'>>
    ===Доступ разрешён!===
<<else>>
    <<style 'dark'>>
    ===Доступ запрещён!===
<<endif>>

Вводимый текст хранится в объекте $result. Нажимая кнопку экранной клавиатуры, мы прибавляем к объекту $result соответствующий символ. Кнопка «С» удаляет последний символ вводимой строки. Физически мы заносим в строку $result её же подстроку начиная с первого символа и длиной на единицу меньше длины самой строки. При нажатии кнопки со стрелкой читатель окажется на параграфе, название которого содержится в объекте $okPassage.

До вызова параграфа ЭкраннаяКлавиатура нужно задать максимальную длину вводимой строки в объекте $maxLength и название параграфа, на котором отображается клавиатура, в объекте $passage. В начале параграфа ЭкраннаяКлавиатура мы сравниваем длину строки $result с максимальной длиной вводимой строки и, в случае превышения максимума, оставляем только заданное количество символов. Затем в объект $screen заносим количество неразрывных пробелов равное разности максимально-допустимой длины и текущей длины строки $result. Если мы теперь выведем строку $screen перед строкой $result, вводимые пользователем символы будут выровнены по правому краю относительно дисплея нашего кодового замка.

Правильный код доступа генерируется случайно и содержится в объекте $code. При этом, если код выпадет меньше 100000, мы дополняем его нулями слева до шести знаков. Обратите внимание, что макрос random возвращает целое число. Чтобы обратиться к свойству length, которое вернёт количество символов, нужно предварительно преобразовать значение объекта $code в строку. Делается это просто добавлением к объекту пустой строки.

Итак, до вызова параграфа ЭкраннаяКлавиатура устанавливаем значения объектов:
$result = "" (вводимая строка);
$maxLength = 8 (максимальное число символов вводимой строки);
$passage = "Тест" (имя параграфа, на котором показываем клавиатуру);
$okPassage = "Результат" (имя параграфа, отображаемого по завершении ввода).

Чтобы организовать любую другую клавиатуру, просто добавьте необходимое количество ссылок-кнопок, заменив «X» на требуемый символ:

[[{{{X}}}|Обновить {$result = $result + "X"}]]

Комментарии: 4.

Профиль


Закрыть

Показать все комментарии

Евгений Туголуков (Korwin)
09.06.13 06:13

Полезная штука, Борис! Главное, универсальная! Спасибо!
Morych
09.06.13 17:17

Всегда пожалуйста! :)
Вячеслав Добранов
09.06.13 19:36

Так же можно ввести код неразрывного пробела Alt+0160. Правда, только в Windows.

Для того, чтобы оставлять комментарии, необходимо зарегистрироваться и подтвердить в профиле указанный e-mail адрес.

При использовании любых материалов блога обязательно указание ссылки на источник