2.4 Capire il rapporto video e le risoluzioni - il BackBuffer

4.5
Il tuo voto: Nessuno Media: 4.5 (2 voti)

 

Qui diventa necessario (prima di proseguire) mettere qualche paletto fondamentale alla comprensione del modello logico di gestione grafica che c’è dietro XNA. Abbiamo visto che il nostro gioco in mancanza di altre specifiche assume una risoluzione 600p (800x600, quindi 4:3). Questa è la risoluzione predefinita del BackBuffer.
 
Questa è una cosa fondamentale da capire: il Backbuffer è di fatto lo schermo con cui lavoriamo. Quando disegnamo una texture (cioè una grafica 2D) la posizioniamo sempre in rapporto al BackBuffer in uso, non rispetto all’effettiva risoluzione dello schermo! Insomma, il nostro punto P(x, y) in cui (ad esempio) x=20 e y=10 si troverà fisicamente in posti diversi sullo schermo al variare della risoluzione del BackBuffer.
 
Questo è importante perché quando lavoriamo per la Xbox 360 dobbiamo ricordare che il nostro gioco verrà automaticamente scalato in base alla risoluzione video in uso sulla console dell’utente. È quindi importante sapere che se il framework dovrà scalare un gioco progettato in 4:3 (600p) su uno schermo in 16:9 il risultato sarà deformato, mentre se scriveremo il gioco in 16:9 impostando il BackBuffer a 720p (1280x720) e l’utente ha un televisore standard (quindi 480p, cioè 640x480) il framework rimpicciolirà il nostro gioco ed aggiungerà delle strisce nere sopra e sotto. Importante: se il gioco è progettato in 16:9 usando una risoluzione 1080p (1920x1080) e l’utente ha un SDTV (TV standard) il framework non riuscirà a scalarlo in 480p quindi il gioco non funzionerà!
 
Alcuni giochi sono giocabili se il sistema scala in 480p, altri no, tutto dipende dal tipo di gioco e di dettaglio necessario. Il solo modo per essere certi di non aver alcun problema è quello di preparare il nostro gioco usando un doppio set di grafiche (600p e 720p) e gestirle propriamente nel nostro gioco.
 
Di qui in avanti implementeremo questo approccio, facendo in maniera che il nostro gioco sia in grado di gestire tutte e due le situazioni (4:3 e 16:9) usando le due risoluzioni intermedie di progettazione consigliate da Microsoft: 600p per il 4:3 e 720p per il 16:9. Per fare questo dobbiamo aggiungere un test durante l’inizializzazione del gioco, in questo modo:
 
All’inizio della nostra classe aggiungiamo altre tre variabili membro dopo le dichiarazioni esistenti:
 
        int LarghezzaPreferita;
        int AltezzaPreferita;
        bool Widescreen;
 
poi all’inizio della LoadContent aggiungiamo il codice per riconoscere il tipo di formato ed impostare il nostro BackBuffer di conseguenza. Questo può essere fatto in due modi.
 
Primo modo:
 
            if (GraphicsAdapter.DefaultAdapter.IsWideScreen)
            {
                LarghezzaPreferita = 1280;
                AltezzaPreferita = 720;
                Widescreen = true;
            }
            else
            {
                LarghezzaPreferita = 800;
                AltezzaPreferita = 600;
                Widescreen = false;
            }
 
Secondo modo:
 
            if (graphics.GraphicsDevice.DisplayMode.Height >= 720)
            {
                LarghezzaPreferita = 1280;
                AltezzaPreferita = 720;
                Widescreen = true;
            }
            else
            {
                LarghezzaPreferita = 800;
                AltezzaPreferita = 600;
                Widescreen = false;
            }
 
Dopo questo test (uno dei due modi) applichiamo le modifiche:
 
            graphics.PreferredBackBufferWidth = LarghezzaPreferita;
            graphics.PreferredBackBufferHeight = AltezzaPreferita;
            graphics.ApplyChanges();
 
A questo punto abbiamo preso in carico il formato dello schermo. La differenza tra il primo ed is secondo modo è semplice: il primo modo imposta il 16:9 esclusivamente se la scheda video effettivamente è impostata in 16:9, indipendentemente dal fatto che potremmo avere un video di tipo differente (sul PC ovviamente) e quindi saremmo in grado di vedere in 720p anche se non abbiamo un monitor 16:9.
Il secondo metodo è un po’ più flessibile, e quindi imposta la visualizzazione in 16:9 (a 720p) semplicemente se la nostra scheda video è in grado di visualizzare in 1280x720, cioè se l’altezza massima del nostro schermo è minimo 720 pixel.
 
Nel nostro esempio io preferisco usare il secondo sistema poiché lo trovo appunto più flessibile. La variabile membro Widescreen ci servirà in seguito per sapere in quale dei due modi stiamo lavorando.
 
A questo punto il nostro metodo LoadContent nel suo complesso risulterà come segue:
 
        protected override void LoadContent()
        {
            if (graphics.GraphicsDevice.DisplayMode.Height >= 720)
            {
                LarghezzaPreferita = 1280;
                AltezzaPreferita = 720;
                Widescreen = true;
            }
            else
            {
                LarghezzaPreferita = 800;
                AltezzaPreferita = 600;
                Widescreen = false;
            }
            graphics.PreferredBackBufferWidth = LarghezzaPreferita;
            graphics.PreferredBackBufferHeight = AltezzaPreferita;
            graphics.ApplyChanges();
 
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            // TODO: use this.Content to load your game content here
        }