Форум: "Игры";
Текущий архив: 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