Игра по сети: использование DirectPlay

[Уголок DirectX]   [Следующая часть]


Прежде, чем начать

Привет всем! Продолжаем изучать DirectX и в этот раз я попробую помочь вам создать приложение (игру, если уж быть точным) в которой будет работать сетевой мультиплеерный режим. Если вы собираетесь делать деловое приложение, которому нужно общение по сети, изучите лучше Microsoft Winsock Control, однако если вы делаете игру, то DirectPlay здорово облегчит вам задачу.

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

Как бы там ни было,

Приятного программирования, Antiloop

Основные понятия

Microsoft DirectPlay - это набор функций API, которые позволяют приложениям для Windows создавать коммуникации через локальные сети. DirectPlay - это также технология, которая упрощает создание игровых серверов.

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

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

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

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

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

Существует два основных способа поддержания соединения и постоянного обновления сессии:

  • Peer-to-peer. Или соединение равноправных узлов, отличающееся отстутствием какого-либо сервера. При таком способе каждый компьютер имеет собственную копию состояния мира и всех игроков. То, что происходит на каждом компьютере доносится до всех остальных компьютеров в сессии. Не существует одного, ответственного за все компьютера.
  • Client/Server. Это распространенный способ, при котором один компьютер отвечает за все: сам обновляет мир, устраняет конфликты и т.д. Все остальные компьютеры при этом - клиенты. Они загружают нужные части состояния мира, а когда надо поменять состояние с их стороны, они говорят об этом серверу, который доносит изменение до всех остальных компьютеров по необходимости.

С DirectPlay вы можете создавать и управлять обоими типами соединения peer-to-peer и client/server. DirectPlay имеет полный набор инструментов, которые необходимы для написания полнофункционального сетевого приложения.

 

Ступени в создании простого приложения DirectPlay

1. Инициализировать DirectPlay.
Приложение прежде всего должно создать объект DirectPlay4, вызовом процедуры DirectX7.DirectPlayCreate. Методы класса DirectPlay4 будут использованы вами для дальнейшей работы.

2. Перечислить доступные сетевые протоколы.
Приложение может найти все доступные сетевые протоколы через метод DirectPlay4.GetDPEnumConnections. Обычно, все доступные протоколы показываются пользователю в лист-боксе, из которых он выбирает то, которое ему подходит.

3. Инициализировать соединение
Когда пользователь выбрал протокол, приложение вызывает метод DirectPlay4.InitializeConnection. В этом месте для работы протокола может потребоваться ввести дополнительную информацию, например для модема надо ввести телефонный номер.

4. Создать, или подсоединиться к существующей сессии
Обычно приложение дает игроку возможность либо самому создать сессию или, если установлено соединение, подсоединиться к существующей. Чтобы получить список существующих сессий используется метод DirectPlay4.GetDPEnumSessions. Методы DirectPlay4.Open или DirectPlay4.SecureOpen используются для создания новой или подключения к существующей сессии. Приложение, которое создает сессию автоматически к ней само подключается и становится хостом.

5. Создать игрока
Когда приложение является частью сесии, оно должно создать как минимум одного игрока для идентификации себя и участии в обмене сообщениями. Это делается с помощью метода DirectPlay4.CreatePlayer. Когда игроки созданы, они могут быть перечислены с помощью DirectPlay4.GetDPEnumPlayers. Приложению может понадобиться это например для того, чтобы отобразить список всех участвующих в сессии игроков. Игроки также могут быть собраны в группы и подгруппы.

6. Начать игру
Приложение определяет, когда и как игра (или другой вид сессии) начинается. Хосту может быть разрешено начать игру в любое время после того, как было достигнуто некое согласие всех игроков или игра может автоматически начаться, после того как присоединится определенное количество игроков. Хост разносит определенное сообщение всем другим игрокам о том, что игра началась. После этого, игроки начинают обмениваться сообщениями для постоянного обновления состояния игры, используя методы DirectPlay4.Send, DirectPlay4.SendEx и DirectPlay4.Receive.

[Вверх]