отпугиватель мышей – Java телефонов 22ст

Среда, Июнь 1st, 2011

https://kitaytovar.ru/index/java_telefonov_22st/0-99

Столкновение объектов

// рисуем графические элементы init(g>;

// останавливаем цикл на 20 миллисекунд try { Thread.sleep(20) ; }

catch (java.lang.InterruptedException zxz) { }

}

}

private void input Key ( ) {

II определяем нажатую клавишу

int keyStates = getKeyStates ( > ;

// код обработки для левой нажатой клавиши

if ((keyStates& LEFT_PRESSED) != 0) bol.moveLeft ( ) ;

// код обработки для правой нажатой клавиши

if ((keyStates& RIGHT_PRESSED) 1=0) bol .moveRight( )

код обработки для клавиши вверх if ( (keyStates& UP_PRESSED) !=0) bgl’.moveUp ( ) ; // код обработки для клавиши вниз

if ((keyStates& DOWN_PRESSED) != 0) bol.moveDown() ;

)

if i i i i

private void init (Graphics g)

{

7/ желтый цвет фона g.setColor(Oxffff00) ; ,

// перерисовываем экран

g.fillRect (0,0, getWidthO , getHeight ( ) > ;

/ / рис ем уровенв в точке 0 , 0 lm.paint (g, 0, 0) ; // двойная буферизация £lushGraphics() ,-

} }

/**

файлМуЗрг^е . j ava класс MySprite-

*/

import javax.microedition.lcdui . *; import javax.microedition.lcdui .game.*;

public class MySprite extends Sprite ■

ЕЯММШ

Техника создания игр

{

// конструктор

public MySprite(Image image, int fw, int fh)

{

// обращаемся к конструктору суперкласса super(image, fw, fh) ;

}

// метод для левой нажатой клавиши

public void moveLeft() r

// передвигаем спрайт move (-1,0);

}

// метод для правой нажатой клавиши public void moveRight()

{

// передвигаем спрайт move(1,0)у

}

// метод для клавиши вверх public void moveUp() {

// передвигаем спрайт move (0,-1)

}

// метод для клавиши вниз public void moveDown() {

// передвигаем спрайт move(0,1);

}

Г

В листинге 8.4 содержатся три класса MainGame, MyGameCanvas и MySprite. Основной код обработки столкновений бомб и мяча находится в классе My GameCanvas, этомуклассумыиуделим особое внимание при разборе листинга.

В конструкторе класса MyGameCanvas происходит загрузка изображения мяча из файла ресурса bol. png, инициализация объекта bol, класса MySprite и устанавливается позиция прорисовки на экране объекта bol.

Image bollmage = Image.createlmage(«/bol.png»);

bol = new MySprite (bollmage, 23, 23);

bol. setPosition(getWidth()/2 , getHeight(>/2);
II
1

225

Столкновение объектов

Заметьте, что позиция вывода мяча на экран установлена в центре экрана, но эта позиция определена для левой верхней точки мяча, поэтому именно левый верхний угол изображения спрайта мяча будет находиться в центре экрана. Для того чтобы нарисовать сам спрайт в центре экрана, нужно переопределить опорную позицию мяча с помощью метода defineReference Pixel ().

Затем в конструкторе miaccaMyGameCanvas загружается изображение бомбы.

Image bombalmage = Image.createlmage(«/bomba.png»);

После этого происходит инициализация четырех объектов bombal, bomba2, ЬотЬаЗ и bomba4 класса MySprite и устанавливается позиция для вывода всех четырех бомб на экран телефона.

bombal = new MySprite (bombalmage, 23, 23);

bombal.setPosition(10, 10);

bomba2 = new MySprite (bombalmage, 23, 23);

bomba2.setPosition[ getwidth()-30, 10);

ЬотЬаЗ = new MySprite (bombalmage, 23, 23);

bomba3.setPosition(10, getHeight О-40);

bomba4 = new MySprite (bombalmage, 23, 23);

bomba4 . setPosition (getWidth() -30 , getHeight (> -40) ;

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

Произведя загрузку необходимых изображений и инициализируя все объекты класса MySprite, можно добавить их к уровню с помощью менеджера уровней.

lm.append(bol); 1т. append (bombal) lm.append(bomba2) lm.append(ЬотЬаЗ) lm.append(bomba4)

Наша задача в этом примере - это определение столкновения бомб и мячика, для этого создан метод stolknovenie (), где при помощи конструкции if/ else происходит обработка столкновения о бъектов bo 1 и bomba 1 -bomba 4. Сейчас было бы очень хорошо, если бы вы могли запустить с компакт-диска программу из листинга 8.4, она находится в папке \Code\Listing8_4\bin\Listing8_4.jad и попробовали осуществить столкновение мяча с четырьмя бомбами. Как мы договорились, при столкновении будет обсуждаться работа четырех разных методов.

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

Техника создания игр

этом возможности повлиять на остановку перехода по фреймам в методе next Frame () нет.

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

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

bol.setFrame(2) ; ЬотЬаЗ.setFrame(0);

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

Четвертая бомба при столкновении задействует метод setFrameSequen-се (), благодаря которому можно использовать фреймовые последовательности в виде массива индексов.

Используя эти методы, я думаю, Е * вполне сможете создать любую цепочку событий для перемещения, столкновения и других возможных действий объекта. В следующей главе будет рассматриваться мультимедийная библиотека, необходимая для создания звукового сопровождения в трах.

Глава 9. Мобильная мультимедиа-библиотека

Воспроизведение звуков в играх создает более насыщенную атмосферу. Хорошая звуковая дорожка к игре - это 30-40% успеха! Но, к сожалению, в мобильных играх, нет возможности воспроизведения мощной полноценной звуковой дорожки, как в компьютерных или приставочных играх, в виду ограничения системных ресурсов телефона. Поэтому, в основном, все звучание в играх сводится к воспроизведению так называемых тональных звуков. Каждый тональный звук соответствует определенной ноте, выстроив необходимую последовательность нот для воспроизведения можно получить определенную звуковую дорожку.

В профиле MIDP 1.0 возможность работы со звуком отсутствует, и все строится на использовании классов, предоставляемых производителями мобильных телефонов. В профиле MIDP 2.0 такая возможность имеется, поскольку появилась мобильная мультимедиа библиотека (MMAPI), разработаная экспертной группой, в состав которой входят известные компании:

□ Nokia (Specification Lead); Q Aplix Corporation;

□ Beatnik, Inc.;

□ France Telecom;

Q Insignia Solutions;

□ Mitsubishi Electric Corp.;

□ Motorola;

□ Netdecisions Holdings United; Q NTT DoCoMo, Inc.; Q Openvvave Systems Inc.; Q PacketVideo Corporation; a Philips;

□ Siemens AG ICM MPTI; Q Smart Fusion; Q Sun Microsystems, Inc.; Q Symbian Ltd; Q Texas Instruments Inc.; Q Vodafone;

Q Yamaha Corporation; Q Zucotto Wireless.

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

228

ЩЩ Мобильная мул ьт и мед и а-библиотека

О Mobile Media API - предназначенадля работы с устройствами имеющими боле мощные системные ресурсы. Это, как правило, карманные портативные устройства;

□ MIDP 2.0 Media API - эта библиотека направлена на поддержку мобильных устройств с ограниченными ресурсами.

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

□ Менеджер - это основной диспетчер, при помощи которого создаются все проигрыватели. Также менеджер имеет возможность в воспроизведении . простых тональных звуков на телефоне. Менеджер в профиле MIDP 2.0 представлен классом Manager;

□ Проигрыватель- осуществляет непосредственное воспроизведение зву- ■ ков и представлен интерфейсом Player;

Все взаимодействие построено на использовании нескольких интерфейсов и класса Manager, содержащихся в библиотеке MIDP 2.0 Media API, которая состоит из двух пакетов: ■ Q javax.microedition.media; Q javax.microedition.media.control.

Эш два пакета содержат ряд интерфейсов и всего один класс Manager. Рассмотрим подробно оба пакета библиотеки MIDP 2.0 Media API, давая попутно краткую характеристику каждому интерфейсу, классу Manager и всем имеющимся методам. А потом, на основе полученного материала, создадим несколько примеров исходного кода, иллюстрирующих модель работы со звуком.

9.1. naKeTJavax.microedition.media

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

9.1.1. Интерфейс Control

Интерфейс Control - это самый главный интерфейс, с его помощью осуществляется контроль над всеми имеющимися ресурсами, также от этого интерфейса наследуются еще два интерфейса Tone Control и Volume Control.

9.1.2. Интерфейс Controllable

С помощью интерфейса Controllable можно получить управление над воспроизведением, посредством использования двух методов:

□ Control getControl (String controlType) - определяет тип управления;

Q Control [ ] getControls (1 – получает управление.

Пакет javax.microedition.media

9.1.3. Интерфейс Player

Интерфейс Player наследуется от интерфейса Cont rol labl ей необходим для реализации процесса воспроизведения звуковых данных на основе формирования проигрывателей. Проигрыватели создаются методом create Player (> класса Manager, например:

Player playerl = Manager.createPlayer() ,-

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

Методы интерфейса Player

□ void addPlayerListener (PlayerListener playerListener’) -осуществляет обработку событий от определенного проигрывателя;

□ void close () – закрывает проигрыватель;

□ void deallocate () – освобождает ресурс, занятый проигрывателем;

□ String getContentType () – получает тип звуковых данных воспроизводимых проигрывателем;

Г~ long uration () – получает размер звукового файла;

□ long getMediaTime () — получает время воспроизведения звуковых данных;

О int g е t st at e () – определяет состояние проигрывателя;

□ void removePlayerListener(PlayerListener- playerListener) – удаляет установленный обработчик событий;

□ void setLoopCount (int count) – устанавливает цикличное воспроизведение звуковых данных;

□ longsetMediaTime (long now) -устанавливаетвремявоспроизведения; О void start () – дает команду на воспроизведение;

Q void stop () – останавливает воспроизведение.

Большинство методов направленно на работу со звуковыми данными, позже в разделе 9.3 мы разберем подробнее работу с методами интерфейса Player.

9.1.4. Интерфейс PlayerListener

Интерфейс PlayerListener позволяет осуществлять обработку событий полученных от проигрывателя. Помните в главе 5 мы разбирали работу интерфейса CommandListener? Интерфейс PlayerListener функционирует почти по такой же схеме, но ориентирован на работу с проигрывателем. В составе интерфейса PlayerListener имеется всего один метод:

Q void playerUpdate(Player player, String event, Object

oircnt-naha \ – nfvuwnTTaPT тгтпошда ттпптггпт.тп9Тртта

……..’ ‘ \_ I WVlWliUlV 1 1 | \ I 1 1 I : I L . If I .

С помощью констант интерфейса Player в методе playerUpdate (), нужно задавать тип необходимых событий в параметрах е ventData и event: Q static String CLOSED – уведомляет о закрытии проигрывателя;

□ static String DEVICE_AVAILABLE – уведомляет о доступности проигрывателя;

О static String DEVI С E_UN AVAILABLE – уведомляет о недоступности проигрывателя;

О «static String DURATION_UPDATED – обновляет состояние;

□ static String END_OF_MEDIA – уведомляет о конце воспроизведения данных пр оигрывателем;

□ static String ERROR – уведомляет об ошибке;

О static String STARTED – уведомляет о начале работы проигрывателя;

□ static String STOPPED – уведомляет о конце работы проигрывателя;

□ static String VOLUME_CHANGED – уведомляет о выборе громкости для воспроизведения.

9.1.5. Класс Manager

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

О static Player createPlayer(InputStream stream, String type) – создает проигрыватель для воспроизведеггиязвуковыхд энных из потока;

□ static Player createPlayer (String locator) – создает проигрыватель для воспроизведения звуковых данных из определенного файла;

D static String[] getSupportedProtocols(String contentty-pe) – возвращает список доступных протоколов для мобильного устройства;

□ static voidplayTone (int note, int duration, int volume) — воспроизводит различные тональные звуки.

9.2. Пакет javax. microedition. media .control

IIaKemjavax.microedition.media.contm[ne6om>moti по своему составу и производит контроль над процессами, связанными с воспроизведением и регулировкой звука. В разделе 9.4 этой главы очень подробно рассматривается схема контроля.

9.2.1. Интерфейс ToneControl

С помощью интерфейса ToneControl происходит настройка и построение блока тональных звуков для воспроизведения. Это достигается путем использо-яытяметода void setSequence (byte [ ] sequence), который устанавливает тональные звуки для воспроизведения и набора следующих констант:

Q static byte BLOC KEND – конец блока воспроизведения;

Q static byte block_START – стартовая позиция в блоке;

Q static byte С4-нотаДо;

Q static byte PLAY_BLOCK – воспроизвести блок;

О static byte REPEAT – повторить воспроизведение блока;

Воспроизведение wav-файлов

□ static byte SETVOLUME – установить громкость;

□ static byte SILENCE – без звука;

□ static byte TEMPO – темп или скорость воспроизведения; Q static byte VERSION – версия атрибута воспроизведения.

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

9.2.2. Интерфейс VolumeControl

Интерфейс VolumeControl имеет методы, на основе которых можно реализовать управление громкостью воспроизведения:

Q int getLevel() – возвращает текущий уровень громкости; О boolean isMutedO – определяет состояние сигнала;

□ int set Level (int level) – устанавливает уровень громкости. Значение может находиться в пределах от 0 до 100;

Q void setMute (boolean mute) – устанавливает состояние сигнала.

Сейчас мы вкратце рассмотрели имеющиеся интерфейсы, классы, методы и константы двух пакетов javax.microedition.media Hjavax.microedition.niedia.controL Теперь давайте подытожим все полученную информацию и рассмотрим примеры, иллюстрирующие работу со звуком в мобильных телефонах.

9.3. Воспроизведение wav-файлов

Воспроизведение wav-файлов в телефоне задача не сложная. Wav-файл должен быть размещен в каталоге создаваемого приложения. Если вы» используете J2ME Wireless Toolkit 2.1, то расположите wav-файл в папке res. Впоследствии, после компиляции и установки программы, wav-файл будет находиться в JAR-архиве, и доступен для воспроизведения.

Для того чтобы воспроизвести необходимый wav-файл создается объект класса InputStream для связывания потока данных с ресурсом, а именно wav-файл ом, например:

InputStream input =

getClass () . getResourceAsStreamleiJiaJm.wav*.) ;

Затем создается проигрыватель:

Player player = Manager.createPlayer (input«audio/X-wav») ;

Проигрыватель формируется с помощью метода createPlayer() класса Manager. Количество создаваемых проигрывателей регламентируется только системными ресурсами телефона. После чего используется метод staTt()p,Jia воспроизведения wav-файла.

В листинге 9.1 вы найдете пример исходного кода, в котором происходит загрузка и воспроизведение wav-файла из JAR-архииа. В примере используется класс Form, с помощью которого создается пустой экран, и добавляются две ко-

манды: выход из приложения и воспроизведение wav-файла. Основные действия разворачиваются в методе WavPla^O, где создается проигрыватель ивоспроиз-водится wav-файл. Обратите также внимание на подключаемые пакеты.

воспроизводит wav-файл * /

import javax.microedition.lcdui.* ; import j avax.microedition.midlet. * ; import javax.microedition.media.*; import javax.microedition.media.control,*; import java.io.*;

public class WavMIDlet extends MIDle.t implements

CommandListener

{

/ / команда выхода

private Command exitMidlet = new Command ( «Выход» , Command.EXIT, 0) ;

// команда воспроизведения

private Command pi’ = new Command ( «Играть», Command. OK, 1) ;

// объект mydisplay представляет экрай телефона private Display mydisplay;

public WavMIDlet ( )

{

mydisplay = Display .getDisplay (this) ;

I

public void startApp ( ) {

Form Is = new Form ( «Воспроизведение wav») ;

// добавляем команду выхода

Is.addCommand(exitMidlet);

//. добавляем команду воспроизведения

Is .addCommand(pl),-

Is.setCommandListener(this) ;

// отражаем текущий дисплей

mydisplay.setCurrent(ls);

private void WawPlayO

листинг 9. 1 класс WavMIDlet

/

Для перехода к следующей странице статьи перейдите по вы подающему меню

Читайте также: