Tengo una interfaz (ICamera) que se implementa mediante 2 clases (FreeCamera, StaticCamera). Las clases heredan de GameComponent.XNA Change Game Service dinámicamente durante el tiempo de ejecución
Ejemplo definiton:
public class FreeCamera : GameComponent, ICamera
{
...
}
Ahora estoy añadiendo las clases a los componentes del juego y registrar uno de los componentes de un servicio de juegos
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);
...
}
entonces quiero cambiar el proveedor de el servicio durante el flujo de la aplicación con la ayuda de una función de alternar
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);
}
}
Th e StaticCamera solo toma entrada con el mouse (puede girar la cámara), la FreeCamera también se puede mover con la entrada del teclado. Cuando llamo al método anterior (presionando C en el teclado) la clase FreeCamera se desactiva pero la ventana gráfica parece congelada y no reacciona a ninguna entrada. Cuando vuelvo a llamar al método después de poco tiempo, FreeCamera se activa nuevamente y todo funciona como se esperaba.
Ahora tengo 2 preguntas relacionadas con esta:
- ¿Es posible cambiar el proveedor de servicios de un servicio de juego en el bucle juego?
- ¿Hay un mejor enfoque para manejar diferentes tipos de cámara en un juego y cambiar entre ellos fácilmente?
Gracias de antemano por cualquier ayuda.
Sólo un consejo rápido por ahora: 'keyboard.IsKeyDown (Keys.C) && keyboardLastFrame.IsKeyUp (Keys.C)' –