netlib.narod.ru< Назад | Оглавление | Далее >

Диспетчеры камер и источников света

Чтобы упростить управление камерами и источниками света в игре, вы создаете два отдельных диспетчера — один для камер и другой для источников света.

Диспетчер камер

В этом разделе вы создадите класс для управления камерами с именем CameraManager. Диспетчер камер позволяет размещать в сцене несколько камер, управляя тем, какая камера будет активной в определенное время. Активной камерой называется та, через которую вы глядите на сцену. Вот полный код класса CameraManager:

public class CameraManager
{
    // Индекс активной камеры и ссылка на нее
    int activeCameraIndex;
    BaseCamera activeCamera;

    // Отсортированный список, содержащий все камеры
    SortedList<string, BaseCamera> cameras;

    #region Свойства
    public int ActiveCameraIndex
    {
        get { return activeCameraIndex; }
    }
    public BaseCamera ActiveCamera
    {
        get { return activeCamera; }
    }
    public BaseCamera this[int index]
    {
        get { return cameras.Values[index]; }
    }
    public BaseCamera this[string id]
    {
        get { return cameras[id]; }
    }
    public int Count
    {
        get { return cameras.Count; }
    }
    #endregion

    public CameraManager()
    {
        cameras = new SortedList(4);
        activeCameraIndex = -1;
    }

    public void SetActiveCamera(int cameraIndex)
    {
        activeCameraIndex = cameraIndex;
        activeCamera = cameras[cameras.Keys[cameraIndex]];
    }

    public void SetActiveCamera(string id)
    {
        activeCameraIndex = cameras.IndexOfKey(id);
        activeCamera = cameras[id];
    }

    public void Clear()
    {
        cameras.Clear();
        activeCamera = null;
        activeCameraIndex = -1;
    }

    public void Add(string id, BaseCamera camera)
    {
        cameras.Add(id, camera);
        if (activeCamera == null)
        {
            activeCamera = camera;
            activeCameraIndex = -1;
        }
    }

    public void Remove(string id)
    {
        cameras.Remove(id);
    }
}

В классе CameraManager камеры хранятся в объекте SortedList, где в качестве ключа используется строка с именем камеры. Благодаря этому к камерам можно получить доступ или по целочисленному индексу, или по имени. Обратите внимание, что индекс, используемый для доступа к камерам, не отражает порядок, в котором они добавлялись в диспетчер камер. Класс CameraManager предоставляет методы для добавления и удаления камер, а также методы для определения активной камеры.

Диспетчер источников света

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

public class LightManager
{
    // Глобальная фоновая составляющая для сцены
    Vector3 ambientLightColor;

    // Отсортированный список, содержащий все источники света
    SortedList lights;

    #region Свойства
    public Vector3 AmbientLightColor
    {
        get { return ambientLightColor; }
        set { ambientLightColor = value; }
    }
    public BaseLight this[int index]
    {
        get { return lights.Values[index]; }
    }
    public BaseLight this[string id]
    {
        get { return lights[id]; }
    }
    public int Count
    {
        get { return lights.Count; }
    }
    #endregion

    public LightManager()
    {
        lights = new SortedList();
    }

    public void Clear()
    {
        lights.Clear();
    }

    public void Add(string id, BaseLight light)
    {
        lights.Add(id, light);
    }

    public void Remove(string id)
    {
        lights.Remove(id);
    }
}

В классе LightManager источники света хранятся в объекте SortedList, подобно классу CameraManager. Благодаря этому к источнику света можно обратиться, используя целочисленный индекс, или по имени. Класс LightManager предоставляет методы для добавления и удаления источников света.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz