Какой расширяемый способ реализации обработки команд на стороне сервера в MMORPG? - PullRequest
6 голосов
/ 09 августа 2009

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

Я довольно новичок в разработке игр, но решил заняться (относительно) простой, 2D MMORPG в свое свободное время. Я считаю себя очень способным программистом, и у меня есть хорошая основа навыков, но я все еще сталкиваюсь с некоторыми разработками, связанными с игрой клиент-сервер. В частности, мне трудно думать о расширяемом способе обработки команд. Позвольте мне привести функциональный пример:

Запрос на вход в систему

  1. Запустить игру
  2. Нажмите «Продолжить»
  3. Введите имя пользователя и пароль
  4. Нажмите «Войти»
  5. Смотрите персонажа, где бы вы ни были, когда вы вышли из системы

С точки зрения клиент-серверной архитектуры, вот что я сейчас делаю:

[Клиент]

  1. Отправка SimpleTextNetworkMessage на сервер - {LogInRequest, UN: [Имя пользователя] | PW: [Пароль]}
  2. Затемните пользовательский интерфейс и дождитесь ответа (время ожидания: 10 секунд).
  3. Получите SimpleTextNetworkMessage с сервера - {LogInSuccessResponse, [ID игрока]}
  4. Отправка SimpleTextNetworkMessage на сервер - {GetPlayerInfoRequest, [ID игрока]}
  5. Получите SimpleDataNetworkMessage с сервера - {GetPlayerInfoResponse, [Информация об игроке]}
  6. Отправка SimpleTextNetworkMessage на сервер - {GetMapInfoRequest, [ID игрока]}
  7. Получите SimpleDataNetworkMessage с сервера - {GetMapInfoResponse, [MapData]}
  8. Рисуем экран

Мой пример определяет три ключевых события, которые происходят:

Процесс входа в систему

Проверьте информацию, предоставленную пользователем, загрузите информацию об игроке из базы данных (HP, MP, последнее местоположение и т. Д.) И свяжите игрока с картой и подключением.

Получить информацию об игроке

Отправьте обратно информацию о статистике игрока, экипировке, опыте, текущем идентификаторе карты и обо всем, что необходимо отобразить в интерфейсе пользователя.

Получить информацию о карте

Отправка информации игроку обо всех фишках в радиусе 50 фишек ... сюда должна входить информация о фишках для трехслойной карты, а также местонахождение и имена NPC / монстров / игроков; когда игрок перемещается, дополнительная информация о карте будет запрошена / обновлена.

Вы можете видеть, что каждый из этих процессов отличается и требует различной информации. На стороне сервера, как я могу сделать что-то вроде:

while (ServerIsRunning)
{
   foreach (Client c in clients)
   {
      eventQueue.AddList(c.ReceiveAll());
   }

   foreach(GameEvent event in eventQueue)
   {
      event.Process();
   }

   int[] keys = messageQueue.Keys;

   foreach (int key in keys)
   {
      Client c = clients.Get(key);

      foreach(NetworkMessage message in messageQueue[key])
      {
         c.Send(message);
      }
   }
}

1 Ответ

1 голос
/ 10 августа 2009

Когда я читаю то, что вы спрашиваете, вы, кажется, спрашиваете о «расширяемом способе реализации обработки команд».

Как вы сформулируете, ваш запрос явно указывает на шаблон команды .

Я не человек C #, поэтому, к сожалению, я не могу сделать большую часть работы, оценивая множество предложений, которые Google предлагает. Вот один, чтобы вы начали. http://www.c -sharpcorner.com / UploadFile / cupadhyay / CommandPatternsInCS11142005021734AM / CommandPatternsInCS.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...