Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Вниз

DirectPlay8   Найти похожие ветки 

 
ko@ndrew   (2002-05-16 16:18) [0]

Уважаемые Мастера Delphi!

У меня возникла небольшая проблема при попытке применения в своём проекте интерфейса IDirectPlay8Client : при перечислении сеансов нужно указывать URL-адрес сервера. А как сделать так, чтобы перечислить все имеющиеся серверы в текущей подсети?
Заранее спасибо.


 
cyborg   (2002-12-02 12:30) [1]

ЛЮДИ! Помогите пожалуйста найти стоящую документацию с примерами по использованию DirectPlay8, особенно создание соединения IDirectPlay8Peer. На MSDN-е микрософтском был, но там кусками примеры, а качать полный SDK с примерами не имеется возможности, замучался уже по тем кускам делать, в конце концов думаю и так дойду, но с вашей помощью было бы лучше.
Может у кого есть данный SDK, пришлите пожалуйста экземпляр примера создание и работа с таким соединением.


 
cyborg   (2002-12-02 12:38) [2]

Кстати может кто подскажет что нужно этой штуке:
hRet:=iDP8.Host(@DPN_APPLICATION_DESC,PIDirectPlay8Addresses(iDP8Address),1,nil,nil,nil,0);

Вылезает ошибка уже на это грешил: PIDirectPlay8Addresses(iDP8Address), потом с этим @DPN_APPLICATION_DESC по разному делал, теперь такое ащущение, что нужно "правильно" указать в записи DPN_APPLICATION_DESC.guidApplication GUID аппликации какой-то, но какой ни в MSDN-е не сказано и вообще нигде, почему "правильно" в кавычках, а хрен знает как это правильно, что ей нужно.


 
cyborg   (2002-12-02 12:44) [3]

Вот весь код который расковырял, начало инициализации уже работает:
unit BombastikDirectPlay;
//Пример тут:
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dx8_c/directx_cpp/play/CPP_Tut/Tutorial1_EnumerateSP.asp

interface
Uses
SysUtils,
GameLogger,
BombastikTypes,
Windows,
DirectPlay8;
VAR
Err : Integer;

iDP8 : IDirectPlay8Peer = nil;
iDP8Address : IDirectPlay8Address = Nil;

SPInfoBuffer : PDPN_SERVICE_PROVIDER_INFO = nil;
SPInfoBufferEnum : PDPN_SERVICE_PROVIDER_INFO = nil;
pcbEnumData: LongWord = 0;
pcReturned: LongWord = 0;

DPN_APPLICATION_DESC : TDPN_APPLICATION_DESC;


implementation

function DPNMessageHandler(pvUserContext: Pointer; dwMessageType: LongWORD; pMessage: Pointer): HResult; stdcall;
Begin
Result:=DPN_OK;
End;

procedure ClearDirectPlay;
begin
if iDP8Address<>Nil then
begin
iDP8Address.Clear;
// iDP8Address._Release;
iDP8Address:=Nil;
end;
if iDP8<>Nil then
begin
iDP8.Close(0);
iDP8._Release;
iDP8:=Nil;
end;
if SPInfoBuffer<>Nil then
begin
FreeMem(SPInfoBuffer,pcbEnumData);
SPInfoBuffer:=nil;
end;
end;

function InitDirectPlay : boolean;
var
i : integer;
begin
ClearDirectPlay;
Result:=false;
//Создание интерфейса IDirectPlay
if iDP8=nil then
begin
hRet:=DirectPlay8Create(IID_IDirectPlay8Peer, iDP8, nil);
if hRet <> DPN_OK then
begin
LogError("Интерфейс DirectPlay8 не создан: "+DPErrorString(hRet),"InitDirectPlay [DirectPlay8Create()]");
ClearDirectPlay;
Exit;
end;
end;

hRet:=iDP8.Initialize(Nil,DPNMessageHandler,DPNINITIALIZE_DISABLEPARAMVAL);

hRet:=iDP8.EnumServiceProviders(nil, nil, nil, pcbEnumData, pcReturned, 0);
GetMem(SPInfoBuffer,pcbEnumData);
hRet:=iDP8.EnumServiceProviders(nil, nil, SPInfoBuffer, pcbEnumData, pcReturned, 0);
if hRet <> DPN_OK then
begin
LogError("EnumServiceProviders: "+DPErrorString(hRet),"InitDirectPlay");
end;
SPInfoBufferEnum:=SPInfoBuffer;
for i := 0 to pcReturned-1 do
begin
LogStatus(SPInfoBufferEnum^.pwszName,"");
inc(SPInfoBufferEnum);
end;

if iDP8Address=nil then
begin
hRet:=DirectPlay8AddressCreate(IID_IDirectPlay8Address, iDP8Address, nil);
if hRet <> DPN_OK then
begin
LogError(DPErrorString(hRet),"InitDirectPlay [DirectPlay8AddressCreate()]");
ClearDirectPlay;
Exit;
end;
end;

hRet:=iDP8Address.SetSP(@CLSID_DP8SP_TCPIP);


ZeroMemory(@DPN_APPLICATION_DESC,SizeOf(TDPN_APPLICATION_DESC));
DPN_APPLICATION_DESC.dwSize:=SizeOf(TDPN_APPLICATION_DESC);
// DPN_APPLICATION_DESC.dwFlags:=;
// DPN_APPLICATION_DESC.guidInstance:=;
Вот тут хрен знает что писать:
DPN_APPLICATION_DESC.guidApplication:=IDirectPlay8Peer;
DPN_APPLICATION_DESC.dwMaxPlayers:=2;
// DPN_APPLICATION_DESC.dwCurrentPlayers:=;
DPN_APPLICATION_DESC.pwszSessionName:="Bombastik";
DPN_APPLICATION_DESC.pwszPassword:="bomb";
// DPN_APPLICATION_DESC.pvReservedData:=;
// DPN_APPLICATION_DESC.dwReservedDataSize:=;
DPN_APPLICATION_DESC.pvApplicationReservedData:=nil;
DPN_APPLICATION_DESC.dwApplicationReservedDataSize:=0;
А тут появляется ошибка, короче жопа:
hRet:=iDP8.Host(@DPN_APPLICATION_DESC,PIDirectPlay8Addresses(iDP8Address),1,nil,nil,nil,0);

Result:=True;
end;
Initialization
iDP8:=Nil; SPInfoBuffer := nil;
pcbEnumData:=0; pcReturned:=0;
InitDirectPlay;
Finalization
ClearDirectPlay;
end.

ПОМОГИТЕ пожалуйста, три дня делал сокетное соединение, оно готово всё работает чики пуки, да сделал на TCP/IP, там задержка оказалась очень большая, до двух секунд доходит, вот решил через DirectX сделать.


 
Sapersky_   (2002-12-02 16:37) [4]

2cyborg:
Хм... неужто сокеты и вправду так тормозят? В принципе, реализованы что они, что DirectPlay на одном и том же WinSock.
Начиная с 6-го Delphi вроде есть и компоненты для UDP, если TCP/IP не нравится.
Относительно DirectPlay... на http://www.crazyentertainment.net была библиотека GameNet... раньше :(. Потом их хакнули и теперь там только заголовки к DX :(.
Но я успел скачать :), так что если надо, могу прислать. Или, может, выложить на DelphiGFX. Кто "за", напишите здесь.
Сама библиотека мне не очень понравилась, но в качестве основы, чтобы знать, куда копать - возможно, будет полезна.


 
Mirovodin   (2002-12-02 16:51) [5]

2 Sapersky_ Я могу выложить.


 
cyborg   (2002-12-02 19:17) [6]

Sapersky_ Да делал я на TCP, а не на UDP, честно говоря не знаю как повлияет не гарантированная доставка, скорее всего можно обойтись и без гарантий, если делать всю обработку данных игры на сервере, DirectPlay как я понял работает как раз на UDP, только не понятно у него есть механизмы гарантированной доставки или нет, да и создание игроков и пр. проще, хотя я уже в этом сомневаюсь :), проще сделать сокетное соединения с собственной обработкой.
Что интересно я такой задержки добился не в сети, а у себя на компьютере под ВинХР. Две копии игры запустил, сделано было так, клиент посылает серверу данные о нажатых кнопках, умещалось это дело всего в двух байтах, первый байт - ID пакета, второй сами нажатые кнопки, сервер обрабатывал это дело и передавал данные объектов игры клиенту, эти данные были размером в 35 байт, клиент их получал и изменял статус объектов. Посылалось и получалось всё это дело 25 раз в секунду, итого от сервера шёл траффик 875 байт в секунду. Так вот, на экране клиента герой двигался где-то после двух секунд с момента нажатия, это примерно секунду идёт информация на сервер и секунду обратно. Что я не пойму, и это странно, почему на локальном компьютере такая большая задержка. После, увидев такие реультаты переделал, стало по другому, теперь клиент и сервер посылают друг другу только информацию своего персонажа, теперь на вид якобы никакой задержки нет, и клиент и сервер ходят, но на самом деле задержка очень плохо будет влиять на синхронизацию игры, например у клиента взорвалась бомба и по координатам серверного игрока серверный игрок убит, хотя на сервере игрок уже прошёл путь примерно равный секунде, серверу посылается сообщение что он убит, а игрок на сервере изумлённо смотрит как этот его убили, когда он уже давно прошёл место взрыва. :). Вот такие проблемы. Уже который месяц ищу информацию про создание реалтайм игр по сети, технологии какие и т.д. АБСОЛЮТНО ничего подобного в интернете нет, по крайней мере поисковики ничего подобного не находят, может я какие слова не правильные набираю? Уже самому в голову приходят потихоньку мысли по таким взаимодействиям, вот примерно часа три назад пришла мысль как можно одновременно взрывать бомбы у игроков не смотря на задержки, хотя ещё не так всё ясно, например как начинать игру у обоих одновременно?

Нашёл вот очень интересную информацию по использованию DirectPlay, но версии DirectX7, в восьмой версии уже другие интерфейсы, один из них IDirectPlay8Peer думаю как раз для моей игры на 2 игрока.
Думаю многим заинтересованным будет интересна:
http://pmg-ru.narod.ru/russian/dplay.htm

У кого какие мысли, пожалуйста поделитесь, может кто уже делал, хоть на Delphi хоть на C++, главное работающие примеры показали. Может у кого какие мысли есть по другим технологиям, может кто реалтайм игру с сокетным соединением делал?


 
cyborg   (2002-12-02 19:28) [7]

Sapersky_ насчёт библиотеки GameNet лучше её выложить на DelphiGFX, пользы больше будет!


 
cyborg   (2002-12-02 19:45) [8]

И ещё, что такое лобби? :)


 
Sapersky_   (2002-12-03 22:57) [9]

Нашёл ссылку на GameNet (посмотрел в readme :)):

http://www.zoksoftware.de

Или, если конкретнее,

http://type4.homeip.net/res/index.php?section=gamenet

2cyborg:
DirectPlay может работать и на UDP, и на TCP/IP. Для каждого сообщения (или для каждого типа сообщений) можно указывать, гарантируется доставка или нет. И, что весьма ценно, DirectPlay сам делает фрагментацию/дефрагментацию сообщений (при интернет-соединении или вообще при любом TCP/IP - не помню точно - посылаемое сообщение может быть разбито на несколько фрагментов, или несколько сообщений слеплены в одно). Дельфийские сокеты - не делают.
Посылку сообщений, ИМХО, лучше делать не по таймеру, а по принципу "запрос-ответ", а в промежутках между сообщениями клиент должен сам всё считать на основе той информации, которая у него есть... Хотя не уверен - на практике толком не проверял.
Относительно синхронизации - да, проблема, нужно экстраполировать в зависимости от того, сколько идёт сообщение (брать средний ping или ещё как-то). Для одновременного начала игры - можно на несколько первых тактов сделать блокировку управления, чтобы сразу не пошла рассинхронизация. Была в журнале Game.exe статья, но там, конечно, только теория.
Что такое лобби - сам толком не понял :( Что-то вроде менеджера соединений, наверное. Ясно одно - использовать это не обязательно...

Кстати, о бомберменах (Bombastic)... Вот тут:

http://minebombers.narod.ru

люди страдают без новой (в т.ч. сетевой) версии одной хорошей игры на ту же тему. Я собирался, ещё один человек что-то делал, но... похоже, не судьба :(((
Может, подхватишь упавшее знамя? :) Могу поделиться наработками - генерация попиксельной карты, ещё кое-что...


 
cyborg   (2002-12-04 00:20) [10]

Sapersky_ спасибо тебе большое, судя по описанию GameNеt - это то, что нужно, сейчас всё закачаю, просмотрю, завтра-послезавтра напишу свои ащущения по этому поводу :)


 
cyborg   (2002-12-04 23:20) [11]

Sapersky_ спасибо тебе большое :) за эту ссылку на GameNet, вроде разобрался уже что к чему, то что тебе этот модуль не понравился у меня тоже самое ащущение, как-то неудобно сделан по моему мнению.
Мой код выше правильно написан, пропустил только вот это:
hr := AddrServer.BuildFromURLA( PChar( DPNA_HEADER + DPNA_KEY_HOSTNAME+DPNA_SEPARATOR_KEYVALUE+"localhost") );
hr := AddrServer.BuildFromURLA( PChar( DPNA_HEADER + DPNA_KEY_PORT + DPNA_SEPARATOR_KEYVALUE + IntToStr(Port)) );

Почему-то в одной строке с разделителем сервер не принимает, пришлось в два захода.

Теперь вроде всё инициализируется нормально, только ещё до подключения клентов не дошёл, ну ничё, потом сюрприз будет :)

Многое ещё не понятно, там комментариев очень мало :(

Насчёт режима игры, думаю сделать серверный вариант, т.е. сервер всё считает и посылает змечения клиентам, так проще программировать, и синхронизация не нужна, и начало игры тоже не нужно синхронизровать, единствнный недостаток такой игры, это клиентам с большой задержкой будет неудобно управлять, так как не сразу отображаться движения будут, кто играл в NeedForSpeed3 по модему те поймут ;). А вот если играть по локалке, говорят там задержка где-то 20-50 миллисекунд, у меня её нет поэтому не знаю точно, при 25 кадрах в секунду смена кадров получаетя в 40 миллисекунд, клиент даже не заметит никакой задержки, пара-тройка кадров даже на глаз не заметна.

Если кому интересно будет, возможно в будущем выложу мой модуль для DirectPlay8ClientServer.


 
cyborg   (2002-12-07 00:41) [12]

Sapersky_ выручай пожалуйста :)
Уже замучался, сделал всё инициализируется, работает. Сервер вроде работает, так как он подключается сам к себе, т.е. приходит сообщение о появлении нового игрока, клиентом делаю EnumHosts, даже серверу приходят запросы DPN_MSGID_ENUM_HOSTS_QUERY затем клиенту приходит сообщение DPN_MSGID_ASYNC_OP_COMPLETE, как я понял это сообщене о завершении обнаружения хостов, но в ответ от сервера сообщения о текущем сервере не приходят. В GameNet вроде чат работает, но там я не нашёл код, где сервер посылает ответ на запрос DPN_MSGID_ENUM_HOSTS_QUERY, хотя мне кажется, что его нужно посылать. Что делать? Помоги пожалуйста, если нужно код показать, пришлю модуль на указанный E-Mail.


 
Sapersky_   (2002-12-08 12:46) [13]

Увы и ах, никакого практического совета дать не могу, т.к. сам в своё время застрял на каком-то ASYNC_OP, наверное, именно этом :( - в результате так и не дописал свою единственную программу на DirectPlay :(. А сейчас возиться с этим мне некогда.

Вот чисто теоретические измышления:

GameNet не обрабатывает DPN_MSGID_ENUM_HOSTS_QUERY, но он обрабатывает DPNMSG_ENUM_HOSTS_RESPONSE - насколько я понял, это ответ на ENUM_HOSTS_QUERY, который (вроде бы) посылается автоматически самим DirectPlay. Ну сам читай:

Microsoft® DirectPlay® sends the DPN_MSGID_ENUM_HOSTS_RESPONSE message to a peer or client"s message handler to convey the host"s response to an enumeration request.

(Convey - переправлять, перенаправлять)

Т.е. обработчик ENUM_HOSTS_QUERY написать можно (чтобы отправлял данные об игре, например - клиент их будет получать в ENUM_HOSTS_RESPONSE) - но необязательно.
Если приходит ASYNC_OP_COMPLETE и не приходит ENUM_HOSTS_RESPONSE - что-то с настройками соединения, порты разные или ещё что... надо проверить EnumHosts (его параметры), создание клиента, да и сервера тоже... м-да.

В таких случаях можно сделать следующее: взять работающий код (GameNet) и медленно-медленно вносить в него изменения, тестируя после каждого. Неудобно, но больше, вроде, ничего не остаётся.

Или спросить ещё на каком форуме - gamedev.ru,
http://pub137.ezboard.com/fmrgamemakerfrm0


 
[Baradoo]   (2003-01-15 22:14) [14]

ТОЖЕ ИНТЕРЕСНАЯ ТЕМА!


 
cyborg   (2003-01-16 00:12) [15]

Предупрежу тех кто будет в этом разбираться :), много проблем приносит то, что компьютер не подключён к сети или интернету, оно просто не работает ;), много же нервов у меня ушло, пока не дошло в чём дело. И ещё основные проблемы с неправильной установкой флагов.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.031 c
4-84850
Airdriver
2003-04-26 12:34
2003.06.26
---|Ветка была без названия|---


8-84462
sherlock
2003-03-15 18:06
2003.06.26
Чтение MP3 файлов.


8-84454
Smok_er
2003-03-11 19:10
2003.06.26
Конвертирование BMP -> TIFF


14-84567
VEG
2003-06-06 20:02
2003.06.26
YES!!!


1-84079
snower
2003-06-08 00:40
2003.06.26
передать в dll





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский