Nella nostra situazione attuale abbiamo un gioco capace di riconoscere il rapporto di grafica da usare e comportarsi di conseguenza, ma ora, prima di aggiungere la nostra prima grafica, sarà meglio che durante il Debug ci mettiamo in condizione di poter passare da 16:9 a 4:3 mentre il gioco è in funzione, così da poter testare le varie situazioni senza dover uscire dal gioco. Per ottenere questo dobbiamo aggiungere del codice nel nostro metodo Update. Diciamo che per cambiare risoluzione vogliamo usare il bottone Y del GamePad oppure il tasto F12 della tastiera. Ecco cosa aggiungeremo nel nostro metodo di update:
#if DEBUG
if ((GamePad.GetState(PlayerIndex.One).Buttons.Y == ButtonState.Pressed) ||
Keyboard.GetState().IsKeyDown(Keys.F12))
{
if (Widescreen)
{
LarghezzaPreferita = 800;
AltezzaPreferita = 600;
Widescreen = false;
}
else
{
LarghezzaPreferita = 1280;
AltezzaPreferita = 720;
Widescreen = true;
}
graphics.PreferredBackBufferWidth = LarghezzaPreferita;
graphics.PreferredBackBufferHeight = AltezzaPreferita;
graphics.ApplyChanges();
}
#endif
ATTENZIONE!!! Provate un po’ ad eseguire il codice (premendo F5) e provate a cambiare la risoluzione premendo F12 (o Y sul Gamepad)... che effetto vi fa? Da diventar matti direi... dovete riuscire a premere e rilasciare il tasto in 1/60 di secondo, altrimenti ve la cambia di nuovo... e di nuovo...
Come si ovvia a questo problema? Beh, dobbiamo introdurre il principio di “tasto premuto” e gestirlo nella nostra logica! Che vuol dire aver premuto un tasto? Semplice: prima era su ed ora è giù! Ok, quindi non basta che controlliamo che il tasto ora sia giù, ma dobbiamo accertarci che prima (1/60 di secondo prima) il tasto fosse su! Per fare questo dobbiamo aggiungere altre quattro variabili membro al nostro codice:
GamePadState statoCorrenteDelGamepad;
GamePadState statoPrecedenteDelGamepad;
KeyboardState statoCorrenteDellaTastiera;
KeyboardState statoPrecedenteDellaTastiera;
a cosa servono mi sembra chiarissimo, giusto? Ora cambiamo un po’ il contenuto della nostra Update per implementare questa cosa. Innanzitutto all’ingresso del metodo scriviamo:
statoCorrenteDelGamepad = GamePad.GetState(PlayerIndex.One);
statoCorrenteDellaTastiera = Keyboard.GetState();
(per ora continuiamo ad usare solo il gamepad 1, poi cambieremo questa cosa). Ed alla fine del metodo Update scriveremo:
statoPrecedenteDelGamepad = statoCorrenteDelGamepad;
statoPrecedenteDellaTastiera = statoCorrenteDellaTastiera;
in questo modo sapremo sempre quale fosse il precedente stato. Ora modifichiamo i nostri test prendendo in carico queste nuove informazioni:
#if DEBUG
if (((statoPrecedenteDelGamepad.Buttons.Y == ButtonState.Released) &&
(statoCorrenteDelGamepad.Buttons.Y == ButtonState.Pressed)) ||
(statoPrecedenteDellaTastiera.IsKeyUp(Keys.F12) &&
statoCorrenteDellaTastiera.IsKeyDown(Keys.F12)))
{
if (Widescreen)
{
LarghezzaPreferita = 800;
AltezzaPreferita = 600;
Widescreen = false;
}
else
{
LarghezzaPreferita = 1280;
AltezzaPreferita = 720;
Widescreen = true;
}
graphics.PreferredBackBufferWidth = LarghezzaPreferita;
graphics.PreferredBackBufferHeight = AltezzaPreferita;
graphics.ApplyChanges();
}
#endif
Se adesso eseguiamo il codice va molto meglio, vero? Passiamo ora al mettere una grafica sullo schermo. Cominciamo da qualcosa che possa farci capire meglio la questione delle proporzioni.
ATTENZIONE! Una volta che cominciamo ad avere delle grafiche il cambio di risoluzione se effettuato troppo in fretta provoca un errore generale. Lasciate passare un paio di secondi almeno tra un passaggio e l’altro!
Abbiamo qui (allegata a questa pagina) una grafica in 720p (di pubblico dominio). Create una cartella Textures all’interno del sotto-progetto Content e trascinate l’immagine in questa nuova cartella.
Nelle proprietà del file fate attenzione al nome (Asset Name): è il nome con il quale XNA identifica l’immagine, nel nostro caso l’immagine sfondo.jpg
Ora facciamo in modo di caricare lo sfondo. Creiamo una nuova variabile membro:
Texture2D sfondo;
e nel metodo LoadContent aggiungiamo:
sfondo = Content.Load<Texture2D>("Textures/sfondo");
mentre nel metodo UnloadContent scriveremo:
sfondo = null;
A questo punto la nostra immagine è stata caricata. Per metterla a video aggiungiamo quanto segue nel metodo Draw, subito dopo la cancellazione:
spriteBatch.Begin();
spriteBatch.Draw(sfondo, Vector2.Zero, Color.White);
spriteBatch.End();
Ora possiamo eseguire il programma. Notate che lo sfondo in 4:3 viene semplicemente tagliato?