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; // Отсортированный список, содержащий все источники света SortedListlights; #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 | < Назад | Оглавление | Далее > |