Potremmo non voler rifare lo sfondo perché ci sta bene anche se è tagliato, ma se questo non fosse possibile perché magari l’intera immagine è necessaria al gioco? Allora avremmo 2 sole opzioni: 1) scalare l’immagine o 2) crearne una 800x600 che soddisfi le nostre necessità. Proviamo innanzi tutto ad investigare il funzionamento della prima opzione.
Il metodo Begin dello SpriteBatch ha una delle sintassi in cui è prevista la possibilità di passare una matrice rappresentante la scala di riproduzione degli oggetti da disegnare. Cominciamo con l’aggiungere una nuova variabile membro per la scala:
Matrix scala;
Per creare la matrice in maniera automatica ad ogni cambio di risoluzione la cosa migliore da fare è quella di creare un gestore per l’evento DeviceReset, come segue. Nel nostro metodo Initialize() aggiungiamo:
graphics.DeviceReset += new EventHandler(graphics_DeviceReset);
Visual Studio avrà creato per noi il metodo vuoto:
void graphics_DeviceReset(object sender, EventArgs e)
{
throw new NotImplementedException();
}
Che noi modificheremo come segue:
void graphics_DeviceReset(object sender, EventArgs e)
{
float scalaVideo = (float)graphics.GraphicsDevice.Viewport.Width / 1280f;
scala = Matrix.CreateScale(scalaVideo, scalaVideo, 1);
}
In pratica rapportiamo la risoluzione video corrente a 1280 che la nosta base di progettazione. Questa matrice la useremo per inizializzare le operazioni di disegno, quindi nella Draw cambieremo il spriteBatch.Begin() come segue:
spriteBatch.Begin(SpriteBlendMode.AlphaBlend,
SpriteSortMode.Immediate, SaveStateMode.None, scala);
Che cosa abbiamo ottenuto? Beh… ora l’immagine è scalata, quindi... ci ritroviamo con l’immagine correttamente a video ma una bella banda azzurrina (dello sfondo) nella fetta di schermo in basso perché ovviemente scalando l’immagine resta fuori un pezzo!
Questo sistema può essere buono per alcune grafiche, ma chiaramente abbiamo appena sperimentato che non si applica certo agli sfondi!
Esiste un’altra possibilità: ridimensionare senza scalare. Per fare questo invece di passare allo SpriteBatch un rapporto di scala passeremo alla sua Draw il rettangolo di destinazione dove vogliamo che l’immagine venga mostrata. Lo SpriteBatch ridimensionerà la grafica (non scalandola ma semplicemente facendocela stare!). Proviamo un po’ e vediamo cosa capita con questo approccio. Cambiamo ancora il nostro metodo Draw come segue:
spriteBatch.Begin();
spriteBatch.Draw(sfondo,
new Rectangle(0, 0, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height),
Color.White);
spriteBatch.End();
Ok, cos’abbiamo otenuto ora? Più o meno quel che volevamo: l’immagine viene adattata alla risoluzione, ma è di conseguenza distorta. Nel caso dell’immagine che stiamo usando il problema è poco visibile quindi potremmo anche lasciare tutto così, ma purtroppo la maggior parte delle volte questo non è possibile e quindi non resta che preparare una grafica dedicata per ogni rapporto di risoluzione video, 4:3 e 16:9.