Обновление: извините, если мой вопрос недостаточно ясен. Я читал о шаблоне команд, но, к сожалению, сам не использовал его. Я пытаюсь выяснить, как я мог бы использовать его (или какой-либо другой шаблон) для того, чтобы игровые события были достаточно абстрактными, чтобы сервер мог обрабатывать их, используя один метод Process (). Мое основное занятие здесь - убедиться, что игровые события получают достаточно информации, чтобы реально делать то, что им нужно (например, войти в систему пользователя и добавить его в список активных пользователей, отправить данные карты, переместить игрока и т. Д.). Соответствующий пример был бы очень признателен.
Я довольно новичок в разработке игр, но решил заняться (относительно) простой, 2D MMORPG в свое свободное время. Я считаю себя очень способным программистом, и у меня есть хорошая основа навыков, но я все еще сталкиваюсь с некоторыми разработками, связанными с игрой клиент-сервер. В частности, мне трудно думать о расширяемом способе обработки команд. Позвольте мне привести функциональный пример:
Запрос на вход в систему
- Запустить игру
- Нажмите «Продолжить»
- Введите имя пользователя и пароль
- Нажмите «Войти»
- Смотрите персонажа, где бы вы ни были, когда вы вышли из системы
С точки зрения клиент-серверной архитектуры, вот что я сейчас делаю:
[Клиент]
- Отправка SimpleTextNetworkMessage на сервер - {LogInRequest, UN: [Имя пользователя] | PW: [Пароль]}
- Затемните пользовательский интерфейс и дождитесь ответа (время ожидания: 10 секунд).
- Получите SimpleTextNetworkMessage с сервера - {LogInSuccessResponse, [ID игрока]}
- Отправка SimpleTextNetworkMessage на сервер - {GetPlayerInfoRequest, [ID игрока]}
- Получите SimpleDataNetworkMessage с сервера - {GetPlayerInfoResponse, [Информация об игроке]}
- Отправка SimpleTextNetworkMessage на сервер - {GetMapInfoRequest, [ID игрока]}
- Получите SimpleDataNetworkMessage с сервера - {GetMapInfoResponse, [MapData]}
- Рисуем экран
Мой пример определяет три ключевых события, которые происходят:
Процесс входа в систему
Проверьте информацию, предоставленную пользователем, загрузите информацию об игроке из базы данных (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);
}
}
}