У меня есть интерфейс (ICamera), который реализуется 2 классами (FreeCamera, StaticCamera).Классы наследуются от GameComponent.
Пример определения:
public class FreeCamera : GameComponent, ICamera
{
...
}
Теперь я добавляю классы в игровые компоненты и регистрирую один из компонентов в игровом сервисе
private FreeCamera freeCam;
private StaticCamera staticCam;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
freeCam = new FreeCamera(this) { Enabled = true };
staticCam = new StaticCamera(this) { Enabled = false };
Services.AddService(typeof(ICamera, freeCam);
Components.Add(freeCam);
Components.Add(staticCam);
...
}
Затем я хочу изменить провайдера для службы во время выполнения приложения с помощью функции переключения
namespace Game1
{
protected override void Update(GameTime gameTime)
{
var keyboard = Keyboard.GetState();
if(keyboard.IsKeyDown(Keys.C))
{
if(freeCam.Enabled)
{
Services.RemoveService(typeof(ICamera));
Services.AddService(typeof(ICamera, staticCam);
freeCam.Enabled = !freeCam.Enabled;
staticCam.Enabled = !staticCam.Enabled;
}
else
{
Services.RemoveService(typeof(ICamera));
Services.AddService(typeof(ICamera, freeCam);
freeCam.Enabled = !freeCam.Enabled;
staticCam.Enabled = !staticCam.Enabled;
}
}
base.Update(gameTime);
}
}
StaticCamera принимает только ввод данных мышью (вы можете вращать камеру),FreeCamera также можно перемещать с помощью клавиатуры.Когда я вызываю метод выше (нажав C на клавиатуре), класс FreeCamera деактивируется, но область просмотра кажется замороженной и не реагирует ни на какой ввод.Когда через короткое время я снова вызываю метод, FreeCamera снова активируется, и все работает как положено.
Теперь у меня есть 2 вопроса по этому поводу:
- Можно ли изменитьпоставщик услуг игрового сервиса в игровом цикле?
- Есть ли лучший подход для управления различными типами камер в игре и легкого переключения между ними?
Заранее спасибо за любую помощь.