Так или иначе, если разработчик хочет сделать что-то стоящее в WMLScript , ему прийдётся использовать библиотеки, встроенные в спецификацию WAP 1.1
В WAP 1.1 встроено шесть стандартных библиотек, таких как преобразование булевских, целых и обычных переменных (LANG); операции с плавающей точкой (FLOAT); операции со строками (STRING); манипуляции с абсолютными и относительными URL (URL); взаимодействие с WML броузером (WMLBrowser) и пара основных функций интерфейса пользователя (DIALOGS).
Далее надо уяснить несколько важных концепций на примере игры "magic square" , в которой игрок помещает целые числа в квадратную матрицу, следя за тем, чтобы сумма чисел в столбцах равнялась сумме в строках. Итак, создадим WML документ и назовём его magic.wml. Он будет содержать весь интерфейс пользователя и собственно логику игры. А так же создадим второй файл magic.wmls, в котором будут содержаться все вычисления.
Для начала мы должны описать взаимодействие между основными элементами пользовательского интерфейса и функциями WMLScript. ( ПОМНИТЕ: WML и библиотечные функции WMLScript чувствителены к регистру ). Вызывая функцию скрипта из WML документа, Вы можете влиять на контекст документа прямо из функции посредством стандартных библиотек WML браузера. Давайте создадим дэку (card deck) , которая сперва будет спрашивать у игрока позицию и значение целого числа, которое будет помещено в массив, который будет представлять одну строку игрового поля, а затем будет вызывать функцию, для того, чтобы положить этот элемент в массив. Обратите внимание, что когда игрок нажмёт кнопку "OK", чтобы ввести значение, то наша дэка вызовет функцию FormRow , находящуюся в "./magic.wmls". Здесь пример кода дэки, вызывающей функцию.
Теперь нам нужно создать собственно саму функцию. Файл magic.wmls должен находиться в той же директории, что и основной magic.wml. Объявляем в magic.wmls функцию FormRow типа external. Как раз из этой функции мы и будем взаимодействовать с WML дэкой посредствам библиотеки WMLBrouser. Библиотека позволяет нам получать и устанавливать значения переменных в WML документе прямо из функции. Полный список функций WMLBouser можно посмотреть здесь.
Следующий модуль объявляет внешнюю функцию, которая получает переменные из дэки (в нашем случае magic.wml), устанавливает переменную для дэки дисплея , указывая на отоброжаемую на дисплее дэку, и затем обновляет дисплей пользователя. Код модуля здесь. Обратите внимание, что операторы в WML дэке - все в нижнем регистре:
Код:
<setvar name="col" value />
Присваивать значение переменной через WMLBrouser нужно следующим образом:
Код:
WMLBrowser.setVar("col", "");
Теперь , когда мы увидели основные взаимодействия, давайте добавим к функции манипулирование с строками. Спецификация WMLScript включает библиотеку String которая, среди других особенностей, позволяет Вам обрабатывать переменную как одномерный массив строки. Всё, что Вам надо сделать - это обозначить текстовый разделитель, чтобы выводить строку на дисплей в форматированном виде. Более детальное опасание функций библиотеки String здесь.
В конечном счёте, нам нужно вставить значение, введённое игроком, в массив, и при том, чтобы в массиве это значение содержалой именно в той позиции, значение которой задал игрок. Следующий кусок кода показывает - как мы будем вычислять индекс в массиве и помещать туда нужное значение. Пока мы пропустим преобразование в колонки, и просто будем вносить значения в массив элементов, начиная с нулевого значения. А вот преобразовывать будем в следующей статье, посвящённой библиотеке Lang.
Код:
/**************************************************
FormRow
This function takes one new value/coordinate pair and
inserts it in its proper line.
**************************************************/
extern function FormRow () {
var col = WMLBrowser.getVar ("col");
var val = WMLBrowser.getVar ("value");
var row1vals = WMLBrowser.getVar ("row1");
var localdisrow;
var localrowvals;
row1vals = String.insertAt(row1vals, val, 0, ",");
WMLBrowser.setVar ("disrow1", row1vals);
WMLBrowser.setVar ("row1", row1vals);
WMLBrowser.go ( "magic.wml#DisplayResult" );
WMLBrowser.refresh();
}