|
Так или иначе, если разработчик хочет сделать что-то стоящее в 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". Пример кода дэки, вызывающей функцию: <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN" "http://www.phone.com/dtd/wml11.dtd" > <!-- WMLScript / Deck Interaction Example --> <wml> <card id="start"> <do type="accept" label="Start"> <go href="#GetPosition"> <setvar name="col" value="" /> <setvar name="value" value="" /> <setvar name="row1" value="1,2,3,4,5" /> <setvar name="disrow1" value="> 0 0 0 0| 0" /> </go> </do> <p> Welcome to the data entry example. Press "start". </p> </card> <card id="GetPosition"> <do type="accept" label="OK"> <go href="#GetValue"/> </do> <p> Column (1 - 4): <input name="col" format="N"/> </p> </card> <card id="GetValue"> <do type="accept" label="OK"> <go href="./magic.wmls#FormRow()" /> </do> <p> Value (1 - 100): <input name="value" format="*N"/> </p> </card> <card id="DisplayResult"> <do type="accept" label="OK"> <go href="#GetPosition"> <setvar name="row" value="" /> <setvar name="col" value="" /> <setvar name="value" value="" /> </go> </do> <p> $disrow1 <br/> </p> </card> </wml> Теперь нам нужно создать собственно саму функцию. Файл magic.wmls должен находиться в той же директории, что и основной magic.wml. Объявляем в magic.wmls функцию FormRow типа external. Как раз из этой функции мы и будем взаимодействовать с WML дэкой посредствам библиотеки WMLBrouser. Библиотека позволяет нам получать и устанавливать значения переменных в WML документе прямо из функции.
Следующий модуль объявляет внешнюю функцию, которая получает переменные из дэки (в нашем случае magic.wml), устанавливает переменную для дэки дисплея , указывая на отоброжаемую на дисплее дэку, и затем обновляет дисплей пользователя. Код модуля: /************************************************** 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; WMLBrowser.setVar ("disrow1", "You entered col " + col + " and value " + val ); WMLBrowser.go ( "magic.wml#DisplayResult" ); WMLBrowser.refresh(); } Обратите внимание, что операторы в WML дэке - все в нижнем регистре: <setvar name="col" value /> Присваивать значение переменной через WMLBrouser нужно следующим образом: WMLBrowser.setVar("col", ""); Теперь , когда мы увидели основные взаимодействия, давайте добавим к функции манипулирование с строками. Спецификация WMLScript включает библиотеку String которая, среди других особенностей, позволяет Вам обрабатывать переменную как одномерный массив строки. Всё, что Вам надо сделать - это обозначить текстовый разделитель, чтобы выводить строку на дисплей в форматированном виде. В конечном счёте, нам нужно вставить значение, введённое игроком, в массив, и при том, чтобы в массиве это значение содержалой именно в той позиции, значение которой задал игрок. Следующий кусок кода показывает - как мы будем вычислять индекс в массиве и помещать туда нужное значение. Пока мы пропустим преобразование в колонки, и просто будем вносить значения в массив элементов, начиная с нулевого значения. /************************************************** 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(); }
Источник: Kevin Sharp Views: 293
 Be first to comment this article | | |