|
|
||
|
Музыка по жанрам Еще по теме
Материалы о музыке
|
Теги страницы: Одним из самых трудных аспектов программирования, используя DirectPlay, является то, что DirectPlay - это мноюноточиык компонент. Одним из самых важных для понимания следствий этого, является то, что DirectPlay может вызывать вашу функцию обратного вызова одновременно из нескольких различных потоков. Это значит, что вы должны обеспечить корректную работу вашей функции обратного вызова с потоками. Если вы меняете глобальные данные (например, все, что не объявлено на стеке или объявлено глобально), эти изменения должны производиться внутри критической секции или какого-либо другого примитива синхронизации потоков. Отсоединение. Когда ваш игрок решает отсоединиться от вашей игры, вы должны обеспечить вызов метода Close интерфейса [DircctPla) SPeet, чтобы DirectPlay имел возможность сообщить всем остальным, что этот игрок уходит. Также вам нужно вызвать метод Close для lobby интерфейса IDiroclPlaySL-cbbicdAppdication. После того как вы закрыли оба, вы можете освобождать их, вызывая их методы Release или используя макрос. Использование CNetConnectWizard. Предыдущие три этапа могут потребовать написания большого объема кода. Поняв это, Microsoft включила как часть DirectX SDK пару классов C++, созданных специально для облегчения реализации стандартных процедур по настройке DirectPlay и подсоединении к игре. Класс, который нам нужен, называется CNetConnectWizard и доступен в директории Samples вашей инсталляции DirectX. Он прекрасно справляется с работе!! по обеспечению вашему пользователю выбора поставщика услуг и к существующей игре или созданию новой. Единственным недостатком является то, что все это делается с помощью серии стандартных диалоговых окон. Ваша игра может предоставить выбор этих опции игроку, используя собственный GUI, с красиво выглядящими кнопками и бегунками. Простого пути, чтобы сделать это с помощью «мастера» (wizard) не существует, поэтому в таких случаях вам придется писать код самим. Но если вы не имеете ничего против использования стандартных диалоговых окон внутри вашей игры, вы можете использовать CNetConnectWizard, чтобы сэкономить время. Создание и инициализация. Я специально не хочу говорить о лобби в общем и о I DirectPIay SLobbiet Application в частности; лобби - это продвинутая возможность DireelPIay, с которой вам нужно работать только в том случае, если вы хотите, чтобы ваша игра запускалась из программы просмотра игр (game-browsing). Лобби - это механизм для передачи соединений и настроек игры от одной программы другой. Если вы заинтересовались, то вы можете подробнее познакомиться с ним в документации DirectX, но все, что вам нужно знать для этой главы, - это то, что CNetConnectWizard требует интерфейс лоббируемого приложения. Обработка получения функции обратного вызова. CNetConnectWizard может работать только в том случае, если он может обрабатывать сообщения DirectPIay. Это значит, что, когда DirectPIay использует функцию обратного вьгюва, вы должны передать методу MessageHandler класса CNetConnectWizard те же самые аргументы, что DirectPIay передал вашей функции обратного вызова. Интерфейс DirectPlay81..obbiedApplicatioii требует функции обратного вызова так же, как и интерфейс CNetConnectWizard должен аналогично отследить эту функцию. Обе процедуры отслеживания показаны в следующем коде, взятом из HRESULT WINAPI OnDirectPlayMessage. Функция обратного вызова On DireclPIayl.obby Message для интерфейса IDirect- ]!lay8LobbiedApplicatior не делает никакой обработки вообще - она просто передает все, что получила, напрямую «мастеру». Функция обратного вызова для интерфейса тем не менее, отслеживает определенные типы сообщений, обрабатывает их и после дает «мастеру» возможность сделать то же самое и вернуть какое- либо значение. Установка значений по умолчанию и «мастера». После того как вы создали и дали ему возможность отслеживать вызовы ваших функций обратного вызова интерфейсов IDirectPloyS/'eei' и 1 DirectPlay SLobhiedApplication, вы готовы к выставлению значений по умолчанию, отображению его диалогов и запросов к пользователю о выборе. Как вы видите, код устанавливает значения по умолчанию для «мастера», вызывая методы SetPlaycrName. SetSessionName и SctPreferredProvider. Эти величины по умолчанию будут выставлены в диалоговых, отображаемых пользователю. Все важное происходит в DoCoimectWizas'd, Когда вы вызываете этот метод, отображаются диалоги «мастера» и пользователь совершает свой выбор. Метод возвращает если работа завершилась с ошибкой, значит, что-то пошло не так. Если HRESULT равен NCW S_ QIJIT, то это значит, что пользователь решил выйти или закрыть «мастер» до того, как он завершил свою работу. Обычно это значит, что пользователь решил совсем покинуть многопользовательскую игру, так что вам нужно будет вернуть его к основному меню вашей игры или выйти, как в случае примера программы Chl6pl_VoiceChat. Если пользователь сделал все до конца, то класс CNetConnectWizard автоматически вызовет один из двух методов Host или Connect интерфейса lDirectPlaySPeer. Другими словами, он все сделает за вас! Если вы хотите сохранить величины, которые выбрал пользователь, чтобы они стали значениями по умолчанию, вы можете получить нх. вызвав методы GetPIayer- Name, GelSessiouName и GetPreferredProvider. После этого просто сохраните их в регистре или в файле настроек и прочитайте перед следующим запуском «мастера». Также вы можете вызвать метод IsHost, чтобы определить, является ли пользователь хостом новой игры. Завершение работы «мастера». Когда вы закончили работу с «мастером», завершение работы сводится к вызову метода Shutdown и последующего удаления собственно экземпляра объекта (через вызов delete или использование макроса. ПрограммцроВание DirectPlay Voice. После того как вы разобрались с коротким обзором DirectPlay, вы можете начать работать с целью этой главы - DirectPlay Voice для реализации голосового общения между игроками в реальном времени в вашей игре. Во многом DirectPlay Voice - это зеркальное отражение DirectPlay. Существует функция обратного вызова для сообщений DirectPlay Voice, так же, как и различные интерфейсы для голосовых клиентов (IDirectPlayVoiceClient) и серверов (IDir.x't- PlayVoicc Server). Также доступен маленький интерфейс IDirectPlayVoiceTest всего лишь с одним методом — Check AudioSdup. Этот метод запускает «мастер» аудио настроек DirectPlay, чтобы пользователи могли настроить громкости записи и воспроизведения и указать, какое аппаратное обеспечение (вход микрофона) использовать для записи. |
|