| 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 | < Назад | Оглавление | Далее > |