Документация/Статьи по программированию/Система карт

From NeoAxis Engine Wiki

Jump to: navigation, search
Перейти на уровень выше

Contents

Описание

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

Здесь вы найдете фундаментальные классы, такие как карта (Map) и объект карты (MapObject), которые надстраиваются над игровыми классами системы сущностей и формируют функциональность карт и объектов на карте.

Для начала, рекомендуется к прочтению Урок по созданию простого игрового объекта.

Игровые классы и базовые типы

Список игровых классов, предоставляемых системой карт, и основанных на них базовых игровых типов.

Класс Базовый тип Описание
MapGeneralObject Базовый класс для всех объектов на карте. Используется многими классами в качестве потомка.
MapObject Базовый класс объекта на карте. В отличие от MapGeneralObject, имеет позицию на карте (свойства Position, Rotation, Scale). Также, учавствует в физическом взаимодействии, благодаря наличию физической модели. Используется многими классами в качестве потомка.
StaticMesh StaticMesh.type Объект для создания статичной геометрии на карте.
CameraAttachedObject Вспомогательный класс, реализующий движение объектов за камерой. Этот объект может управлять моделями, системами частиц и биллбордами. Может использоваться для созднания продвинутого неба, дождя.
CubemapZone CubemapZone.type Расчет статичных кубических текстур окружения.
Fog Fog.type Туман.
Light Light.type Источник света.
MapCamera MapCamera.type Позволяет расставлять камеры на карте.
MapCameraCurve MapCameraCurve.type Позволяет задавать траекторию полета камеры.
MapCurve MapCurve.type Позволяет точками задать траекторию.
Occluder Occluder.type Служит для выключения порталов. Часть портальной системы.
Portal Portal.type Портал. Часть портальной системы.
Region Region.type Область на карте.
SkyBox SkyBox.type Небо в виде статичной кубической карты.
SkyDome SkyDome.type Небо в виде полусферы.
StaticLightingManager StaticLightingManager.type Менеджер статичного освещения. Предназначен для создания предрасчитанного статичного освещения на карте.
StaticSound StaticSound.type Статичный источник звука на карте.
Zone Zone.type Зона. Часть портальной системы.

Положение объекта на карте

Описание

Позиция объекта в игровом пространстве задается с помощью трех параметров: Position, Rotation и Scale.

Предыдущая трансформация

тики в игровом мире происходят с постоянным интервалом и достаточно не часто (по умолчанию 30 раз в секунду). Т.е. объекты в игровом мире обновляются только 30 раз в секунду.

Частота обновления кадров на экране может быть больше 30 кадров в секунду. Чтобы перемещение объектов выглядело плавным, необходимо интерполировать положение объекта при рисовании его на экране. Для сглаженного перемещения объекта, используется информация о трансформации из предыдущего тика. Зная текущую и предыдущую информацию о положении объекта, движок интерполирует позицию объекта во время его отрисовки.

API

Класс MapObject

Имя Описание
PublicProperty.gif Vec3 Position Возвращает или задает позицию объекта.
PublicProperty.gif Quat Rotation Возвращает или задает поворот объекта.
PublicProperty.gif Vec3 Scale Возвращает или задает масштабирование объекта.
PublicMethod.gif Void SetTransform( Vec3 pos, Quat rot, Vec3 scl ) Задает трансформацию объекта. Используйте этот метод, когда хотите изменить сразу несколько параметров.
ProtectedMethod.gif VirtualMember.gif Void OnSetTransform( ref Vec3 pos, ref Quat rot, ref Vec3 scl ) Метод, вызываемые при изменении трансформации объекта.
PublicProperty.gif Vec3 OldPosition Возвращает или задает предыдущую позицию объекта.
PublicProperty.gif Quat OldRotation Возвращает или задает предыдущий поворот объекта.
PublicProperty.gif Vec3 OldScale Возвращает или задает предыдущее масштабирование объекта.
PublicMethod.gif Void SetOldTransform( Vec3 pos, Quat rot, Vec3 scl ) Задает предыдущую трансформацию объекта.
PublicMethod.gif Vec3 GetInterpolatedPosition() Возвращает интерполированную позицию объекта.
PublicMethod.gif Quat GetInterpolatedRotation() Возвращает интерполированный поворот объекта.
PublicMethod.gif Vec3 GetInterpolatedScale() Возвращает интерполированное масштабирование объекта.
PublicMethod.gif Void GetInterpolatedTransform( out Vec3 pos, out Quat rot, out Vec3 scl ) Возвращает интерполированную трансформацию объекта.

Работа с прикрепляемыми объектами

Описание

На практике любой объект в игровом мире обладает некоторыми материальными свойствами. У некоторых есть 3d-модель, некоторые объекты визуализируются с помощью специальных эффектов, а некоторые объекты только проигрывают звуки.

Принцип прост. Каждый объект карты (объект класса MapObject) обладает списком прикрепленных объектов. К игровому объекту могут быть прикреплены различные ресурсы:

  • Трехмерные модели
  • Системы частиц
  • Билборды
  • Ленты траекторий
  • Источники света
  • Внутреигровой пользовательский интерфейс
  • Звуки
  • Игровые объекты. Вы можете присоединить любой игровой объект к другому игровому объекту, что позволит с легкостью создавать комплексные динамические конструкции. Например, вы можете запросто прикрепить анимированный вращающийся пулемет к вертолету, с сохранением его функциональности. Также система позволяет присоединение оружия или брони к персонажам.

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

Редактор ресурсов

Присоединяемые объекты обычно настраиваются в редакторе игровых объектов. Для работы с прикрепленными объектами используется свойство AttachedObjects.

Читайте больше о работе с прикрепляемыми объектами в редакторе ресурсов здесь.

Run-time

Помимо настройки прикрепленных объектов в типе, можно управлять прикрепляемыми объектами в процессе симуляции. Например, когда персонаж берет оружие, мы прикрепляем его к персонажу.

Ниже приведен список классов, которые могут быть присоединены:

Пример

Пример присоединения системы частиц:

MapObject obj = ...;
 
MapObjectAttachedParticle attachedParticle = new MapObjectAttachedParticle();
attachedParticle.SetParticleSystem( "SmokeParticle" );
obj.Attach( attachedParticle );


API

Класс MapObject

Имя Описание
PublicMethod.gif void Attach( MapObjectAttachedObject attachedObject ) Прикрепление объекта.
PublicMethod.gif void Detach( MapObjectAttachedObject attachedObject ) Отсоединение объекта.
ProtectedMethod.gif VirtualMember.gif void OnAttach( MapObjectAttachedObject attachedObject ) Метод, вызываемый при присоединении объекта.
ProtectedMethod.gif VirtualMember.gif void OnDetach( MapObjectAttachedObject attachedObject ) Метод, вызываемый при отсоединении объекта.
PublicProperty.gif MapObjectAttachedObject[] AttachedObjects Предоставляет список присоединенных объектов.
PublicProperty.gif MapObject AttachedMapObjectParent Предоставляет объект, к которому присоединен данный объект. В случае, когда один игровой прикреплен к другому.
PublicMethod.gif MapObjectAttachedObject GetAttachedObjectByAlias( String alias ) Возвращает присоединенный объект по его алиасу.

Выборка объектов

Описание

Довольно часто нужно получать список объектов, находящихся в определенной области. Задачу можно решить, перебиранием всех объектов на карте и выбиранием необходимых объектов. При большом количестве объектов на карте, такой способ может работать медленно. Для того, чтобы получать объектов в определенной области существуют специальные функции.

Класс Map содержит методы для выборки объектов областям различной формы:

Выборка осуществляется по размерам габаритам объекта (свойство MapBounds). Это свойство автоматически рассчитывается в процессе работы объекта, с учетом габаритов трехмерных моделей объекта, физических моделей и т.д.

Можно создавать и удалять объекты во время выборки. Это нормально для функционирования движка.

Также, возможно использования фильтрования по группам для еще большего увеличения производительности. Об этом будет написано позже.

Пример

Пример выборки объектов с учетом габаритов.

Bounds bounds = new Bounds( new Vec3( 10, 10, 10 ), new Vec3( 20, 20, 20 ) );
Map.Instance.GetObjects( bounds, delegate( MapObject obj )
{
    ... //Some work with "obj"
 
} );

API

Класс Map

Имя Описание
PublicMethod.gif void GetObjects( Bounds bounds, FilterGroups filterGroups, GetObjectsDelegate callback ) Выборка объектов по габаритам с фильтром по группам.
PublicMethod.gif void GetObjects( Bounds bounds, GetObjectsDelegate callback ) Выборка объектов по габаритам.
PublicMethod.gif void GetObjects( Frustum frustum, Boolean accurateCheck, FilterGroups filterGroups, GetObjectsDelegate callback ) Выборка объектов по области камеры с фильтром по группам.
PublicMethod.gif void GetObjects( Frustum frustum, Boolean accurateCheck, GetObjectsDelegate callback ) Выборка объектов по области камеры.
PublicMethod.gif void GetObjects( Plane[] clipPlanes, FilterGroups filterGroups, GetObjectsDelegate callback ) Выборка объектов по отрезающим плоскостям с фильтром по группам.
PublicMethod.gif void GetObjects( Plane[] clipPlanes, GetObjectsDelegate callback ) Выборка объектов по отрезающим плоскостям.
PublicMethod.gif void GetObjects( Sphere sphere, FilterGroups filterGroups, GetObjectsDelegate callback ) Выборка объектов по сфере с фильтром по группам.
PublicMethod.gif void GetObjects( Sphere sphere, GetObjectsDelegate callback ) Выборка объектов по сфере.
PublicMethod.gif bool GetObjects( Ray ray, GetObjectsRayDelegate callback ) Выборка объектов по лучу.
PublicMethod.gif void GetObjects( Box box, FilterGroups filterGroups, GetObjectsDelegate callback ) Выборка объектов по параллелепипеду с фильтром по группам.
PublicMethod.gif void GetObjects( Box box, GetObjectsDelegate callback ) Выборка объектов по параллелепипеду.
PublicMethod.gif bool GetObjects( Ray ray, FilterGroups filterGroups, GetObjectsRayDelegate callback ) Выборка объектов по лучу с фильтром по группам.
PublicMethod.gif void GetObjectsByScreenRectangle( Camera camera, Rect rect, GetObjectsDelegate callback ) Выборка объектов по экранному прямоугольнику для определенной камеры.
PublicMethod.gif void GetObjectsByScreenRectangle( Camera camera, Rect rect, FilterGroups filterGroups, GetObjectsDelegate callback ) Выборка объектов по экранному прямоугольнику для определенной камеры с фильтром по группам.
PublicMethod.gif void GetObjectsByScreenRectangle( Rect rect, GetObjectsDelegate callback ) Выборка объектов по экранному прямоугольнику.
PublicMethod.gif void GetObjectsByScreenRectangle( Rect rect, FilterGroups filterGroups, GetObjectsDelegate callback ) Выборка объектов по экранному прямоугольнику с фильтром по группам.