Dal momento in cui tutti i nostri files sono stati correttamente importati, processati e salvati in appositi file .xnb
, possiamo usarli e caricarli nel nostro gioco. La classe Game
che si eredita come punto di partenza per creare una applicazione mantiene una istanza di un ContentManager
.
Il ContentManager rappresenta una cache di file caricati da un particolare progetto content. Ogni progetto content ha una sua directory in cui i suoi file processati verranno salvati. Possiamo vedere e modificare questa cartella dalla finestra delle proprietà del progetto content, tramite la proprietà Content Root Directory.
Per collegare un ContentManager ad uno specifico progetto content, dovremo impostare la proprietà RootDirectory del ContentManager alla Content Root Directory appropriata:
Content.RootDirectory = "Content";
Dove Content
è il nome di una istanza del ContentManager
. Spesso questa operazione si svolge subito dopo la creazione del ContentManager, all'interno del costruttore della classe con cui abbiamo ereditato la classe Game
:
public class ContentPipelineGame : Microsoft.Xna.Framework.Game
{
// ...
public ContentPipelineGame()
{
// ...
Content.RootDirectory = "Content";
}
// ...
Al momento di caricare i contenuti, usiamo il metodo generico Load
per caricare i file dalla content pipeline. Al metodo Load passeremo una stringa con il nome del file da caricare senza però la sua estensione originale. Questo è molto comodo perché non dovremo ricordarci, ad esempio per le texture, se il file originale aveva estensione .jpg
, .png
, .bmp
, etc.
protected override void LoadContent()
{
var font = Content.Load("large_font");
//...
base.LoadContent();
}
Qualora caricassimo più volte lo stesso file, non dobbiamo preoccuparci di sprechi di memoria o di performance: il ContentManager si occuperà di mantenere una mappa dei contenuti già caricati e tutti i caricamenti successivi al primo dello stesso contenuto saranno molto veloci in quanto il ContentManager restituirà il contenuto appropriato senza caricarlo nuovamente:
font1 = Content.Load("large_font");
// ...
font2 = Content.Load("large_font");
Possiamo scaricare tutti i dati mantenuti da un ContentManager tramite il metodo Unload. In questo modo possiamo liberare la memoria occupata dai contenuti caricati con le varie invocazioni del metodo Load fatte su quello stesso ContentManager:
Content.Unload();
Grazie alla possibilità di avere diversi progetti di contenuti si potrebbe decidere di separare i contenuti per tema (Menu, Livello1, Livello2, ...) in modo da avere una gestione semplificata dei blocchi di contenuti.
Quando si avvia un livello possiamo creare un ContentManager
appropriato:
ContentManager Level2Content;
Level2Content = new ContentManager(this.Services);
E ne invocheremo il metodo Unload
appena il livello verrà concluso:
Level2Content.Unload();
così non dovremo preoccuparci di tracciare a mano le risorse di ciascun set di risorse usate assieme.