Ho un'interfaccia (ICamera) implementata da 2 classi (FreeCamera, StaticCamera). Le classi si ereditano da GameComponent.XNA Change Game Service dinamicamente durante il runtime
Esempio definiton:
public class FreeCamera : GameComponent, ICamera
{
...
}
Ora sto aggiungendo le classi per i componenti del gioco e registrare uno dei componenti di un servizio di gioco
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);
...
}
Poi voglio cambiare il provider per il servizio durante il flusso dell'applicazione con l'aiuto di una funzione di commutazione
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 prende solo l'input con il mouse (è possibile ruotare la telecamera), la FreeCamera può anche essere mossa tramite l'input da tastiera. Quando chiamo il metodo sopra (premendo C sulla tastiera) la classe FreeCamera viene disattivata, ma il viewport sembra bloccato e non reagisce a nessun input. Quando chiamo di nuovo il metodo dopo poco tempo la FreeCamera si riattiva e tutto funziona come previsto.
Ora ho 2 domande per quanto riguarda questo:
- E 'possibile cambiare il fornitore di servizi di un servizio di gioco nel ciclo gioco?
- Esiste un approccio migliore per gestire diversi tipi di telecamere in un gioco e passare da uno all'altro con facilità?
Grazie in anticipo per qualsiasi aiuto.
Basta una punta rapida per ora: 'keyboard.IsKeyDown (Keys.C) && keyboardLastFrame.IsKeyUp (Keys.C)' –