Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы. Мобильные устройства.doc
Скачиваний:
9
Добавлен:
01.05.2019
Размер:
2 Мб
Скачать
☆

Воспроизведение видео

Приведенный ниже код показывает, как организовать воспроизведение MPEG видео.

...

Player p;

VideoControl vc;

try {

p = Manager.createPlayer("http://server/somemovie.mpg");

p.realize();

// Получаем управление для видео

vc = (VideoControl) p.getControl("VideoControl");

....

p.start();

}

catch(IOException ioe) {

}

catch(MediaException me) {

}

...

Использование камеры

MMAPI обеспечивает поддержку встроенной камеры. Для ее использования при создании плеера нужно задать параметр capture://video . Для управления используется VideoControl, например, для получения картинки с камеры нужно вызвать метод VideoControl.getSnapshot(String imageType). По умолчанию картинка возвращается в формате PNG. Вы можете использовать параметр imageType, чтобы выбрать другой доступный формат. Доступные форматы можно узнать, получив значение системного параметра video.snapshot.encodings.

J2ME Wireless Toolkit и MMAPI

J2ME Wireless Toolkit 2.0 поддерживает MMAPI. Среди входящих в его состав примеров есть программы, использующие MMAPI. Вы прямо сейчас можете открыть пример mmademo и запустить его. Обратите внимание, в mmademo воспроизведение некоторых файлов требует подключения к интернету.

Поддерживаемые форматы

2ME Wireless Toolkit поддерживает следующие форматы

  • Audio: PCM и WAV

  • MIDI: Type 0 (single track), Type 1 (multiple tracks) и SP-MIDI

  • Video: MPEG-1

Ограничения использования mmapi в wtk

Имейте в виду, что J2ME Wireless Toolkit имеет следующие ограничения (Помните о том, что каждое конкретное устройство имеет свои собственные ограничения):

  • Хотя вы можете создать в приложении несколько различных плееров, в данный момент времени может использоваться только один MIDI плеер. В противном случае возникнет ошибка MediaException.

  • WTK позволяет одновременно вызвать любое количество playTone(), однако, гарантированно будут воспроизведены только четыре ноты. Метод playTone() можно вызывать во время воспроизведения MIDI последовательности.

  • Число видео плееров ограничено размером динамической памяти и задается в параметре Xheapsize команды emulator (если Вы вызываете эмулятор из командной строки) или в пункте меню KToolBar Edit -> Preferences -> Storage

  • Число WAV аудио плееров также ограничено размером динамической памяти.

  • В данный момент времени может воспроизводиться только один аудио файл.

Кроме того, WTK ограничивает число одновременно открытых HTTP соединений (не более четырех).

Пример простого медиаплеера

Чтобы не быть голословным я написал небольшой пример медиаплеера, использующего Mobile Media API. PlayerMIDlet позволяет проигрывать файлы, загруженные из сети. Для этого необходимо указать их URL.

import javax.microedition.lcdui.*;

import javax.microedition.media.*;

import javax.microedition.media.control.*;

import javax.microedition.midlet.*;

public class PlayerMIDlet extends MIDlet implements

CommandListener, PlayerListener, Runnable {

private Display display;

private Form form;

private TextField url;

private Command start = new Command("Play",

Command.SCREEN, 1);

private Command stop = new Command("Stop",

Command.SCREEN, 2);

private Player player;

public PlayerMIDlet() {

display = Display.getDisplay(this);

form = new Form("Demo Player");

url = new TextField("Enter URL:", "", 100, TextField.URL);

form.append(url);

form.addCommand(start);

form.addCommand(stop);

form.setCommandListener(this);

display.setCurrent(form);

}

protected void startApp() {

try {

if(player != null && player.getState() == Player.PREFETCHED) {

player.start();

} else {

defplayer();

display.setCurrent(form);

}

}

catch(MediaException me) {

reset();

}

}

protected void pauseApp() {

try {

if(player != null && player.getState() ==

Player.STARTED) {

player.stop();

} else {

defplayer();

}

}

catch(MediaException me) {

reset();

}

}

protected void destroyApp(

boolean unconditional) {

form = null;

try {

defplayer();

}

catch(MediaException me) {

}

}

public void playerUpdate(Player player,

String event, Object data) {

if(event == PlayerListener.END_OF_MEDIA) {

try {

defplayer();

}

catch(MediaException me) {

}

reset();

}

}

public void commandAction(Command c, Displayable d) {

if(c == start) {

start();

} else if(c == stop) {

stopPlayer();

}

}

public void start() {

Thread t = new Thread(this);

t.start();

}

// Для предотвращение блокировки, все действия

// по работе с сетью должны выполняться

// в отдельном потоке, а не в commandAction.

public void run() {

play(getURL());

}

String getURL() {

return url.getString();

}

void play(String url) {

try {

VideoControl vc;

defplayer();

// создаем плеер

player = Manager.createPlayer(url);

player.addPlayerListener(this);

player.realize();

vc = (VideoControl)player.getControl("VideoControl");

if(vc != null) {

Item video = (Item)vc.initDisplayMode(

vc.USE_GUI_PRIMITIVE, null);

Form v = new Form("Playing Video...");

StringItem si = new StringItem("Status: ", "Playing...");

v.append(si);

v.append(video);

display.setCurrent(v);

}

player.prefetch();

player.start();

}

catch(Throwable t) {

reset();

}

}

void defplayer() throws MediaException {

if (player != null) {

if(player.getState() == Player.STARTED) {

player.stop();

}

if(player.getState() == Player.PREFETCHED) {

player.deallocate();

}

if(player.getState() == Player.REALIZED ||

player.getState() == Player.UNREALIZED) {

player.close();

}

}

player = null;

}

void reset() {

player = null;

}

void stopPlayer() {

try {

defplayer();

}

catch(MediaException me) {

}

reset();

}

}

В методе play() реализованы следующие функции:

Cоздание экземпляра Player.

  • Регистрация мидлета как PlayerListener, поскольку наш мидлет переопределяет метод playerUpdate() интерфейса PlayerListener. Когда происходит какое либо событие, связанное с воспроизведением звука, все PlayerListener-ы получают соответствующее уведомление. Например, при завершении воспроизведения вызывается событие, обозначенное константой PlayerListener.END_OF_MEDIA.

  • Проверяет, был ли создан VideoControl. Если да, выполняет инициализацию компоненты экрана Item и добавляет ее на форму.

  • Выбирает плеер и запускает его.

Вы можете проверить работоспособность данного примера, используя J2ME Wireless Toolkit 2.0. Создайте новый проект и скопируйте исходный код в файл /apps/SimplePlayer/src/PlayerMIDlet.java. Выполните компиляцию и запустите мидлет. Для проверки можете использовать следующие URL адреса:

http://java.sun.com/products/java-media/mma/media/test-wav.wav

http://java.sun.com/products/java-media/mma/media/test-mpeg.mpg

Завдання

Проробити практичний матеріал, розглянутий в лабораторній роботі.

Розробити власний медіаплеєр для програвання файлів з телефона, створити список треків, та загружати файли згідно списку за вибором.

1) Описати Механізм обробки мультимедійної інформації.

2) Які MMAPI пакеты ви знаєте?

3) За допомогою яких функцій можливо організувати відтворення відео?

Лабораторна робота №8

Використання Game Builder для Java ME development

В цій роботі викладена інформація про розробку Java ME ігор за допомогою Netbeans Mobility Pack 6.0 і Game Builder tool. Ключове завдання цієї роботи - розкрити перед вами новий ігровий рівень Java.

Вступ

Ця лабораторна робота розрахована на те, що ви маєте знання або досвід програмування наступних технологій:

  • MIDP 2.0 / CLDC;

  • Netbeans IDE

з якими ви вже встигли ознайомитися в попередніх роботах.

Програмне забезпечення, потрібне для виконання роботи:

  • JDK;

  • Найостанніший випуск Netbeans 6 (Mobility Pack).

Робота з типовим проетом Game Builder:

Аби створити новий проект із зразків вибирають:

Samples -> Java ME (MIDP) -> Simple Game created with Game Builder

Відкрийте ігровий проект і розгляньте його елементи:

Ігровий проект може містити ряд сцен, дій та шарів різного рівню.

Поточний ігровий проект містить єдину сцену, що зветься “ліс”, який конструюється з 6 рівнів: 2 ельфи (дійові особи) і 4 плиткові рівні ландшафту.

Концептуально цю сцену можна розглядати як ігровий рівень в типовій грі.

На зображеному вище рисунку ми бачимо редактор сцени, який складається з декількох складових частин:

У центрі безпосередньо є редактор сцени:

Панель редактора займає більшу частину робочого екрана. Ми можемо перетягнути рівні сцени, аби змінити їх позиції у сцені, використовуючи маніпулятор «миша». Натиснувши правою кнопкою миші в редакторові, ми бачимо, що ряд додаткових функцій стають активними: додати і видалити рівні, також як і змінити різні атрибути рівня.

Над редактором сцени знаходиться панель інструментів, що містить ряд елементів:

  • Кнопка Source перемикає вікно в редактор текстів програм і дозволяє нам переглядати код Java, що згенерований заздалегідь;

  • Game Builder перемикає вікно назад до графічного вигляду;

  • Component combo box містить всі існуючі ігрові компоненти і дозволяє пересування між ними;

  • Create new Scene – кнопка створення нової сцени;

  • Create new TiledLayer – кнопка сворення нового рівня (шару зображення);

  • Create new Sprite – кнопка створення нового «персонажа».

У лівій нижній частині IDE знаходиться навігатор середовища Game Builder. Коли редактор сцени дії відкритий, навігатор складає багаторівневий список дій, елементів, атрибутів сцени, що мають до неї відношення:

  • Layer type – вказує на тип (персонаж або плиточний рівень середовища, ландшафт).

  • Z order - це порядкові рівні елементів. Треба відзначити, що елемент з індексом «0» знаходиться зверху над усіма іншими.

  • View — визначає, рівень видимий або прихований.

  • Lock - визначає, чи може рівень бути переміщеним по сцені або залишиться стаціонарним.

  • Name of the layer – ім’я рівня.

  • X position - позиція рівня відносно місця дії горизонтально.

  • Y position - позиція рівня відносно місця дії вертикально.

Додавання нового рівня до існуючої гри

Створення нової сцени

Аби додати інший рівень, ми можемо створити нове місце дії натиснувши кнопку “New Scene” на інструментальній панелі редактора сцени. Зверніться до місця дії “Desert ” і натисніть «OK». Це створить нове місце дії, яке не містить жодних рівнів.

Додавання існуючих персонажів

Ви можете додати існуючі рівні простим кліком усередині редактора сцени, додавши або персонаж, або плитковий рівень. Додайте двох існуючих персонажів, а саме “Karel” і “Thomas” до сцени. Зверніть увагу на те, що навігатор програми Game Builder відображає додавання, фіксуючи Z позицію персонажів, їх видимість і стан блокування.

Створення нового плиткового рівеня

Ця сцена – зовсім пуста, отож давайте створимо новий плитковий рівень ландшафту, який буде служити піщаним фоном. Аби зробити, це натисніть «Create new TiledLayer» на панелі інструментів редактора сцени.

В результуючому діалозі введіть «Sand» (пісок) як ім'я TiledLayer і виберіть зображення '/topviewtiles.png'. Розмір складає 16 x 16 пікселів, так що такий фон має виглядати прекрасно. Натисніть «OK».

На екрані з'являється Ваш TiledLayer (плитковий елемент ландшафту).

Редактор складається з декількох компонентів:

  • Інструментальна панель зверху, яка містить наступне:

  • Кнопка режиму забарвлення;

  • Кнопка режиму виділення;

  • Інформація про поточний TiledLayer.

  • Панель редактора в центрі

  • Animated tile list. Список анімованих фрагментів, розташований справа; його можна виристовувати наприклад для анімації лісу чи води.

  • Image resource panel. Панель вибору зображення знизу, яка дозволяє нам вибирати відповідний фрагмент (зображення) для нашої сцени.

Натисніть 'Paint mode' на панелі інструментів та виберіть 'sand' (пісок) розташований в панелі зображень (це індекс 1). Потім перетягніть мишу через панель редактора аби перенести вибране зображення на сцену. Зверніть увагу, що панель редактора автоматично розширюється, якщо ви наносите зображення на край сцени. Потім виберіть інше зображення (наприклад, індекс 2 або 3), нанесіть деякі трав'янисті або скелясті елементи. Коли ви закінчете роботу над забраженням сцени, ви повинні отримати щось на зразок сцени нижче:

Додавання нового плиткового рівня до сцени

Давайте додамо новий шар «пісок», який ми тільки що створили для сцени пустелі.

Щоб зробити це, виберіть сцену 'Desert' в блоці вибору, що знаходиться трохи вище за редактор. Натисніть правою кнопкою миші у середині редактора сцени і виберіть:

Add TiledLayer -> Sand.

Перетягніть плитковий «пісок» на сцені до позиції X,Y: 0, 0.

Коли ви перетягуєте плитковий рівень 'Пісок' над персонажами 'Karel' і 'Thomas', зверніть увагу, що він покриває їх повністю, ховає на сцені. Аби виправите це, потрібно підняти їх положення вище за пісок, це можна зробити за допомогою Z order у навігаторі. Результат нашої роботі повинен бути схожим на представлений нижче. Для того щоб легче було працювати з емулятором, розмістіть персожів у верхньому правому кутку.

На даному етапі ми створили новий і дуже простий ігровий рівень. Аби змусити новостворений рівень виконувати певні дії, операції протягом ігрового часу, нам потрібно виконати деяке кодування. Дуже зручно, що ми можемо лише завантажити код: http://wiki.netbeans.org/attach/CreatingJavaMEGamesWithGameBuilder/DemoGameCanvas.java і використовувати його у нашому проекті. Модифікований код перемкне гру в рівень «Пустеля», коли основний персонаж Karel підійде до нижнього правого кута сцени (рівня) «Ліс».

Завершення

Ця робота, звісно, не показала вам, як створювати новітні якісні ігри. Бігати персонажем по колу не верх бажань, проте ви маєте непогане стартове місце для проектування далі цього MIDP додатку.

Більше інформації про технології, використані в цій роботі, доступні на наступних сторінках:

  • MIDP Profile API JavaDoc (especially package javax.microedition.lcdui.game) http://java.sun.com/javame/reference/apis/jsr118/index.html

  • More Mobility Tutorial Drafts http://wiki.netbeans.org/wiki/view/DraftTutorials

Завдання

Проробити практичний матеріал, розглянутий в лабораторній роботі.

Розробити власний власний дизайн ігри. Змінити за бажанням один із аспектів гри, так наприклад при русі вгору персонаж зменшується, вниз-збільшується

Відповісти на наступні питання:

1) Що представляє собою Game Builder: описати елементи вікна програми.

2) За що відповідає графа Z-order у навігаторі?

3) Опишіть процес створення нового плиткового рівню?

4) Як додати та змінити параметри нового персонажа?

Дополнения

Додаток № 1

NetBeans 6.5 - бесплатная IDE для разработки J2ME приложений

Ниже будет рассказано, как использовать NetBeans IDE 6.5 для создания Java™ 2 Platform, Micro Edition MIDP приложений. Будут показаны все необходимые при работе с новым проектом базовые шаги. Мы создадим проект "MyHello", который будет выводить текст "Hello World" в окне эмулятора.

Создание нового проекта

В состав NetBeans IDE входит мастер, автоматизирующий процесс создания MIDP проектов. Вам будет предложен выбор: воспользоваться визуальным редактором (MIDP Visual Designer) или редактором исходного текста (Source Code Editor).

Использование визуального редактора позволит Вам спланировать уровни приложения и создать формы пользовательского интерфейса, которые будут использоваться в приложении. Дизайнер автоматически сгенерирует код приложения. Этот подход имеет одно ограничение: если Вы редактируете сгенерированный код в Source Editor, то не можете затем вернуться к редактированию в Visual Designer. Кроме того, вам придется использовать методы повторного возврата, чтобы создать блоки препроцессора для конфигурации Вашего проекта.

Используя Source Editor, Вы вручную создаете код Вашего мидлета. Source Code Editor дает вам больше гибкости при редактировании кода и возможность создать блоки кода препроцессора.