Introduzione
Vedremo come gestire tramite XNA il lettore multimediale di Windows, in particolare, rilevare informazioni sui brani, artisti ed altro sul catalogo di Windows Media Player, presente nel pc.
L’applicazione, di tipo XNA per Windows, visualizzerà a video tali informazioni .
Creazione del progetto
Dopo aver creato un progetto di tipo XNA per Windows, aggiungere nella parte “content” un oggetto di tipo “SprintFont” in questo modo, potremmo gestire il testo per la visualizzazione delle informazioni a video.
Terminato ciò, inizieremo a scrivere il codice per gestire le informazioni richieste in precedenza.
Dichiariamo a livello di classe, gli oggetti che ci permettono di gestire le informazioni.
Le classi da utilizzare sono “SpriteFont”, per la gestione del testo, “KeyboardState”, per il rilevamento del tasto, ossia se digita il pulsante della tastiera di tipo "a", passa al brano successivo (nel caso sono presenti due o più brani) .
La classe “Medialibrary”, per la gestione di media player, la classe “Song” per la gestione dei brani, in cui possiamo rilevare informazioni (autore, genere, ecc), variabili di tipo numero, e stringe per la visualizzazione dei dati, ed infine l’oggetto “VisualizationData” per la frequenza del brano.
Qui di seguito si riporta la dichiarazione di tali oggetti.
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpriteFont sprFont;
KeyboardState keyboardstato;
MediaLibrary mediaLibrary;
Song song;
int album, canzoni, artisti, generi;
string tipoMedia, nomeMedia;
VisualizationData visData;
Nell’evento “Initialize” impostiamo i vari oggetti creati in precedenza. In particolare inizialiamo tali oggetti per poterli utilizzare nel programma. Inoltre, verifichiamo quanti brani sono presenti nel catalog, in caso di almeno una presenza, si imposta il primo brano e si esegue.
Si riporta il frammento di codice per tale evento.
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
//inizializzo le variabili
mediaLibrary = new MediaLibrary();
visData = new VisualizationData();
tipoMedia = mediaLibrary.MediaSource.MediaSourceType.ToString();
nomeMedia = mediaLibrary.MediaSource.Name;
album = mediaLibrary.Albums.Count;
canzoni = mediaLibrary.Songs.Count;
artisti = mediaLibrary.Artists.Count;
generi = mediaLibrary.Genres.Count;
if (canzoni > 0)
{
song = mediaLibrary.Songs[0];
MediaPlayer.Play(song);
}
}
Nell’evento “Update” verifichiamo se viene digitato il pulsante “a” in tale caso , passiamo al secondo brano, nel caso che sono presenti due o più brani.
Qui di seguito si riporta il frammento di codice di tali operazioni.
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
keyboardstato = Keyboard.GetState();
if (keyboardstato.IsKeyDown(Keys.Escape))
{
this.Exit();
}
if (keyboardstato.IsKeyDown(Keys.A))
{
if (canzoni > 1)
{
MediaPlayer.Stop();
song = mediaLibrary.Songs[1];
MediaPlayer.Play(song);
}
}
MediaPlayer.GetVisualizationData(visData);
// TODO: Add your update logic here
base.Update(gameTime);
}
Si creano due funzione, che visualizzano a video le informazioni., la prima accetta vari argomenti, due interi riguardante le coordinate di posizione, il testo da visualizzare ed il colore, queste passate all’oggetto SpriteBatch, permette di visualizzare le informazioni a video.
L’altra funzione “Visualizza” viene utilizzato nell’evento "Draw" .
private void VisualizzaVideo(int x, int y, string testo, Color colore)
{
spriteBatch.DrawString(sprFont, testo, new Vector2((float)x, (float)y), colore);
}
private void Visualizza(int x, int y, string testo)
{
VisualizzaVideo(x, y, testo, Color.White);
}
Il metodo draw, visualizza a video le informazioni sul brano, come nome album, autore, genere, tipo ed altro ancora.
Qui di seguito si riporta il codice di tale evento.
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
int y = 20;
Visualizza(20, y, "Esempio Media");
Visualizza(200, y, "(A) - play random track"); y += 40;
Visualizza(20, y, "Album: " + album.ToString()); y += 20;
Visualizza(20, y, "Artisti: " + artisti.ToString()); y += 20;
Visualizza(20, y, "Generi: " + generi.ToString()); y += 20;
Visualizza(20, y, "suoni: " + canzoni.ToString()); y += 20;
Visualizza(20, y, "Media Type: " + tipoMedia); y += 20;
Visualizza(20, y, "Nome Media: " + nomeMedia); y += 40;
if (canzoni > 0 )
{
Visualizza(20, y, "media in play: "); y += 20;
Visualizza(20, y, "Nome: " + song.Name); y += 20;
Visualizza(20, y, "Album: " + song.Album.Name); y += 20;
Visualizza(20, y, "Artista: " + song.Artist.Name); y += 20;
Visualizza(20, y, "Traccia: " + song.TrackNumber.ToString()); y += 20;
Visualizza(20, y, "Genere: " + song.Genre.Name); y += 20;
Visualizza(20, y, "Dimensione: " + song.Duration.ToString()); y += 20;
}
spriteBatch.End();
// TODO: Add your drawing code here
base.Draw(gameTime);
}
Riportiamo il codice completo di tutto il programma.
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpriteFont sprFont;
KeyboardState keyboardstato;
MediaLibrary mediaLibrary;
Song song;
int album, canzoni, artisti, generi;
string tipoMedia, nomeMedia;
VisualizationData visData;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
//inizializzo le variabili
mediaLibrary = new MediaLibrary();
visData = new VisualizationData();
tipoMedia = mediaLibrary.MediaSource.MediaSourceType.ToString();
nomeMedia = mediaLibrary.MediaSource.Name;
album = mediaLibrary.Albums.Count;
canzoni = mediaLibrary.Songs.Count;
artisti = mediaLibrary.Artists.Count;
generi = mediaLibrary.Genres.Count;
if (canzoni > 0)
{
song = mediaLibrary.Songs[0];
MediaPlayer.Play(song);
}
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
sprFont = Content.Load<SpriteFont>("SpriteFont1");
// TODO: use this.Content to load your game content here
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
keyboardstato = Keyboard.GetState();
if (keyboardstato.IsKeyDown(Keys.Escape))
{
this.Exit();
}
if (keyboardstato.IsKeyDown(Keys.A))
{
if (canzoni > 1)
{
MediaPlayer.Stop();
song = mediaLibrary.Songs[1];
MediaPlayer.Play(song);
}
}
MediaPlayer.GetVisualizationData(visData);
// TODO: Add your update logic here
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
int y = 20;
Visualizza(20, y, "Esempio Media");
Visualizza(200, y, "(A) - play random track"); y += 40;
Visualizza(20, y, "Album: " + album.ToString()); y += 20;
Visualizza(20, y, "Artisti: " + artisti.ToString()); y += 20;
Visualizza(20, y, "Generi: " + generi.ToString()); y += 20;
Visualizza(20, y, "suoni: " + canzoni.ToString()); y += 20;
Visualizza(20, y, "Media Type: " + tipoMedia); y += 20;
Visualizza(20, y, "Nome Media: " + nomeMedia); y += 40;
if (canzoni > 0 )
{
Visualizza(20, y, "media in play: "); y += 20;
Visualizza(20, y, "Nome: " + song.Name); y += 20;
Visualizza(20, y, "Album: " + song.Album.Name); y += 20;
Visualizza(20, y, "Artista: " + song.Artist.Name); y += 20;
Visualizza(20, y, "Traccia: " + song.TrackNumber.ToString()); y += 20;
Visualizza(20, y, "Genere: " + song.Genre.Name); y += 20;
Visualizza(20, y, "Dimensione: " + song.Duration.ToString()); y += 20;
}
spriteBatch.End();
// TODO: Add your drawing code here
base.Draw(gameTime);
}
private void Visualizza(int x, int y, string testo)
{
VisualizzaVideo(x, y, testo, Color.White);
}
private void VisualizzaVideo(int x, int y, string testo, Color colore)
{
spriteBatch.DrawString(sprFont, testo, new Vector2((float)x, (float)y), colore);
}
}
Conclusioni
L'articolo ha voluto fornire le basi per utilizzare la tecnologia XNA, con alcuni programmi del computer, ossia programmi del sistema operativo Windows. L'utilizzo del lettore multimediale in XNA è la dimostrazione di come utilizzare contenuti multimediali tramite XNA.