Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Написать сетевой режим.


Автор: Yoda 12.1.2006, 12:56
Ну собственно мне понадобилось написать игру на VCL типа "Бойцовского клуба" (Online проект www.combats.ru). На форме будут лежать: TClientSocket и TServerSocket (т.е. каждая копия игры сможет стать сервером, типа Counter-Strike). Работать сетевой режим должен примерно так:

//Для удобства первая копия игры будет "alpha", а другая "beta".

1. alpha создает сервер, и сразу подключаецца к нему.
2. beta подключаецца к созданому ранее серверу. (Значит на сервере уже висит 2 клиента).
3. alpha посылает свои значения (хелсов, маны и т.д.) beta, а beta в свою очередь посылает свои значения alpha.
4. Ну еще в игре будет присутвовать кнопка по нажатию на которую, твоему аппаненту будут посылацца значения твоих блоков и ударов.

Я не прошу написать за меня игру - просто подскажите как это правильно все сделать.

ЗЫ Для меня осталось не понятным, как отправлять значения (хелсов, маны и т.д.) всем кроме меня...

Автор: Snowy 12.1.2006, 13:14
Ты посылаешь серверу свои значения.
Сервер их получает. Также он знает номер коннекта, с которого пришли данные.
Сервер начинает перебирать все коннекты и отправлять данные всем, у кого номер коннекта не равен номеру, от которого получены данные.
Все просто.
Ну даже, если он и отправить тебе данные - хуже не станет smile

P.S. Просьба писать на русском языке.

Автор: Yoda 12.1.2006, 13:25
Цитата

Также он знает номер коннекта, с которого пришли данные.

А мне как узнать номер коннекта с которого пришли значения ?
Цитата

Ну даже, если он и отправить тебе данные - хуже не станет

Ну смотри - например я получю значения (имени персонажа, кол-во хелсов) и присвою их какому нибудь labelEnemyName:= GotName.... А это окажутся мои значения smile
Цитата

P.S. Просьба писать на русском языке.

Ок smile

Автор: Snowy 12.1.2006, 14:10
Цитата(Yoda @ 12.1.2006, 13:25 Найти цитируемый пост)
А мне как узнать номер коннекта с которого пришли значения ?

Вместо номера можно использовать указатель на TIdTCPServerConnection.
Если хочешь именно номер - то прописывай его при соединении в Tag коннекшена, а при отправке смотри.
Хотя указателя на TIdTCPServerConnection более, чем достаточно.

Цитата(Yoda @ 12.1.2006, 13:25 Найти цитируемый пост)
например я получю значения (имени персонажа, кол-во хелсов) и присвою их какому нибудь labelEnemyName:= GotName...

А что ты будешь делать, если соединятся 4 клиента?
Как ты их будешь различать?
У каждого клиента должен быть свой идентификатор.
Вот и смотри - если получил данные о враге со своим идентификатором, то не считай себя врагом smile

Автор: Yoda 12.1.2006, 15:13
Цитата

Вместо номера можно использовать указатель на TIdTCPServerConnection.
Если хочешь именно номер - то прописывай его при соединении в Tag коннекшена, а при отправке смотри.
Хотя указателя на TIdTCPServerConnection более, чем достаточно.

Можно поподробней smile

Автор: Snowy 12.1.2006, 17:03
В OnExecute ты можешь получить TIdPeerThread.Connection.
При отправке ты перибераешь все Connection и отправляешь данные всем, кто не есть этот.

Автор: Yoda 12.1.2006, 19:38
Я говорю о закладке Internet, компонентах: ServerSocket1, ClientSocket1... OnExecute там не нашел smile.

P.S. Юзать желательно их..

Автор: F1reF0x 13.1.2006, 14:42
IdTCPClient IdTCPServer как альтернатива, кстати там есть onExecute smile smile

Автор: Yoda 13.1.2006, 15:20
Ты вопрос видел ? Как осуществить сетевой режим с использованием : ServerSocket1, ClientSocket1...
Не ужели никто не знает ?! smile

Автор: _hunter 13.1.2006, 16:10
что значит "как осуществить"? как с этимим компонентами работать? так книги цитировать тут вряд ли кто-то будет...
поищи по форуму, по сети...

Автор: F1reF0x 13.1.2006, 17:35
Yoda
Там всё просто. посмотри в хелпе какая процедура отвечает за отправку данных у клиента, и как принимать данные, больш тут почти ничего и не требуется (хост и порт ещё понятно).

Автор: Yoda 13.1.2006, 18:17
У меня вопрос пока такой...У меня к серверу будет подключено несколько клиентов... Вот вопрос как отправить значения(хелсов, маны) всем клиену(ам) кроме того, который прислал эти значения.

Автор: _hunter 13.1.2006, 18:50
при подключении нового клиента заноси его в какой-нить список и потом отправляй значения всем, кто есть в этом списке

Автор: Yoda 13.1.2006, 19:07
....Допустим есть 2 клиента...1 из клинетов шлет на сервер значения (все таже мана и хелсы). Сервер их получает.... Как отослать эти значения ТОЛЬКО другому клиенту?

Автор: _hunter 13.1.2006, 19:25
что значит "ТОЛЬКО другому"?
слать точно так же как и ТОЛЬКО этому, но другому...

P.S.
таки почитай книгу...

Автор: Yoda 13.1.2006, 19:33
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
ServerSocket1.Socket.Connections[i].SendText('#HP'); //Это всем

...2 Клиента (alpha, beta). Клиент alpha послал серверу ('#HP'). Как серверу послать ('#HP') beta?

Автор: _hunter 13.1.2006, 19:44
ну а ServerSocket1.Socket.Connections[1].SendText('#HP'); -- только второму

Автор: Yoda 13.1.2006, 23:48
Ну подклюцатьтся может сначала бета потом альфа.....Это же от юзверя завист...И вообще их может быть многа....
Может сервак вычислить с какого Connections пришли значения ?

Автор: _hunter 16.1.2006, 12:38
может. для этого и придумали событие OnClientConnect

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)