Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Создание игр для мобильных телефонов - Майкл Моррисон

Создание игр для мобильных телефонов - Майкл Моррисон

Читать онлайн Создание игр для мобильных телефонов - Майкл Моррисон

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 54 55 56 57 58 59 60 61 62 ... 87
Перейти на страницу:

Сетевое программирование и J2ME

Сетевое программирование в мидлетах выполняется с помощью MIDP API, которое носит название Generic Connection Framework или GCF. Цель GCF – обеспечить необходимый уровень абстракции для сетевых сервисов, которые помогают различным устройствам поддерживать специальные протоколы.

Хотя GCF структурирован иначе, он является подмножеством J2SE API. GCF описывает один фундаментальный класс, который называется Connector. Он используется для установления всех сетевых соединений мидлетом. Особые типы соединений моделируются интерфейсами, доступ к которым можно получить через класс Connector. Класс Connector и интерфейсы соединений находятся в пакете javax.microedition.io. Ниже приведено описание некоторых их интерфейсов:

► ContentConnection – потоковое соединение, которое обеспечивает доступ к данным из Web;

► DatagramConnetction – датаграммное соединение, используемое для реализации пакетно ориентированных соединений;

► StreamConnection – двунаправленное соединение с другими устройствами.

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

static Connection open(String name) throws IOException

Параметр, передаваемый в этот метод, – это строка соединения, которая определяет тип создаваемого подключения. Строка соединения описывается так:

Схема:Цель[;Параметры]

Параметр «Схема» – это название сетевого протокола, например, http или datagram. Параметр «Цель» – обычно адрес в сети, но может изменяться в соответствии с особыми типами протоколов. Последний параметр – это список параметров подключения. Ниже приведены строки соединений для различных типов подключений:

HTTP – "http://www.stalefishlabs.com/"

Socket – «socket://www.stalefishlabs:1800»

Datagram – «datagram://:9000»

File – «file:/stats.txt»

Помните, несмотря на то что приведенные примеры – это возможные строки соединения, только одна из них поддерживается реализацией MIDP – первая строка. Согласно спецификации MIDP поддерживается лишь HTTP-соединение. Если вы уверены, что другая реализация MIDP поддерживает какое-либо еще соединение, то вы можете использовать его. В противном случае вы должны создавать только HTTP-соединения, что, надо сказать, не очень хорошо для создания мобильных сетевых игр.

Метод open() возвращает объект типа Connection, который является базовым интерфейсом для всех интерфейсов соединений. Чтобы использовать определенный тип интерфейса соединения, необходимо преобразовать тип Connection к нужному. Следующий код иллюстрирует использование интерфейса DatagramConnection для создания датаграммного соединения:

DatagramConnection dc = (DatagramConnection)Connector.open(«datagram://:5555»);

...

Совет Разработчику

Число 5555 в примере, – это сетевой порт, используемый датаграммным подключением. Номер порта может быть любым, но больше 1024. Очень важно, чтобы клиент и сервер мидлета соединялись через один и тот же порт.

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

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

Чтобы использовать датаграммы для коммуникации через телефонную сеть, необходимо разделить данные на отдельные части – пакеты. Когда мобильные игры передают информацию через датаграммное соединение, они на самом деле отправляют и принимают пакеты. Датаграммные пакеты разработаны так, что они хранят массив байтов, поэтому любые данные в вашем пакете должны быть преобразованы в массив байтов. Когда вы создаете объект типа Datagram, необходимо определить число байтов, помещаемых в пакет. Ниже приведен пример создания объекта Datagram, способного хранить 64 байта информации:

Datagram dg = dc.newDatagram(64);

В этом коде объект Datagram создается вызовом метода newDatagram объекта соединения. Параметр метода newDatagram() – это размер датаграммы в байтах. Такой метод хорошо подходит для приема информации в играх. Другой подход к созданию датаграммы – это создать и заполнить датаграмму в одной строке. Этот метод хорошо подходит для отправления информации, когда у вас есть данные для отправки. Многие игры для коммуникации используют сообщения, при этом каждая строка должна быть преобразована в байтовый массив перед тем, как будет сохранена в датаграмме:

String message = «GameOver» byte[] bytes = message.getBytes();

В этом коде строка «GameOver» преобразуется в массив байтов, который сохраняется в переменной bytes. Для создания датаграммы используется другой вариант метода newDatagram():

Datagram dg = dc.newDatagram(bytes, bytes.length);

В этом коде массив байтов игровых данных передается первым параметром в метод newDatagram(), а его длина – вторым параметром. В ряде случаев (пакет пересылается от сервера к клиенту) необходимо использовать совершенно другой вариант метода newDatagram():

Datagram dg = dc.newDatagram(bytes, bytes.length, address);

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

...

В копилку Игрока

В этой главе вы познакомитесь с еще более сложным методом создания датаграмм для сервера и клиента, когда будете работать над мидлетом Lighthouse.

Отправка пакетов датаграммы

Интерфейс DatagramConnection предоставляет единственный метод для отправки пакетов датаграммы. Я говорю о методе send(), который очень просто использовать. На самом деле все, что необходимо для отправки пакета, – это лишь одна строка кода:

dc.send(dg);

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

// Преобразовать строку в массив байтов

byte[] bytes = message.getBytes();

// Отправить сообщение

Datagram dg = null;

dg = dc.newDatagram(bytes, bytes.length);

dc.send(dg);

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

Получение пакетов датаграммы

Получение пакета датаграммы похоже на отправление пакета, оно выполняется методом интерфейса DatagramConnection. Этот метод называется receive(), в качестве параметра он принимает объект Datagram, точно так же, как send(). Ниже приведен пример использования метода receive() для получения датаграммы:

dc.receive(dg);

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

// Попытка получения пакета

Datagram dg = dc.newDatagram(64);

dc.recieve(dg);

// Убедиться, что датаграмма содержит информацию

if (dg.getLength() > 0) {

String data = new String(dg.getData(), 0, dg.getLength());

}

Важно отметить, что в этом коде полученная датаграмма проверяется методом getLength(). Такая проверка важна, поскольку необходимо знать, есть ли данные в датаграмме. Если данные есть, то датаграмма конвертируется в строку и сохраняется в переменной data. Затем эти данные можно обработать специальным кодом.

Создание примера Lighthouse

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

Одним из способов коммуникации маяков с экипажами корабля была азбука Морзе – очень удобный способ передачи слов и букв последовательностями «точек» и «тире». Точка – это короткий визуальный или звуковой сигнал, например, вспышка света или металлический звук. Тире по длительности приблизительно равно трем точкам, что соответствует более длительному звуку или вспышке света. Последовательность точек и тире задает отдельные слова. Ниже приведены коды азбуки Морзе.

A – . – J – . – – – S – . . . 1 – . – – – -

B – – . . . K – – . – T – – 2 – . . – – -

C – . – . L – . – . – U – . . – 3 – . . . – -

D – – . . M – – – V – . . . – 4 – . . . . -

E – . N – – . W – . – – 5 – . . . . .

F – . O – – . X – – . . – 6 – – . . . .

G – – – . P – . – – . Y – . – . – 7 – – . . .

H – . . . . Q – – – . – Z – – – . . 8 – – – – . .

I – . . R – . – . 0 – – – – – – 9 – – – – – .

Используя эти коды, вы можете составлять слова и предложения. После каждой буквы следует небольшая пауза, а в конце предложения – более продолжительная. Ниже приведен код слова «hello» в азбуке Морзе:

1 ... 54 55 56 57 58 59 60 61 62 ... 87
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Создание игр для мобильных телефонов - Майкл Моррисон.
Комментарии