Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Monkey Zone: Multi-player пример проекта

Monkey Zone: Multi-player пример проекта

Опубликованно: 09.07.2017, 0:32
Последняя редакция, Andry: 11.07.2017 9:09

MonkeyZone — это многопользовательская демо-игра, предоставляемая основной командой разработчиков jME.

Эта демонстрация с открытым исходным кодом:

  1. Демонстрирует один из возможных способов реализации игры с jME3 и
  2. Помогает команде jME проверять API jME3 с точки зрения удобства использования.

Идея игры основана на аркадной игре «BattleZone» 1980-х годов, шутере от первого лица с элементами стратегии в реальном времени. Игра была написана с использованием jMonkeyEngine SDK, и она основана на проекте шаблоне BasicGame. Нам потребовалась неделя, чтобы создать воспроизводимую пре-альфу, в том числе сетевую. Дизайн проекта соответствует лучшим стандартам, позволяющим редактировать карты, транспортные средства и.т.д. в jMonkeyEngine SDK без необходимости изменения кода. Это упрощает 3D-дизайнерам процесс добавления моделей. (Если вы чувствуете, что готовы вкладываете в это средства или поработаете над частью игрового кода, напишите нам!)

Реализация

MonkeyZone — это многопользовательская игра с моделированием физики. Оба, клиенты и сервер, запускают моделирование физики. Клиенты отправляют данные ввода из группы игроков на сервер, где они осуществляют управление сущностями, а также передаются клиентам. Кроме того, сервер регулярно отправляет данные синхронизации для всех объектов в игре, чтобы предотвратить дрейф. Когда пользователь или ИИ выполняет действие (нажимает кнопку), фактическая логика выполняется на сервере. Результаты передаются в виде сообщаемых данных сущностям. Когда объект контролируется ИИ, на клиенте выполняется текущий ИИ-код (который определяет, куда должен перемещаться объект и когда он должен выполнить действие). Реализованный MonkeyZone способ — это лишь один из многих возможных способов сделать подобную игру в jME. Некоторые вещи могут быть сделаны более эффективно, некоторые из них могут быть выполнены по-другому полностью. MonkeyZone пытается сделать так, что бы все то что наиболее подходит для разработки игры было под рукой, и она прекрасно показывает, как jME3 и стандартный Java API могут облегчить и ускорить разработку игры. Также обратите внимание, что способ MonkeyZone не масштабируемый как для игры в стиле MMO, он будет работать только в среде стиля FPS, где сразу можно загрузить весь игровой мир.

Терминология

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

  • Player(Игрок) — Логический человек или ИИ игрок, который может входить в сущностью и выполнять игровые действия, существует только как база данных PlayerData с ID.
  • Entity(Сущность) — Spatial с UserData, мировой объект, как персонаж, автомобиль, коробка или завод. Базовая фигура определяется только строкой, указывающей на j3o, которая уже имеет все пользовательские данные, такие как игровые очки, скорость и.т.д.
  • User(Пользователь) — Игрок использующий клиент
  • Player Group — группа игроков, которые играют вместе (например, один игрок-человек и один ИИ компаньон на одного клиента). На данный момент это то же самое, что и client_id игрок человек, для всех AIControl игроков.
  • Client(Клиент) — компьютер, подключенный к серверу

Классы Менеджеров

WorldManager выполняет основную работу по организации игроков, сущностей, мира и синхронизации их между сервером и клиентом. И клиент, и сервер используют этот класс. Некоторые другие менеджеры, такие как ClientEffectsManager, существуют только на клиенте или сервере и управляют, например, Отображение эффектов. Геймплей в значительной степени контролируется ServerGameManager, который реализует игровую логику на сервере, в сочетании с действиями, выданными ИИ и пользователем на клиенте (см. Ниже). Он реализует игровой процесс. Он широко использует функции, выставленные WorldManager для выполнения действий и сбора данных. Это также класс, в котором на сервере выполняются действия игроков для определения результата (тестирование лучём для стрельбы и.т.п.).

Использование Control

Control широко используются в MonkeyZone для многих аспектов игры. Когда игрок входит в сущьность, Control Spatial настраиваются на основе игрока, который вошёл. Например, когда пользователь человек вводит в сущность, Control, который обновляют пользовательский интерфейс (DefaultHUDControl) или пользовательский ввод (UserInputControl), добавляются к текущему объекту Spatial.

… Каковы возможности сущности

Control, прикреплённые к Spatial, обычно используются как «массив возможностей», которым обладает сущность. Поэтому, когда у сущности есть VehicleControl, она будет транспортным средством, когда она получает CharacterControl, она будет персонажем. Другие Control работают полностью самостоятельно, например CharacterAnimControl, который просто использует CharacterControl сущности для проверки, действий персонажа бегает, прыгает и.т.п. и затем анимирует сущность, если она имеет AnimControl.

… абстрактно

Кроме того, существуют специальные интерфейсы для Control, которые позволяют абстрагировать различные Control в один базовый интерфейс. Например, ManualControl и AutonomousControl являются интерфейсами для Control, которые управляют движением spatial обобщая ходьбу. Таким образом, ИИ-код и, например, UserInputControl должен только проверять действительный AutonomousControl или ManualControl на control spatial и перемещать его. Детали движения обрабатываются такими классами, как ManualVehicleControl и AutonomousCharacterControl.

… для функций ИИ

Специальный Control под названием CommandControl обрабатывает Command, которые могут выполняться игроками, контролируемыми пользователем, см. Ниже.

Искусственный интеллект

MonkeyZone включает в себя простые функции ИИ на основе командной очереди.

Команды

Для реализации автономных ИИ-игроков MonkeyZone использует систему Command, управляемых CommandControl, которые прикреплены к каждой сущности ИИ-игрока, контролируемому пользователем. Этот CommandControl управляет списком Command, которые выполняются на основе приоритета. Например, команды MoveCommand, FollowCommand и AttackCommand, однако, может быть реализовано и более полное поведение, чем это, например, полная логика для scavenging сущности.

  • Нажмите клавиши WASD и используйте мышь для перемещения
  • Нажмите пробел, чтобы прыгать
  • Прицельтесь и сделайте клик, чтобы стрелять
  • Тип 1, чтобы выбрать первый Ogre
    • Прицельтесь в пол и нажмите F1, чтобы сказать, куда идти.
    • Прицельтесь и нажмите F2, чтобы сказать, за кем следовать.
    • Нацельтесь на автомобиль и нажмите F3, чтобы он водил машину.
    • Прицельтесь и нажмите F4, чтобы сказать, кого атаковать.
    • Пройдите рядом с автомобилем и нажмите enter, чтобы управлять автомобилем.

Triggers

SphereTrigger — это TriggerControl, который также прикреплен к каждой сущности ИИ игрока. Он состоит из GhostControl, который проверяет перекрывающиеся сущности вокруг сущности, к которой он прикреплен. Ему может быть назначена команда, которая проверяет каждую сущность, которая входит в SphereTrigger, и выполняется, если это применимо (например, обычный режим «атаковать врага»).

NavMesh

Для каждой карты создается навигационная сетка, которая позволяет сущностям перемещаться по местности. Автономные сущности автоматически получают NavigationControl на основе текущей карты. Реализации AutonomousControl автоматически распознаёт NavigationControl, прикрепленный к Spatial, и используют его для навигации. Реализация NavMeshNavigationControl содержит ссылку на уровни NavMesh и реализует алгоритм навигации, подобный алгоритму A*.

Networking

Networking реализован в PhysicsSyncManager, который, как мы надеемся, распространится на состояние, где он может служить общей системой синхронизации для компьютерных игр с использованием физики. Менеджер синхронизации в основном помещает отметку времени в каждое сообщение, отправленное с сервера, и затем буферизует все поступающие сообщения на клиенте в течение определенного временного окна. Это позволяет компенсировать слишком ранней и слишком позднее поступление сообщений в пределах ограничений буфера, будущая версия может заставлять physics space клиентов различать, компенсирование что бы задержки в сети были без «snapping».

Использование инструментов jMonkeyEngine SDK

Все игровые ресурсы, используемые в игре, такие как модели сущностей и загруженные карты, могут быть предварительно сконфигурированы и отредактированы с помощью jMonkeyEngine SDK. Например, чтобы добавить новый тип транспортного средства, в редакторе транспортного средства jMonkeyEngine SDK создается транспортное средство, и UserData, такие как Speed, HitPoints и.т.д., задаются непосредственно в редакторе. Когда модель загружается в игру, она автоматически настраивается на основе этих настроек, тот же принцип для загружаемых карт, и специальных Узлы, которые маркируют, например, начальное местоположения игрока, и оно распознаются автоматически и.т.д..

UserData

Сущности (узлы и геометрии), загружаемые с диска, имеют определенные UserData, такие как HitPoints, Speed и.т.д., которые используются для настройки сущности во время выполнения. jMonkeyEngine SDK позволяет добавлять и редактировать эти UserData, то есть свойства объекта редактируются визуально.

Физика

VehicleControls, CharacterControls и RigidBodyControls с сеткой фигуры столкновения для местности и объектов генерируются в jMonkeyEngine SDK и сохраняются в j3o файле сущности. Когда сущность загружается, тип сущности идентифицируется на основе доступных control и UserData, и он настроенных соответствующим образом.

Информация по API

Информация для дизайнера

Редактируемые UserData сущности Spatial:

  • (float) HitPoints
  • (float) MaxHitPoints
  • (float) Speed

Сущность Spatial названия маркированных Узлов:

  • AimNode
  • CameraAttachment
  • ShootAttachment

Уровень Spatial названия маркированных Узлов:

  • StartPoint
  • PowerSource
  • MetalField

Информация для разработчика

Программные UserData сущностей:

  • (long) entity_id
  • (int) group_id
  • (long) player_id

Программные PlayerData:

  • (long) id
  • (int) group_id
  • (long) entity_id
  • (long) character_entity_id

Будущее

Посмотрите на код и не стесняйтесь спрашивать если вы хотите добавить какие-либо новые функции, вы можете их реализовать. ;) MonkeyZone размещен в GoogleCode, где вы можете проверить проект jMonkeyEngine SDK-ready через svn:

  • JMonkeyEngine SDK → Team → Subversion → Checkout,
  • Введите URL-адрес SVN http://monkeyzone.googlecode.com/svn/trunk/
  • Загрузите, откройте и соберите проект
  • Сначала запустите сервер (com.jme3.monkeyzone.ServerMain), а затем клиент (com.jme3.monkeyzone.ClientMain).

Исправление проблем

  1. После загрузки могут появиться ошибки, поскольку jme3tools.navmesh.util\NavMeshGenerator.java импортируемый com.jme3.terrain.Terrain неизвестен, вы должны исправить это, выбрав у проекта Свойства → Библиотеки → Добавить Библиотеку → jme3-libraries-terrain

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.