Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2010, 20:38   #21
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Цитата:
i := 1;
if PlayerCount <> MAX_PLAYERS then begin
Inc(PlayerCount);
while ClientData[i].Active do Inc(i)...
Интересно, где тут ошибка? Где тут что-то могло неправильно произойти?
Единственное, в чём я сомневаюсь - так это в передаче данных с сервера клиенту, от клиента к серверу, потому что эта тема плохо изучена мной, опыта не имею.
Цитата:
А что говорит отладка? Брейкопоинты ставил?
Вот они-то тут совершенно не нужны.
Цитата:
где могла бы быть ошибка не мало.
Вы привели только один пример, в котором итак всё предусмотрено и ошибки быть не может. Покажите ещё места. Немало - это сколько должно быть по-вашему?
Цитата:
Почему нельзя было сделать булевую переменную?
тогда можно было б написать
Можно было, исправлю. Спасибо.

Последний раз редактировалось Asker13; 10.12.2010 в 20:42.
Asker13 вне форума Ответить с цитированием
Старый 10.12.2010, 21:52   #22
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Asker13, нужно стараться избегать цикла while, это опасная штука, особенно в динамическом режиме организации многопользовательского обмена данными, контроля каналов и пр. Есть привычный For, он не способен ввести программу в бесконечность выполнения процедур.

Вот тут идет i := 1, и ServerSocket1.Socket.Connections[i].SendText, хотя это событие на коннект:

Код:
procedure TMainForm.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i: integer;
begin
  i := 1;

  if PlayerCount <> MAX_PLAYERS then begin
    Inc(PlayerCount);
    while ClientData[i].Active do Inc(i);
    AddClient(i);
    ServerSocket1.Socket.Connections[i].SendText('@' + IntToStr(i));
    ShowMessage('Подключен друг! Проверочное сообщение!');
  end

  else ServerSocket1.Socket.Disconnect(Socket.SocketHandle);
end;
Если нумирация у каналов начинается с 0, то что будет при подключении первого клиента (по счету 0) и отправки текста в канал номер 1 ? ...правильно, будет List Index Out Of Bounds(1) - нет у сервера канала 1, есть 0.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 10.12.2010 в 21:55.
Beermonza вне форума Ответить с цитированием
Старый 11.12.2010, 00:07   #23
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Спасибо, Beermonza. Действительно в том месте была серъёзная ошибка, исправил. И всё же я пока оставлю while.
Клиент присоединился:
Код:
  if PlayerCount <> MAX_PLAYERS then begin
    Inc(PlayerCount);
    while ClientData[i].Active do Inc(i);
    AddClient(i);
    ServerSocket1.Socket.Connections[ServerSocket1.Socket.ActiveConnections-1].SendText('@');
    Socket.Data := Pointer(i);
  end
Клиент отсоединился:
Код:
  Dec(PlayerCount);
  ClientData[integer(Socket.Data)].Active := false;
Самое интересное теперь, что сервер видит, как клиент перемещается. А клиент не видит ни своего перемещения, ни перемещения серверного игрока. Но клиент отправляет серверу только строку с командами о перемещении. А вот сервер уже всем клиентам отправляет массив из 16 элементов. Вот так:
Код:
    for j := 0 to ServerSocket1.Socket.ActiveConnections-1 do
      ServerSocket1.Socket.Connections[j].SendBuf(ClientData, SizeOf(ClientData));

Последний раз редактировалось Asker13; 11.12.2010 в 00:14.
Asker13 вне форума Ответить с цитированием
Старый 11.12.2010, 00:42   #24
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

SendBuf(ClientData, SizeOf(ClientData)) - некорректная отправка. Вообще, типичный рабочий способ это отправка подготовленного байтового буфера, который собирается перед отправкой. Длина буфера должна быть стандартизирована: 2, 4, 8, 16, 32, 64 и т.д. Используя конкретный буфер Buf2, Buf4, Buf8, Buf16, Buf32, Buf64, длина хранится в его первом байте, и никогда не затирается сервером, при заполнении. Будет выглядеть так:

Код:
Buf4[1] := ClientData[i].UnitID;
Buf4[2] := ClientData[i].X;
Buf4[3] := ClientData[i].Y;

for j := 0 to ServerSocket1.Socket.ActiveConnections-1 do
  Socket.Connections[j].SendBuf(Buf4, Buf4[0]);
Кроме того, Inc и Dec использовать в connect и disconnect крайне не рекомендуется, ...для этого есть тот же ActiveConnections. В структуру ClientData можно включить запись типа TCustomWinSocket, в которую при коннекте сервер впишет возвращаемый Socket клиента, ...через эту переменную сервер может послать данные конкретно пользователю из общего массива без перебора по ActiveConnections, поскольку после подключения или отключения каналы меняют номера, можно отослать данные не тому пользователю, а переменная Socket не ошибается.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 11.12.2010 в 00:48.
Beermonza вне форума Ответить с цитированием
Старый 11.12.2010, 00:47   #25
Asker13
Форумчанин
 
Аватар для Asker13
 
Регистрация: 01.12.2010
Сообщений: 140
По умолчанию

Beermonza, невнимательно я прислушивался к вашим словам в первых постах, говорили же про массив данных, про буфер, про размерность... Снова выручаете меня, спасибо!
Asker13 вне форума Ответить с цитированием
Старый 11.12.2010, 00:49   #26
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Я сделал добавление в пост выше, обрати внимание.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка приложений для Windows Mobile 6.1 AlexBonel Windows 4 08.10.2009 17:44
Разработка приложений под Windows Mobile 6.1 AlexBonel Помощь студентам 0 05.10.2009 10:40
C++ взаимодействие с АЦП/ЦАП и разработка сетевых приложений iukash Свободное общение 4 14.08.2009 18:02
Создание сетевых приложений в delphi martinenko Работа с сетью в Delphi 6 09.05.2009 20:23