Полный и подробный обзор язык Mobile Basic, рассмотрены все операторы, принципы программирования, основы языка, его конструкции, работа с графикой (в том числе со спрайтами и картами), обработка нажатий клавиш, функции ввода-вывода, обработка ошибок.

Было дело, в народных массах появился первый бытовой компьютер. Было дело, нашелся фанатик, настрочивший первый примитивный язык программирования для этой хитрой коробочки с клавишами. И с того времени компьютерный мир понесся к своим нынешним вершинам, набирая и набирая обороты. Вслед за Бейсиками появлялись Паскали, Си и иные языки программирования. Менялись концепции, рождались новые интерфейсы, выходили на компьютерный "подиум" новейшие операционные системы. Все это было, все это давало жизнь целым индустриям. Одна индустрия стала столь обворожительной, что собрала под своим крылом как создателей компьютерных игр, так и просто любителей поиграть в последние игровые хиты.

"Ох, - с горестью вздыхает современный сирота-игроделатель, - как просто было раньше". И действительно, а ну-ка попробуй померяйся силой с нынешними монстрами в разработке игр, если сам ты один-одинехонек как программист. А ну-ка попробуй создать привлекательный продукт, если обычные Пакманы, Монтезумасы и Болдердэши уже не в ходу. Всем подавай Диаблы, Думы или Халф-лайфы. И поэтому нет предела печали одиноких фанатов игроделания, ибо смысл в их существовании как нужной кому бы то ни было единицы исправился полностью.

Теперь другая история. Было дело, в народных массах появился первый мобильный телефон. Было дело, нашелся фанатик, настрочивший первый примитивный язык программирования для этой хитрой ... Стоп! Больно знакомый сюжет, чуть ли не "де-жа-вю" (однажды виденное). Кажется, финал истории известен заранее. Так вот чтоб опять не оказаться в роли вздыхающего сироты, будем думать. Есть над чем, поскольку в общем доступе появился Бейсик для создания программ под мобильные телефоны. Если не успели осмыслить сказанное, поясняю: жизнь дает "сиротам" еще один шанс к созданию Пакманов, Монтиков и прочей древности, пока дело не дошло до сложнейших игровых систем. В общем, будущие кумиры телефонного игрового мира, соображаете, о чем речь?

Срочно двигайте на сайт разработчиков этого полезного творения:http://www.mobilebasic.com/, ищите там раздел "Download" и немедля качайте Бейсик (примерно 16,8 Мбайт), пока вас не опередили (Можно никуда не ходить, а заглянуть в раздел"СОФТ" нашего сайта.). А мы, также немедля, перейдем к его рассмотрению. И начнем в первую очередь с программных вопросов, отчего вы сразу поймете, что торопиться нужно офигительно, как поется в песенке, "скорый поезд набирает ход". Кто не успел, тот к бабушке не едет. Вот!

А с успевшими занять лучшие места мы в следующий раз рассмотрим, как работать с Бейсиком и как писать что-то более продвинутое, потому как свято место пусто не бывает, и если прогрессивному не научимся мы, вместо нас это сделают другие.

Язык программирования Mobile Basic

Mobile BASIC 2.0 (март 2004 года) – это язык программирования для современных мобильных телефонов и PDA (так называемых карманных компьютеров или, в простонародном жаргоне, наладонников), поддерживающий спецификации MIDP-1.0 / CLDC-1.0, то есть мидлеты J2ME - это такие откомпилированные приложения, способные выполняться на телефонах. Возможности Бейсика, а в общем-то в комплекте находится вполне солидная по меркам "телефонного" ПО среда разработки приложений, плюс прилагающихся к нему сервисов все-таки достойны внимания. Самое в наших условиях главное – это, конечно, наличие сервисов по так называемой немедленной OVER-THE-AIR (через расстояние) установке написанных вами мидлетов на чужие телефоны. В традиционном варианте загрузка мидлетов в телефон предлагается с помощью соответствующего кабеля и программного обеспечения, поставляемого с телефоном.

Однако мы не те люди, чтобы позволить всучить нам при покупке телефона какие-то "лишние" провода, еще и компакт-диск. Да и то большая редкость, чтобы в наших салонах мобильной связи предлагалось что-то больше в комплектации, чем просто телефон с книжечкой и гарантийным талоном. Когда же возникает желание "усовершенствовать" свой телефон новым софтом (чаще всего имеются в виду игры), на помощь приходит установка OVER-THE-AIR. Короче говоря, некоторый программист пишет новую игру и кладет ее, допустим, на свой сайт. Пользователь, заходя с телефона на сайт программиста, можете закачать игру сразу же в свой телефон, и ни какой нервотрепки.

Все это, разумеется, достигается специальным бесплатным сервисом, называемым MIDlet Uploader. Такой сервис предоставляет домашняя страница мобильного Бейсика, но если есть желание поставить Uploader у себя на сайте, они же предлагают вставить в тело вашей страницы следующий HTML-код:

<IFRAME SRC=http://www.mobilebasic.com/MIDletUploader.jsp
WIDTH=468 HEIGHT=60 SCROLLING=NO
MARGINWIDTH=0 MARGINHEIGHT=0 FRAMEBORDER=0 VSPACE=0 HSPACE=0>
<A HREF=http://www.mobilebasic.com>Выгрузка мидлета</A>
</IFRAME>

Собственно, их сервис тогда будет выполняться в кусочке окна вашей страницы. Суть работы Uploader-а заключается в следующем. Написав программу, программист в мобильном Бейсике может сохранить ее в виде JAD- и JAR-файлов. Вот эти файлы с помощью Uploader-а и выгружаются на сервер Mobile BASIC. Сервер тут же создает из них WAP/WML-файлы, подключившись к которым с помощью телефонного WAP-браузера у владельца телефона появляется на экране опция для установки этого файла в телефон. Вот так программа и закачивается в телефон "через расстояние".

Ну а если такой путь неудобен (мало ли, вдруг используете в программе какие-то авторские алгоритмы или она у вас коммерчески ценная и не хотелось бы "WAP-компилировать" ее где-то на стороне, да и просто вдруг сервис сейчас бесплатный, а завтра в мгновение ока станет платным), то придется пользоваться софтом типа Oxygen Phone Manager, способным выгружать/сгружать мидлеты с компьютера на телефон через кабель, либо искать другие утилиты, чтобы компилировать WML-файлы прямо у вас на компьютере. В общем, было бы желание, найти все можно.

Другие возможности Mobile Basic-а

Итак, наличие путей к загрузке программы в телефоны увидели. Это самое главное, ибо что толку, если наше творение не смогут оценить другие любители телефонного софта. Теперь попробуем увидеть наличие путей к изощрению программ, так как простым Print "Привет мир!" никого уже не удивишь.

Помимо уже известной возможности создавать мидлеты, существует равнозначный потенциал к созданию Web-аплетов (приложения для Web-страниц), а также разработки приложений, способных связывать телефон с удаленными интернет-серверами. Не менее важно, что реализованы средства контроля над ошибками, то есть ловушки ошибок, чтобы предупреждать алгоритмические сбои в работе программы. Далее идут довольно неплохие в рамках "телефонного" программирования средства управления просто графикой, затем спрайтовая графика с определением столкновений. Это как нельзя кстати пригодится для анимации и игр. Имеются интегрированными: графический редактор, редактор карт и плиточных изображений, а также редактор Nokia Ring Tone, то бишь тональных мелодий для телефонов Nokia. Поддерживаются четыре типа данных: Integer, Long, String и Float. Наличествуют логарифмические и тригонометрические функции. Поддерживается подсветка синтаксиса. Формы с масштабными, текстовыми, списочными элементами, изображениями, датой и временем. Окна предупреждений (alert box). Даже есть произвольный доступ к файлам, причем файлы могут сохраняться и в самом телефоне. Возможности работы со звуком и некоторые другие, уже более мелкие возможности.

Приятно удивило, что Бейсик включает много команд для написания именно телефонных игр, причем процесс разработки программ хорош тем, что не требует высоких стартовых знаний в области мобильных телефонов. А присутствие нормального списка функций для работы с числами с плавающей запятой, безусловно, открывает дорогу телефонным программам офисного класса. Не Word-ы и не Excel-и, разумеется, но всякие органайзеры, напоминалки, и прочие такие "учетно-расчетные" вещи в скором времени, возможно, будут странствовать по телефонам в широком спектре реализаций. Если еще приложить к этому умелое употребление функций связи с удаленными серверами, глядишь, не за горами бум многопользовательских сетевых телефонных приложений.

О регистрации Mobile Basic-а

Мобильный Бейсик – вовсе не бесплатная программа и распространяется в соответствии с доктриной пробного пользования. Пробная (trial) версия полностью функциональна, однако ограничивает размер создаваемых для мобильных телефонов мидлетов и Web-аплетов до менее чем 1 килобайта исходного кода. Хотя на запуск программ в среде разработчика (то есть на компьютере) такие ограничения не накладываются. Так что в случае, когда ваш исходный код не умещается в 1 килобайт, точно придется покупать Бейсик, потому как иначе работу вашей программы будете лицезреть только вы, и то лишь на экране монитора. Впрочем, на примитивные примеры 1 килобайта должно хватить, так что очень даже реально хотя бы в общих чертах оценить, насколько производительно выглядят те или иные действия вашей программы на экране мобильного телефона. Как пример, прежде чем засесть за планомерное создание очередного игрового шедевра, стоит поэкспериментировать, как быстро (или как программно-ресурсо-человеко затратно) будет выглядеть планируемое решение. Килобайта на эксперименты как раз должно хватить. Как говорится, и молока испробовать и грудь ощупать.

Что касается регистрационных моментов, здесь они продуманы необычно. По сложившимся правилам определяются три вида Бейсика: незарегистрированная, пробная и зарегистрированная версии. Незарегистрированная версия запускается не более 30 раз, после чего потребуется регистрация. Пробная версия вроде как должна работать всегда и с полным спектром возможностей, просто не дает сохранить мидлеты или Web-аплеты с размером исходного кода более 1 килобайта. Регистрированная версия, как можно догадаться, избавлена от всех недостатков. И все же есть интересный нюанс. Регистрационный код приобретается в известном порядке и считается правомочным в течение последующих 12 месяцев. Код гарантирует бесплатные обновления на весь этот период. Однако после истечения года эксплуатации последующие обновления уже предоставляются только в платном порядке, благо, за меньшую стоимость. Либо пользуйте старую версию, либо копите денежку на обновления до новых версий.

Общие положения языка

Программа, написанная на мобильном Бейсике, ничем особым не отличается от программ, написанных в других Бейсиках. Точно также программа состоит из ряда строк, а каждая строка может содержать одну или более программных инструкций. Если в одной строке находится несколько инструкций, все они разделяются символами двоеточия ":". Инструкция может состоять из команд, функций, переменных, констант и операторов.

Команды используются для того, чтобы сообщить Бейсику, что собственно он должен делать. Так, например, команда Print указывает ему, что в этот момент нужно вывести на экран некоторый текст, значение указанной переменной или нечто другое.

Функция – в принципе та же команда, но только функция всегда после себя возвращает определенное значение, зависящее от входных параметров функции. Возвращаемое значение передается в то места исходного кода, где функция вызывалась, что в определенном смысле позволяет ассоциировать функцию с динамической переменной, причем динамика изменений значения такой "переменной" определяется исключительно входными параметрами функции. В свою очередь входными параметрами могут быть переменные, константы или целые выражения. К примеру, переменная S$ после инструкции S$ = "Итого: " + Str$(3+4) будет содержать значение "Итого: 7", так как функция Str$ на основе входного выражения 3+4 возвратит после себя текстовое значение "7", которое затем будет добавлено к текстовой константе "Итого: ".

Переменная является обладающим собственным именем "контейнером", в котором могут быть сохранены значения соответствующего типа. Чтобы уяснить суть понятия переменной, вспомните действие кнопки "Память" обычного калькулятора. При нажатии этой кнопки число на экране калькулятора сохраняется в памяти. Потом это число при необходимости можно извлечь из памяти и поместить обратно на экран калькулятора. Память калькулятора как раз и есть той самой переменной (контейнером), где временно сохраняется нужное значение, только в Бейсике можно использовать не одну переменную, а множество разных, определив для них разные имена. А имена переменных всегда должны начинаться только с букв (от английского A до английского Z). То есть первый символ имени переменной всегда является буквой, но все последующие символы могут быть как буквами, так и цифрами. Допускается между символами имени переменной вставлять символ подчеркивания, имитируя при необходимости пробел. Все другие символы использовать в имени переменной запрещается. Кроме того, имена переменных, как, впрочем, и названия самых обычных функций и команд Бейсика, не чувствительны к регистру букв, поэтому имена типа "TEST", "Test" и "test" ссылаются на одну и ту же переменную.

Переменные могут быть разных типов, что указывается специальным символом сразу за именем переменной. Если за именем следует символ "%" (процент), тогда переменная предназначена только для хранения целочисленных значений типа Integer – целые числа со знаком, например, 1, 4, 16, -5 и так далее. Если за именем следует символ "#" (решетка), переменная хранит длинные целочисленные значения со знаком типа Long. Если за именем следует символ "$" (доллар), переменная хранит строковые значения типа String. Если за именем не следует ни одного из трех приведенных символов, тогда эта переменная хранит значения с плавающей запятой типа Real.

Естественно, переменная содержит помещенное в нее значение до тех пор, пока в эту переменную не будет помещено новое значение. В дополнение программисту нужно следить за корректностью обращения к переменным внутри исходного кода ввиду наличия четырех разных типов значений, так как имена X%, X#, X$ и X обращаются к четырем разным переменным, ведь в этих именах обозначены совершенно разные типы сохраняемых значений.

Константой называется безымянное значение, данное в момент написания программы и которое невозможно изменить в процессе ее работы. Как и в случае переменных, имеется четыре типа констант: целочисленные константы со знаком, длинные целочисленные константы со знаком (в конце помечаются символом решетки: 3142#), константы с плавающей точкой (3.142) и строковые константы ("Привет").

Операторами, как правило, называют самые тривиальные операторы математического языка, среди которых плюс, минус, умножить и так далее. Правда, Бейсик обладает не только математическими операторами, но и логическим (операторы сдвига значений), условными (операторы сравнения) и некоторыми другими.

Переходы между инструкциями в бейсике

Все написанные в мобильном Бейсике программы начинают исполнение исходного кода с первой строки, затем последовательного продвигаясь по строкам вниз. В некоторый момент может понадобиться пропустить часть строк и перейти на какую-то другую, выделенную строку. Такой переход может быть безусловным или, если он осуществляется при помощи оператора If, условным. Поскольку допустимо не указывать в начале строк их номера, то для операции переходов между строками необходимо иметь определенный механизм маркировки выделенной строки, на которую выполняется переход. Такой механизм существует и реализуется он методом проставления уникальных меток у всех выделенных строк. Метка всегда начинается с буквенного символа от A до Z (далее могут быть любые буквенно-цифровые символы и символы подчеркивания) и завершается символом двоеточия ":". За меткой в строке более не должна находиться ни одна инструкция. Все они пишутся на следующей строке, сразу после метки. Переход на выделенную строку осуществляется из любого места программы командой Goto, указав сразу за ней наименование метки (двоеточием завершать имя метки уже не нужно). Вот пример использования метки:

startLabel:
   Input "Введите число больше 0: ", A%
   If (A% <= 0) Then Goto startLabel
   Print "Вы ввели число " + Str$(A%)
   Goto startLabel

Еще существует команда Gosub, за которой также указывается имя метки. Но в этом случае осуществляется не безусловный или условный переход, а вызов так называемой подпрограммы – отделенного от основной программы участка кода, после исполнения которого управление опять возвращается на следующую после команды Gosub инструкцию. Естественно, чтобы указать окончание кода подпрограммы, используется специальная команда, и пишется она как Return, в то время как команда окончания кода основной программы пишется как End.

   Print "Вас приветствует"
   Gosub printName
   Print "Вот так вот!!!"
   End

printName:
   Print "мобильный Бейсик"
   Return

Кроме этого имеются еще две команды, оперирующие метками. Одна – Restore, другая - Trap. Последняя команда указывает ту строку, на которую уйдет управление в случае возникновения непредвиденных алгоритмических ошибок, как, например, попытка деления на нуль, ошибки при работе с файлами или удаленными серверами и другие ошибки. Примечательно, что при помощи Trap можно определять совершенно разные помеченные метками так называемые обработчики ошибок. То есть для одного участка программы можно указать, что в случае возникновения ошибки управление получит обработчик с такой-то меткой, для другого участка программы – обработчик с другой меткой. Если на заданном участке программы нужно вообще запретить контроль ошибок, для этого предназначена конструкция Trap Off.

restart:
   Trap handleError
   Input "Введите имя: ", N$
   Print "Спасибо вам, " + N$

   Trap Off
   ...
   ...
   End
handleError:
   Print "Что-то введено неверно!"
   Goto restart

Кстати, коль уж в примерах употребляется команда Print, необходимо упомянуть сразу об одном нюансе. Дело в том, что команда Print на самом деле может использоваться только в отладочных целях в пределах среды разработки. В настоящий момент она просто не поддерживается мидлетами или Web-аплетами, сгенерированными в мобильном Бейсике. Вместо нее должна использоваться команда DrawString, отнесенная в раздел графических команд.

Графические команды Mobile Basic-а

И чтоб уж не приводить чуть ли не всю родословную команд мобильного Бейсика, будем рассматривать только самые интересные игроделателям команды. А делать это будем блоками и весьма упрощенно, тем более что увлеченные программисты докопаются до невскрытых тонкостей быстро, и пальцами не успеют "моргнуть".

А начнем мы с графики, с нее, родной. Потому что в отсутствие таковой игры на мобильниках станут сродни игре "Хаммурапи". Современные игроки, поклонники "ласковых" DOOM-подобных персонажей, вероятно, не догадываются, что давным-давно их старшие товарищи рубились в эту "ужасно агрессивную" игру на символьных дисплеях прошлого века. Вот также без графики телефон годится только для клонов "Хаммурапи", а такие "страшилки" по определению нынешних игроков уже не прельстят. Итак, переходим к графическим командам.

Blit fromX, fromY, width, height, toX, toY – Копирует прямоугольную область экрана, определяемую координатами (fromX, fromY, width, height) в область с координатами (toX, toY). Эта команда может использоваться для выполнения прокрутки экрана. Например, нужно прокрутить экран на 1 линию влево:

W% = ScreenWidth() H% = ScreenHeight() Blit 0, 0, W%, H%, -1, 0

Cls – Очищает содержимое экрана.

DrawArc x, y, w, h, startAngle, arcAngle – Рисует дугу (или сектор круга) на экране. Команда принимает шесть аргументов, определяющих рисуемую на экране дугу. Дуга рисуется текущим установленным цветом.

DrawLine fromX, fromY, toX, toY – Рисует линию от точки с координатами (fromX, fromY) до точки с координатами (toX, toY). Линия рисуется текущим установленным цветом.

DrawTo x, y – Рисует линию от последней нарисованной точки до точки с координатами (x, y). Линия рисуется текущим установленным цветом.

DrawRect x, y, w, h – Рисует на экране прямоугольник с координатами (x, y) и шириной и высотой (w, h). Прямоугольник рисуется текущим установленным цветом.

DrawRoundRect x, y, w, h, arcWidth, arcHeight – Рисует на экране прямоугольник со скругленными углами, а величина скругления задается параметрами (arcWidth, arcHeight). Прямоугольник рисуется в координате (x, y), его ширина и высота задается через (w, h). Цвет прямоугольника равен текущему установленному цвету.

DrawString string, x, y – Печатает строку текста (string) на экране в координате (x, y). Строка печатается текущим установленным цветом. Данная команда заменяет команду Print, которая в настоящий момент не поддерживается при генерации мидлетов и Web-аплетов, хотя Print нормально выполняется в пределах среды разработки.

FillArc x, y, w, h, startAngle, arcAngle – Рисует сплошную, то есть заполненную внутри дугу (или сектор круга) на экране. Команда принимает шесть аргументов, определяющих рисуемую на экране дугу. Дуга рисуется текущим установленным цветом.

FillRect x, y, w, h – Рисует на экране сплошной, то есть заполненный внутри прямоугольник с координатами (x, y) и шириной и высотой (w, h). Прямоугольник рисуется текущим установленным цветом.

FillRoundRect x, y, w, h, arcWidth, arcHeight – Рисует на экране сплошной, то есть заполненный внутри прямоугольник со скругленными углами, а величина скругления задается параметрами (arcWidth, arcHeight). Прямоугольник рисуется в координате (x, y), его ширина и высота задается через (w, h). Цвет прямоугольника равен текущему установленному цвету.

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

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

Plot x, y – Рисует точку в координате (x, y). Точка рисуется текущим установленным цветом.

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

SetColor red, green, blue – Устанавливает текущий цвет, используемый в дальнейшем другими графическими командами. Этот цвет считается текущим до тех пор, пока он не будет заменен новым значением этой же командой. Компоненты цвета (red, green, blue) – все три – целочисленные операнды в пределах от 0 до 255 включительно. Программисту необходимо заранее определять, поддерживает ли мобильный телефон цветной экран, проверяя результат функции IsColor(). Если телефон не поддерживает цвет, тогда значение цвета должно быть задано в оттенках серого при помощи эквивалентных значений для компонентов (red, green, blue).

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

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

StringHeight ( string ) - Возвращает высоту строки указанного текста (string) в точках. Это функция, поэтому входной параметр указывается в скобках.

StringWidth ( string ) – Возвращает ширину строки указанного текста (string) в точках. Это функция, поэтому входной параметр указывается в скобках.

Спрайтовые команды

От графических команд переходим к их логическому продолжению – командам работы со спрайтами. Под спрайтами понимаются плоские кусочки изображений (нередко с прозрачными фонами), накладываемые на основное изображение и свободно перемещаемые по нему. В результате создается ощущение анимации. Таким простым образом ранее в играх создавались анимированные персонажи. Они прямо как настоящие двигаются по игровому полю, но на самом деле это двигаются над картинкой игрового поля самые обычные спрайты с нарисованными на них кадрами анимации персонажей.

DrawGel gelName, x, y - Рисует графический элемент (gelName) прямо на экране в координатах (x, y). Команда может использоваться для имитации "живого" фона под спрайтами.

GelLoad gelName, gelData - Создает графический элемент с указанным именем (gelName) и загружает в него графические данные из строки (gelData). Параметр gelName – это имя, которое будет ассоциировано с созданным графическим элементом, а параметр gelData – это строка, содержащая RAW-данные изображения в формате, приемлемом для телефонов. Как правило, это PNG-, GIF- или JPEG-данные. То есть предполагается, что содержимое gelData будет использоваться для отображения доступных в Интернете изображений.

Программа должна открыть канал для ресурса и прочитать его побайтно, добавляя каждый байт в строку с помощью функции Chr$. Как только данные будут прочитаны, они далее передаются в параметре gelData для преобразования строки в изображение.

Важно: Графические изображения могут занимать много места и способны привести к ошибкам переполнения памяти в мобильных телефонах. Как обычно, размер графических файлов уменьшают степенью сжатия. Да только реальный размер изображения внутри телефона все равно остается равным несжатому изображению. Поэтому наилучшим решением будет уменьшение физического размера (ширины и высоты) картинки до размеров экранного разрешения мобильного телефона. К примеру, несжатая JPEG-картинка 100x100 пикселей потянет за собой около 40 килобайт памяти. Такая же картинка с разрешением 300x300 пикселей – около 360 килобайт.

GelLoad gelName, resourceName - Как и предыдущая команда, эта команда создает графический элемент с указанным именем, но загружает в него графические данные из файла (resourceName), находящегося в списке ресурсов.

Графические элементы могут быть загружены из PNG-, GIF- или JPG-файлов. Причем такие типы файлов поддерживаются не всеми устройствами. Например, PNG-файлы поддерживаются абсолютно всеми мобильными телефонами, однако можно также обнаружить, что и GIF- и JPG-изображения тоже поддерживаются довольно широко, хотя и не везде. И все же если необходимо, чтобы программа безотказно работала на максимальном количестве телефонов, лучше остановиться на PNG-формате.

Если конечной целью является Web-аплет, тогда может понадобиться использовать GIF-формат, так как некоторые браузеры используют старую версию Java и не поддерживают PNG-изображений. Для добавления PNG-, GIF- или JPG-изображений в разрабатываемый проект необходимо выбрать элемент меню "Resources", щелкнуть кнопку "Add Resource" и затем найти необходимые к добавлению файлы.

Команда GelLoad принимает две строки – внутреннее имя графического элемента в программе и имя ресурса. Имя ресурса всегда такое же как имя файла, кроме пути к файлу. Так, если в список ресурсов добавлен "c:\Images\MyImage.gif", его можно загрузить в мобильном Бейсике следующим образом:

GelLoad "GelName", "MyImage.gif"

GelGrab gelName, x, y, w, h - Создает графический элемент с указанным именем (gelName) и загружает в него графические данные, взятые из прямоугольника на экране с координатами (x, y, w, h). Графические элементы сопоставляются со спрайтами командой SpriteGel. К тому же графические элементы могут быть свободно нарисованы прямо на экране при помощи команды DrawGel.

GelHeight ( gelName ) - Функция возвращает высоту указанного графического элемента в точках.

GelWidth ( gelName ) - Функция возвращает ширину указанного графического элемента в точках.

SpriteGel spriteName, gelName - Связывает указанный спрайт (spriteName) с заданным графическим элементом (gelName). Если такой спрайт еще не существует, автоматически создается новый спрайт. Спрайтовая анимация может быть достигнута сопоставлением (связыванием) спрайта с различными графическими элементами. Так, например, если в цикле вызывать данную команду, сопоставляя одному и тому же спрайту каждый раз разные графические элементы, то на экране этот спрайт будет также в цикле менять свое графическое содержимое. Кроме того, спрайт можно перемещать по экрану командой SpriteMove. Столкновения между спрайтами могут определяться функцией SpriteHit.

SpriteHit ( spriteName1, spriteName2 ) - Возвращает единицу, если два указанных спрайта перекрываются своими "телами" (набежали друг на друга), или возвращает нуль, если спрайты не перекрываются. Причем нужно помнить, что данная функция не тестирует непосредственно столкновения пикселей двух спрайтов, как это делается в более продвинутых системах при прозрачных фонах у спрайтов.

SpriteMove spriteName, x, y - Перемещает спрайт с заданным именем (spriteName) в новое местоположение с координатами (x, y).

SpritePriority spriteName, prior - Устанавливает приоритет (prior) указанного спрайта (spriteName). Чем выше приоритет спрайта, тем выше он находится над остальными низкоприоритетными спрайтами. Фактически, приоритет – это слой, на котором находится спрайт. Когда спрайты начинают двигаться по экрану, то, наблюдая общую картину как бы сверху, можно отметить, что набегающий высокоприоритетный спрайт постепенно закрывает своим "телом" нижний (низкоприоритетный) спрайт, будто в глубину экрана имеется пространство. Соответственно, спрайт с низким приоритетом находится глубже, а спрайт с высоким приоритетом – выше, то есть ближе к экрану. Однако это не трехмерный эффект и глубина здесь имеет формальное значение. Размер отображаемого спрайта не зависит от его приоритета, таким ухищрением лишь просто определяется, какой из спрайтов будет просматриваться лучше, если спрайты набегают друг на друга.

Команды карт и плиточных изображений (Tiles)

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

MapCreate nx%, ny%, cellWidth%, cellHeight%- В большинстве случаев карты будут создаваться во встроенных в среду редакторах, а затем загружаются в программу командой MapLoad. Но если понадобится создать динамически управляемую программой карту, тогда для этих целей предлагается рассматриваемая команда. Параметры (nx%, ny%) определяют размеры карты в ячейках, параметры (cellWidth%, cellHeight%) – пиксельные размеры одной ячейки.

MapGetCell ( x%, y% )- Возвращает номер плиточного изображения, сопоставленного с координатами (x%, y%) на карте.

MapHeight ( )- Функция возвращает высоту карты в точках.

MapLoad mapFilename$, tileFilename$ - Загружает карту и прилагающиеся к ней плиточные изображения. Параметр (mapFileName$) задает имя файла карты, параметр (tileFilename$) – имя файла плиточных изображений. Естественно, эти файлы создаются при помощи встроенных в среду разработки редакторов.

MapLoadTile tileNumber, gelName$ - Загружает в указанное плиточное изображение (tileNumber) содержимое заданного графического элемента (gelName$).

MapNX ( )- Возвращает ширину карты в плиточных изображениях. Фактически, ширина карты в ячейках.

MapNY ( )- Возвращает высоту карты в плиточных изображениях. Фактически, высота карты в ячейках.

MapSetCell x%, y%, tileNumber%- Сопоставляет с координатами (x%, y%) на карте указанный номер плиточного изображения (tileNumber%).

MapWidth ( )- Функция возвращает ширину карты в точках.

MapX ( x% )- Возвращает X-координату плиточного изображения в пределах карты, исходя из указанной экранной X-координаты пикселя (x%). Эта функция используется совместно с функцией MapY для нанесения экранных координат пикселя на координаты карты. На экране координаты в точках, а на карте в ячейках.

MapY ( y% )- Возвращает Y-координату плиточного изображения в пределах карты, исходя из указанной экранной Y-координаты пикселя (y%). Эта функция используется совместно с функцией MapX для нанесения экранных координат пикселя на координаты карты. На экране координаты в точках, а на карте в ячейках.

SetViewPort x%, y%, w%, h%- Определяет отображаемую на экране область карты.

Игровые функции

Спецификация MIDP определяет различные полезные возможности для программирования игр. Они охватывают комбинации кнопок "Вверх", "Вниз", "Влево", "Вправо" и "Огонь" вместе с четырьмя специализированными клавишами, известными как GAME A, GAME B, GAME C и GAME D. Как эти возможности физически осуществлены, то задано проектировщиками аппаратных средств конкретной модельной линии телефонов. Например, в одном случае кнопки "Вверх", "Вниз", "Влево", "Вправо" и "Огонь" могут быть реализованы на базе вынесенного клавиатурного курсора, в другом случае – в виде стилизованного джойстика, в третьем – просто в виде числовых клавиш телефона. И при подобном разнообразии решений мобильный Бейсик предоставляет доступ к этим возможностям через ряд универсальных функций, которые всего лишь возвращают ненулевое значение, если соответствующая клавиша нажата, или нулевое значение, если не нажата. Этот подход удобен тем, что не зависит от аппаратных особенностей элементов управления конкретным телефоном.

Down ( ) - Возвращает не нуль, если кнопка "Вниз" нажата, иначе возвращает нуль.

Fire ( ) - Возвращает не нуль, если кнопка "Огонь" нажата, иначе возвращает нуль.

Game_A ( ) - Возвращает не нуль, если кнопка "GAME A" нажата, иначе возвращает нуль.

Game_B ( ) - Возвращает не нуль, если кнопка "GAME B" нажата, иначе возвращает нуль.

Game_C ( ) - Возвращает не нуль, если кнопка "GAME C" нажата, иначе возвращает нуль.

Game_D ( ) - Возвращает не нуль, если кнопка "GAME D" нажата, иначе возвращает нуль.

Left ( ) - Возвращает не нуль, если кнопка "Влево" нажата, иначе возвращает нуль.

Right ( ) - Возвращает не нуль, если кнопка "Вправо" нажата, иначе возвращает нуль.

Up ( ) - Возвращает не нуль, если кнопка "Вверх" нажата, иначе возвращает нуль.

Помимо этого в Бейсике есть еще одна функция для отслеживания нажатых клавиш. Она записывается как InKey() и служит для чтения числового кода текущей нажатой клавиши. Если в момент вызова данной функции никакая клавиша не нажата, то функция возвращает нуль. Таким образом, выполнение InKey() завершается немедленно, она не ожидает, пока клавиша будет нажата, что обеспечивает исполнение иных действий в процессе наблюдения за клавишами телефона. Фактически, в цикле можно выполнять массу работы, например, по отрисовке экрана, и в этот же момент незаметно следить за нажимаемыми клавишами без понижения производительности основных участков цикла.

Команды ввода-вывода

В процессе работы программы могут возникнуть десятки причин для сохранения данных, чтобы много позднее к ним можно было возвратиться. Пока программа выполняется, данные можно хранить в переменных, однако они сбрасываются всякий раз, когда программа запускается на выполнение. Сохранение значений в файлах упреждает возникновение проблем с потерей данных при завершении работы программы, особенно если такое завершение было аварийным. Мобильный Бейсик предоставляет несколько команд для создания и манипулирования файлами, причем на всякий случай нужно запомнить, что такие команды не поддерживаются Web-аплетами.

Close #channel% - Закрывает файл, подразумеваемый под указанным каналом (channel%). Номер канала всегда является целочисленным значением от 0 до 9. То есть нельзя одновременно держать более 10 открытых файлов.

Get #channel%, byteValue%- Читает байт из файла с указанным каналом (channel%) и возвращает этот байт в параметр (byteValue%).

Input #channel%, [ intValue% | longValue# | floatValue | stringValue$ ]- Читает из файла с указанным каналом (channel%) значение, записанное в файле в форме текста, и передает это значение во второй параметр команды. Соответственно, вторым параметром должна быть или Integer-переменная, или Long-переменная, или Float-переменная, или строковая переменная.

Note #channel%, offset%- Читает текущую позицию указателя чтения/записи файла с заданным каналом (channel%) и возвращает числовое значение прочитанного указателя в параметр (offset%). Впоследствии возвращенное число может быть использовано в команде Point, чтобы при необходимости вернуть указатель файла на текущее место в файле.

Open #channel%, filename$, openmode$ - Открывает файл с указанным именем (filename$) и ассоциирует его с заданным номером канала (channel%). Файл может быть открыт для чтения из него или для записи в него. Режим открытия файла определяется параметром (openmode$), который в настоящее время должен принимать значения INPUT либо OUTPUT.

Номер канала используется для того, чтобы далее к файлу можно было обращаться просто через некоторое число, а не через имя файла. Разрешается держать одновременно не более 10 каналов, поэтому номер канала лежит в диапазоне от 0 до 9. Именем файла в момент его открытия может быть не только стандартное имя файла, допустим, сохраненного в телефоне, но даже и URL, если необходим доступ к интернет-ресурсам, то есть к файлам за пределами телефона. Чтобы мидлет был способен работать с файлами из Интернета, необходимо сначала разрешить модуль "Network I/O". Такую опцию можно найти через элемент меню "Options" разрабатываемого проекта. По умолчанию данная опция отключена, так как большинство программ не нуждается в подобных возможностях.

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

Point #channel%, offset%- Перемещает позицию указателя чтения/записи файла с заданным каналом (channel%) в новую позицию, определяемую параметром смещения относительно начала файла (offset%).

Print #channel%, [ intValue% | longValue# | floatValue | stringValue$ ]- Печатает указанное значение в файл с заданным каналом (channel%). Печать здесь обозначает, что в файл записывается переданное значение в форме текста, а не набором байтов. Соответственно, в команду можно передать за один раз либо Integer-значение, либо Long-значение, либо Float-значение, либо просто строку текста.

Put #channel%, byteValue%- Записывает байт, переданный в параметре (byteValue%), в файл с указанным каналом (channel%).

Работа со звуком в бейсике

Поддержка звука является довольно сложным делом, поскольку она не принадлежит к стандартным частям многих мобильных телефонов. По иронии телефоны условно можно назвать звукоориентированными устройствами. Большинство телефонов, конечно же, обеспечивают разновидность звуков, однако их диапазон простирается от простых "биканий" до оцифрованных звуков в поздних моделях. К несчастью, множество телефонов предлагают технологию оцифрованных звонков, но не имеют поддержки программного формирования звуков.

PlayAU resourceFilename$- Воспроизводит указанный AU-файл, если он поддерживается (только для Web-аплетов). Необходимо отметить, что оцифрованные звуки занимают много памяти, поэтому предпочтительно сохранять их с минимальным размером.

PlayOTT ottFilename$- Воспроизводит OTT-файл, который может быть создан в интегрированном в среду разработки редакторе Nokia Ring Tone. Такие файлы воспроизводятся только в телефонах Nokia, а данная команда не имеет эффекта внутри среды разработки или для Web-аплетов.

PlayTone Frequency%, DurationMS%- Воспроизводит тональный сигнал с указанной в герцах частотой, длительность которого задана в миллисекундах. Данная команда в настоящий момент тоже не имеет эффекта в среде разработки или для Web-аплетов.

PlayWAV resourceFilename$- Воспроизводит указанный WAV-файл, если он поддерживается (телефоны Nokia серии 60 и тому подобные). WAV-файлы не поддерживаются Web-аплетами. Вместо этого аплеты должны использовать AU-файлы, записанные как 8000Hz uLaw Samples.

Обработка ошибок

Как уже говорилось ранее, можно создавать в теле программы специальные обработчики ошибок, передавая им управление в случае возникновения непредвиденных ситуаций. Понятное дело, используется для перенаправления на обработчик команда Trap. И вот, приняв управления на себя, обработчик должен быть в состоянии предпринять соответствующие действия в зависимости от возникшей ошибки. Ошибки могут быть разными, поэтому для их однозначной идентификации каждой сопоставляется определенный код. Чтобы обработчик мог получить код возникшей ошибки, предусмотрена функция Err(). Она возвращает код самой последней встреченной ошибки, причем коды 0-255 относятся к ошибкам Бейсика, 256-511 – к ошибкам спрайтов, графических элементов, карт и плиточных изображений, 512-767 – к ошибкам ввода-вывода, 768-1023 – к ошибкам форм, 1024-1279 – к звуковым ошибкам. Вот некоторые коды ошибок с описанием их значения: < class="sc"> 0 – Внутренняя ошибка 1 – Попытка деления на нуль 2 – Выход за пределы данных 3 – Неверные данные 4 – Предварительно не выполнена команда Restore 5 – Неверный индекс строки 6 – Неподдерживаемый системный вызов 7 – Неверное числовое значение 8 – Неверный код операции 9 – Неверная строка с плавающей запятой 10 – Неверное отрицательное значение 11 – Не хватает памяти 256 – Неверный спрайт (ошибка возникает при попытке использовать спрайт, не сопоставленный с графическим элементом) 257 – Неверный графический элемент 258 – Неверная ячейка 259 – Неверное плиточное изображение 260 – Неверный файл карты 261 – Неверный файл плиточного изображения 262 – Неверный файл графического элемента (в общем случае ошибка возникает при загрузке GIF- или JPG-изображений на телефоны, не поддерживающие эти форматы) 512 – Ошибка ввода-вывода 513 – Неверный канал 514 – Такой канал уже открыт 515 – Такой канал еще не открыт 516 – Неверный режим открытия файла 517 – Невозможно открыть файл 518 – Неверный канал для произвольного доступа (то есть канал сопоставлен с файлом, для которого не доступен произвольный доступ) 768 – Неверный тип предупреждения 769 – Такая форма уже открыта 770 – Такая форма еще не открыта 771 – Неверный режим даты и времени 772 – Неверное максимальное значение 773 – Форма не завершена 774 – Некорректный элемент 1024 – Тональные сигналы не поддерживаются 1025 – OTT-звуки не поддерживаются 1026 – WAV-звуки не поддерживаются (ошибка генерируется при воспроизведении WAV-файлов на устройствах, не поддерживающих этот формат, или при воспроизведении WAV-файла в Web-аплете) 1027 – AU-звуки не поддерживаются (такие звуки поддерживаются только Web-аплетами) 1028 – Невозможно загрузить звук

Заключительное резюме по программным возможностям Mobile Basic-а

Таков самый интересный с точки зрения игроделателя программный потенциал мобильного Бейсика. Остальные команды, а их тоже очень много, рассматривать не имеет смысла, поскольку они в общем случае должны быть известны мало-мальски подготовленному программисту. Это и команды ядра языка - циклы, обработки условий, выражения, - и команды преобразования типов, и обработка строковых значений, и работа с массивами, и математика, и работа с датой и временем – секунды, часы, дни и так далее, - и прочие возможности. Детальнее о них можно узнать из поставляемой в комплекте справочной системы, правда, на беду она исполнена в английском варианте. В принципе, важные вещи уже изложены здесь, до остального нетрудно дойти самостоятельно, поэкспериментировав на досуге. Тем более что в комплект входят несложные примеры, среди которых даже есть пара простейших игр.

По большому счету вполне оправданный интерес могут вызвать и команды манипуляции формами, особенно при разработке телефонных приложений офисного плана. На сегодняшний день работа с формами в мобильном Бейсике, конечно, далека от совершенства в сравнении с компьютерными аналогами, однако, как известно, лиха беда начала. Если подобные возможности будут востребованы, а они непременно станут таковыми под давлением прогресса, мобильный Бейсик со временем, думается, обзаведется полным арсеналом упомянутых средств. В нынешней вариации предоставляются только такие элементы на форме: Gauge, Image, List, Text и Time, в дополнение к чему еще и форме позволяется иметь собственное меню, опять же при желании формируемое программно.

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

Автор:Дмитрий Сахань
30 марта 2004 года.
Оригинал статьи можно найти на
http://aimatrix.nm.ru




Наши соцсети

Подписаться Facebook Подписаться Вконтакте Подписаться Twitter Подписаться Google Подписаться Telegram

Популярное

Ссылки

магазин люстр
Новости [1] [2] [3]... Android/ iOS/ J2ME[1] [2] [3]) Android / Архив

Рейтинг@Mail.ru Яндекс.Метрика
MobiLab.ru © 2005-2018
При использовании материалов сайта ссылка на www.mobilab.ru обязательна