Е. Буткевич Пишем программы и игры



страница11/15
Дата22.06.2019
Размер2.79 Mb.
ТипКраткое содержание
1   ...   7   8   9   10   11   12   13   14   15
Глава 13

Расширение

функциональности с помощью API

На данный момент мы рассмотрели большинство возможностей реализации MIDP 1.0 мобильного языка J2ME. Возможности эти, прямо скажем, небезгра­ничны, а порой просто разочаровывают. Это и есть плата за универсальность плат­формы и совместимость приложений для многих моделей телефонов. Расширять возможности J2ME можно в двух направлениях: с помощью профайла МШР2.0 и с использованием специальных классов от производителей конкретной модели телефона. Оба варианта значительно сокращают ряд моделей, где наша програм­ма будет чувствовать себя комфортно, то есть работать как следует.

Возможно, в ближайшем будущем телефоны с поддержкой профайла MIDP 2.0 не будут дорогостоящей редкостью, что позволит освоить новые горизонты мо­бильного программирования. А пока что подавляющее большинство моделей те­лефонов на душу населения заключено в жесткие рамки профайла MIDP 1.0, на который и сделан основной акцент в этой книге.

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

Мы рассмотрим несколько разных API и начнем с самой распространенной моде­ли, эмулятором которой мы пользовались на протяжении всей книги. Эмулятор Nokia 7210 уже включает в себя все необходимые классы API, и если вы следова­ли инструкциям и устанавливали все в указанные в первой главе папки, то J2ME Wireless Toolkit обнаружит все, что нужно, самостоятельно. Расширять мы будем нашу любимую «Змейку», в которую добавим несколько приятных моментов.

Nokia API

Посмотрим, чем же нас могут порадовать разработчики от корпорации Nokia. На данный момент нам предлагаются два пакета классов com. nokia.mid.ui и com. noki a .mid. sound, которые предоставляют возможности полноэкранного ре­жима, низкоуровневого доступа к экрану, управления звуком, подсветкой, а так­же вибрацией.

Помним, на чем мы остановились, программируя нашу змею? Название прило­жения, отображенное на экране, благополучно отъело у нас по 16 пикселов не только

138 Глава 13. Расширение функциональности с помощью API

сверху, но и снизу — так, для симметрии (рис. 13.1). Экран и так не слишком ве­лик, чтобы во время игры занимать его никому не нужными заголовками. Решим эту проблему в нашей игре с помощью класса Ful I Canvas из Nokia API.

Делается это не просто, а очень просто. Импортируем необходимый нам класс com.nokia.mid.ui .Full Canvas и наследуем наш класс Snake не от стандартного Canvas, а от расширенного Ful l Canvas.

import com.nokia.mici.in .FullCanvas;

private class Snake extends FullCanvas implements Runnable {


Вот, собственно, и все. Класс Ful ICanvas сам наследован от стандартного класса Canvas, то есть содержит все его поля и методы, а это значит, что больше нам ничего пере­писывать не придется. Новых методов класс Ful lCanvas не реализует, зато опреде­ляет несколько дополнительных констант для клавиш, специфичных для телефо­нов Nokia. Например, константы KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_RIGHT_ARROW, KEY _UP_ARROW могут быть ис пользованы в процедуре keyPressed(int keyCode) для реа­лизации управления джойстиком, характерным для аппаратов Nokia.

Итак, компилируем исправленное приложение. Обратим внимание на то, что в строке Device (Ап­парат) главного окна KToolbar должен быть выб­ран эмулятор Nokia, иначе WTK не обнаружит API-классаи выдаст следующую ошибку: package com.nokia.mid.ui does not exist. Запускаем но­вую игру и видим, что мы, не особо напрягаясь, достигли желаемого результата и отвоевали у аппарата 128 х 32 = 4096 пикселов (рис. 13.2).

Следующий класс, который мы рассмотрим, — Devi ceControl, из того же пакета com. noki a. mid.ui. Он дает возможность управления подсветкой и вибрацией телефона. В нашем распоряжении оказываются следующие методы:


  • void flashLightsClong duration) — мигание
    подсветки на протяжении duration миллисе­
    кунд. Метод возвращается сразу после вы­
    зова и не блокирует исполняющий тред на
    время выполнения эффекта;

  • void setLightsCint num. int level) —управ­
    ление иллюминацией телефона. Аргумент
    num представляет номер источника света для
    аппаратов с дополнительными лампочками
    и подсветками. Фоновая подсветка имеет
    номер, равный нулю. Аргумент level зада­
    ет уровень интенсивности света в диапазо-

экрана оказывается недоступной не 0-100. Значение 0 означает выключение

Nokia API

139







света. В аппаратах без поддержки уровня ин­тенсивности света любое значение аргумента, большее нуля, означает включение света. Та­ким образом, команда погашения фоновой подсветки будет выглядеть так: Devi ceControl. setLightsCO. 0);

  • void startVibra(int freq. long duration) —
    включает вибрацию телефона на duration
    миллисекунд. Аргумент freq задает частоту
    вибрации в диапазоне 0-100. Значение 0 мо­
    жет быть использовано для определения, под­
    держивается ли вибрация вообще. Если при
    нулевом аргументе будет сформировано ис­
    ключение 111 egal StateExcepti on, значит теле­
    фон в принципе не вибрирует. Такое же ис­
    ключение при другом аргументе может быть
    сформировано, если система не разрешает ис­
    пользование вибрации. Метод, так же как
    и flashLights, возвращается сразу после вы­
    зова и не блокирует выполнение программы
    на время вибрации;

  • void stopVibraO — остановить вибрацию,
    организованную предыдущим методом. Если
    вибрация не активна, то метод не выполня­
    ет никаких действий и не формирует ис­
    ключений.

Рис. 13.2. Класс FullCanvas предо­ставляет в наше распоряжение весь экран целиком

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

ui. Devi ceControl. Затем в методе paint CGraphics g), отрабатывающем действия конца игры, включим вибрацию максимальной частоты на 100 миллисекунд: import com.nokia.mid.ui .DeviceControl;

public void paintCGraphics g) {

// если поднят флаг конца игры if ( gameOverFlag ) {

// включить вибрациюна ЮОис.

DeviceControl.startViЬгаСЮО.100):

Заметим, что эмулятор умело подражает даже этой функции аппарата, и телефон, изображенный на экране компьютера, заметно потряхивает.


140 Глава 13. Расширение функциональности с помощью API

Используем также для усовершенствования нашей игры класс Sound из пакета com.nokia.mid.sound. Для начала рассмотрим методы класса Sound:



  • Sound(int freq. long duration) — конструктор; создает звуковой объект часто­
    той сигнала freq герц, продолжительностью durati on миллисекунд. В докумен­
    тации можно найти таблицу перевода частот в обычные ноты, хотя кому-то
    это одинаково непонятно;

  • Sound(byte[] data, int type) — конструктор; создает звуковой объект, пред­
    ставленный массивом байтов data. Аргумент type задает формат звуковых дан­
    ных. Класс Sound определяет две константы представления формата: FORMAT_
    TONE — мелодия в формате Nokia, FORMATJJAV — мелодия в стандартном MIDI-
    формате;

  • int getConcurrentSoundCount(int type) — возвращает максимально возможное
    количество одновременно проигрываемых мелодий типа type;

  • int getGainO) — возвращает уровень громкости звука в диапазоне 0-255 или
    значение -1, если используется громкость по умолчанию;

  • int getStateC) — возвращает текущее состояние звукового объекта, представлен-
    ное одной из трех констант: SOUND_PLAYING, SOUND_STOPPED, SOUNDJJNINITIALIZED —звук

проигрывается, остановлен или не инициализирован соответственно;

  • int[] getSupportedFormatsO — возвращает поддерживаемые аппаратом аудио-
    форматы в виде массива констант FORMAT_TONE, FORMAT_WAV. Если воспроизведе­
    ние звука не поддерживается аппаратом, то возвращается пустой массив;

  • void init(int freq, long duration) — инициализирует звуковой объект, аргу­
    менты аналогичны первому рассмотренному конструктору;

  • void init(byte[] data, int type) — инициализирует звуковой объект, аргумен­
    ты аналогичны второму рассмотренному конструктору;

  • void play(int loop) — воспроизвести звуковой объект loop раз. Если аргумент
    1 оор принимает значение 0, то объект будет воспроизводиться до тех пор, пока
    не будет принудительно остановлен. Во время воспроизведения объект нахо­
    дится в состоянии SOL)ND_PLAYING;

  • void releaseO — освобождает все используемые звуковым объектом ресурсы
    и переводит его в состояние SOUNDJJN INITIALIZED. Если объект находится в со­
    стоянии SOUND _PLAYING, то сначала автоматически вызовется метод stop();

  • void resumeC) — возобновитьвоспроизведениеостановленногозвуковогообъек-
    та. Если аппарат поддерживает такую возможность, то воспроизведение нач­
    нется с того места, где оно было остановлено;




  • void setGaindnt gain) — установить уровень громкости воспроизведения
    в диапазоне 0-255;

  • void stop О — останавливает воспроизведение звукового объекта и переводит
    его в состояние SOUND_STOPPED.

Хотим теперь, чтобы при поедании очередного сердечка змея издавала радост­ный писк. Для этого нужно импортировать необходимый класс, создать звуковой объект и воспроизвести его в методе checkMove, контролирующем передвижение в заданном направлении:

Samsung API 141



import com.nokia.mid.sound.Sound;

// проверить возможность передвижения // в точку с координатами (хН.уН) public void checkMove(int xH. int уН) {

// проверить совпадение координат передвижения

// с координатами сердца

if ( хН — xHeart && уН — »уHeart ) { eatFlag = true: // создать звуковой объект // частоты 1000 герц длиной полсекунды Sound beep = new Sound(1000.500): // воспроизвести звуковой объект beep.play(l): // увеличить скорость speed--;

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



// пройти в цикле частоты от 100 до 1000 герц с шагом 50 forCint 1-100: i<=1000: i+=50) {

// создать звуковой объект

Sound beep = new Soundd,50);

// воспроизвести звуковой объект

beep.play(l): }

Теперь у вас есть большое поле для экспериментов, чтобы начинить игру звуковы­ми и тактильными спецэффектами. Кроме использованных нами классов пакет com.nokia.mid.ui содержит также интерфейс DirectGraphics и класс Di rectUti I s, рас­ширяющие возможности работы с графикой. Здесь нам предоставляется масса ин­тересных методов, таких как прорисовка и заливка треугольников и полигонов, ■ прямой доступ к любой точке экрана, повороты изображения, смена форматов цве­товой гаммы и многие другие полезные вещи, интересные лишь Nokia-ориентиро­ванным программистам.



Samsung API

На остальных производителях мы не будем останавливаться настолько подроб­но. Рассмотрим, для сравнения, предоставляемые ими классы. Разработчики



142 Глава 13. Расширение функциональности с помощью API

телефонов Samsung предлагают пакет com. Samsung. uti l, который содержит анало­ги уже знакомых нам классов контроля звука, подсветки и вибрации, а также два новых класса, поддерживающих создание и рассылку SMS-сообщений. Рассмот­рим вкратце все предложенные нам классы.

Класс AudioClip отличается от Nokia-аналога расширенным списком воспроизво­димых форматов, а также отсутствием простой пищалки, задающей частоту тона в герцах. Конструктор AudioClipdnt type, byte[] audioData, int audioOffset, int audioLength) создает звуковой объект из байтового массива audioData, начиная с позиции audioOffset, длины audioLength байтов. Второй конструктор AudioClip(int type. String fi 1ename) получает звуковой объект прямо из файла ресурса по име­ни f11ename. Аргумент type может принимать значения следующих констант: TYPE_MMF, TYPE_MP3, TYPE_MIDI, с оговоркой, что на данный момент аппаратами поддерживает­ся только TYPE_MMF.

Методы play(int loop, int volume), stopO,pauseO и resumeО служат для начала, прекращения, приостановки и возобновления воспроизведения звукового объек­та соответственно. Метод boolean isSupportedO возвращает значение true, если такая технология воспроизведения звука поддерживается аппаратом.

Класс Vibration заведует вибрацией телефона. Его метод boolean isSupported() аналогичен такому же методу класса AudioClip, а методы start(int duration, int strength) и stop() начинают и прекращают вибрацию соответственно.

Класс LCDL i ght занимается лишь фоновой подсветкой, так как других источников света Samsung не предусматривает. Методы bool ean 1 sSupported (), on d nt durati on) и of f () говорят о своих действиях сами за себя.

Рассылка SMS поддержана в Samsung API двумя классами: первый класс, SM, со­держит все необходимые методы для формирования сообщения, а второй, SMS, предоставляет лишь два метода: уже набивший оскомину boolean isSupportedO, а также send(SM sin), посылающий сообщение адресату. Конструктор SM(String dest, String callback, String textMessage) создает объект сообщения для номера dest от номера callback с текстом textMessage. Методы String getCallbackAddressO, String getDataO, String getDestAddressO, void setCallbackAddress(String address), void setData(String textMessage), void setDestAddress(String address) предназначены для получения и установки трех параметров сообщения, рассмотренных в конст­рукторе. Обратим внимание на интересный параметр номера отправителя са11back. Не хотят ли они сказать, что мы с телефона можем послать SMS от чужого име­ни? В документации говорится, что данный параметр не поддерживается, однако на форуме умельцев с Самсунгами я уже видел ссылку на подобную программку. Хотя не знаю, работает ли она: у меня, как вы уже, наверное, догадались, Nokia.

При попытке найти в Интернете эмуляторы телефонов Samsung, поддержива­ющие вышеописанные классы, обнаружилась занятная вещь под названием Samsung JaUmi Wireless Toolkit. Дизайн программки оказался до боли знакомым, за не­большим отличием списка эмулируемых аппаратов (рис. 13.3).

В меню About обнаружилась следующая надпись: «Copyright© SAMSUNG Electronics 2003. All rights reserved». Интереса ради заглянул в аналогичный пункт меню при­вычного нам J2ME Wireless Toolkit: «Copyright © 2002 Sun Microsystems, Inc., 901 San Antonio Road, Palo Alto, California 94303, U.S.A. All rights reserved». Видим, что,

Samsung API 143



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

ЩSAMSUNG JaUmi Wireless Toolkit -

SnakeGame







R3e^ Edit.. Rrcjact ■ нЫр ■-. '. ,-i ;













j ^/Settings...! ^Jj' ЪЛ11 %»Run [I "^S Cleo

■Conswe j







В *
















;GH-Z130







;GH_C207













SGH_D410

J










SGH_E100













SGH_E300













;GH_E618

i
















Рис. 13.3. Интерфейс этой программы очень напоминает J2ME Wireless Toolkit

Посмотрим, как будет себя чувствовать наша змейка на телефонах типа Samsung, предварительно заменив классы Nokia API на аналоги от Samsung, a Canvas вернув в исходное положение. Змейка демонстрирует свою живучесть и хорошую совме­стимость моделей (рис. 13.4).



SAMSUNG
SGH-E1O0

Рис. 13.4. Самсунги тоже пригодны для обитания нашей змейки



144 Глава 13. Расширение функциональности с помощью API .

Siemens API

Нужно отдать должное, разработчики компании Siemens переплюнули всех и дали самый широкий набор классов для управления их телефонами. Классы объедине­ны аж в семь пакетов: com. Siemens, mp. game, com. Siemens, mp. col orjpne, com. Siemens, mp.gsm, com. Siemens. mp. io,com. Siemens. mp. media, com. Siemens. mp. medi a. control, com. Si emens.mp.ui. Возможностей у этих классов масса, поэтому не будем вдаваться в подробности, а лишь рассмотрим назначение каждого из них.

Пакет com.Siemens.mp.game содержит средства разработки игровых приложений. Здесь присутствуют аналоги уже знакомых нам классов. Класс Light руководит фоновой подсветкой телефона, а класс с двусмысленным названием Vibrator за­ведует вибрацией. Класс Sound является обычной пищалкой, воспроизводящей тон заданной частоты, зато классы Mel ody и Mel odyComposer позволяют составлять и вос­производить мелодии из нот, представленных константами класса MelodyComposer. Намеков на поддержку стандартных звуковых форматов не обнаружено.

Следующий набор классов заведует графическими возможностями аппарата. Класс Extended lmage дает прямой низкоуровневый доступ к точкам экрана, а также прори­совку изображения в обход стандартного метода paint. Графические объекты пред­ставлены классом GraphicObject, являющимся базовым для классов TiledBackground и Sprite. Первый из них осуществляет поддержку графического фона экрана, пред­ставленного мозаикой.

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

Следующие два пакета com. Si emens. mp. ui и com.siemens.mp.color_game дают новый подход к управлению графическими объектами. Первый пакет содержит лишь один класс Image, расширяющий оригинал возможностями масштабирования и зеркального отражения картинки. Второй пакет организует работу с графиче­скими объектами через базовый класс слоя графики Layer, от которого наследова­ны знакомые нам по прошлому пакету классы Sprite и TiIed'Layer, а также с помо­щью класса менеджера слоев LayerManager. Кроме этого пакет содержит класс GameCanvas, аналогично классу от Nokia, расширяющий стандартный Canvas.

Пакет com.Siemens.mp.gsm предоставляет средства связи, представленные следу­ющими классами: PhoneBook для доступа к адресной книге, Cal l для организации телефонного звонка по указанному номеру, SMS для формирования и рассылки SMS-сообщений.

Пакеты com. s iemens.mp. mediа и com. si emens.mp. media. control реализуют универсаль­ный аудиопроигрыватель с опциями воспроизведения, перемотки, возможностью прослушивания треков прямо из Интернета.

Последний пакет com.siemens.mp.iо позволяет приложению организовать свою файловую систему с помощью класса Fi le. Это позволит не мучаться с хранили­щем записей, а использовать обычную файловую систему с привычными нам ме­тодами доступа. Интерфейс ConnectionListener и класс Connection реализуют воз-

Siemens API

145


можность работы с внешними устройствами ввода-вывода телефона, такими как мультимедийные карты ММС или инфракрасный порт IRDA.

Звучит это все, конечно, заманчиво, осталось только узнать, какие модели под­держивают все эти прелести, а главное — по карману ли они нам. С точки зрения программного обеспечения Siemens опять оказался на высоте и предлагает свой собственный Siemens Mobile Toolkit (SMTK), который интегрируется со средой разработки JBuilder любой версии, начиная с пятой. В этой же программе можно установить различные эмуляторы телефонов. Змейка же продолжает успешно ползать по экранам разных моделей, теперь это Siemens M55 (рис. 13.5).



Рис. 13.5. И в Сименсах водятся змеи

На этом этапе мы прощаемся с нашей змейкой, так многому нас научившей. Пол­ный листинг программы для аппарата Nokia приведен в конце книги, однако, на­деюсь, что вы не принялись сразу аккуратно списывать код, а действовали вместе со мной поэтапно. Игра, конечно, далека от совершенства, поскольку реализована как демонстрация различных возможностей языка J2ME, в ваших силах теперь довести ее до ума, добавить необходимую логику, красочные картинки, проявив фантазию и смекалку.

* * *

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



146 Глава 13. Расширение функциональности с помощью API

граммное обеспечение, API-классы, эмуляторы, документацию и прочие необхо­димые вещи можно скачать на официальных сайтах компаний-производителей. Как правило, делятся они этим безвозмездно. Также в Сети существует большое количество «фан-клубов» (сайтов, порталов, форумов) телефонов основных про­изводителей, где собираются разные умельцы, которые делятся идеями и програм­мами. Там вы сможете получить много интересной информации конкретно о ва­шем телефоне, а также скачать все необходимое программное обеспечение и даже больше. Перефразируем слова Мичурина: не нужно ждать милостей от телефона, взять их у него — наша задача!




Каталог: Техника -> Информационные%20технологии
Информационные%20технологии -> Методические рекомендации по построению систем защиты узлов интернет 1 требования к системе защиты узла интернет 2
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации
Техника -> Ремонт китайских телефонов
Техника -> Для профилактики и лечения насморка Зачем промывать нос во время насморка?
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации


Поделитесь с Вашими друзьями:
1   ...   7   8   9   10   11   12   13   14   15


База данных защищена авторским правом ©vossta.ru 2019
обратиться к администрации

    Главная страница