xbox360-tribe web
   

XBOXTRIBE advertisments
XBOX TRiBE Tutorials
Piattaforma:
Introduzione a XNA Game Studio Express
Tutorials xbox360
Development Tutorials
Il tutorial illustra come installare, configurare l'SDK per Xbox 360 e come costruire il primo progetto 3D animato.
Lorenz
22/12/2006
Inserimento degli effetti sonori nel progetto

Per quanto concerne l'audio e gli effetti sonori XNA Game Studio Express si basa su files wave (WAV), assemblati in un ambiente denominato XACT (compreso nell'SDK) incaricato di produrre i files che verranno utilizzati dall'applicazione.

Innanzitutto procuriamoci i files WAV per il progetto, inclusi nel pacchetto CONTENT.RAR (oppure, analogamente al caso precedente, nel progetto MySpacewarXbox1). Per fare ciò, clicchiamo col tasto destro su CONTENT nella form SOLUTION EXPLORER, selezioniamo ADD - NEW FOLDER e denominiamo la nuova cartella AUDIO.

Portiamo il puntatore del mouse su AUDIO, clicchiamo col tasto destro, selezioniamo ADD - NEW FOLDER e denominiamo la nuova cartella WAVES. Portiamo il puntatore del mouse su WAVES, clicchiamo col tasto destro, selezioniamo ADD - EXISTING ITEM e selezioniamo il file engine_2.wav compreso nell'archivio che abbiamo scompattato all'inizio del tutorial. Iteriamo lo stesso procedimento con il file hyperspace_activate.wav.

Andremo a caricare due suoni differenziandone una proprietà, nel senso che il primo WAV sarà un effetto sonoro continuo (free run), mentre il secondo sarà un effetto sonoro riprodotto una sola volta (one shot).

La struttura è la seguente:

Giunti a questo punto apriamo XACT (nella cartella di XNA - TOOLS - XACT).

La finestra si apre automaticamente con un nuovo progetto: salviamo immediatamente il nuovo progetto col nome MyGameAudio.xap nel medesimo percorso della nostra applicazione nella cartella CONTENT - AUDIO.

Sul frame sinistro di XACT selezioniamo WAVE BANKS, premiamo il pulsante destro del mouse e selezioniamo NEW WAVE BANK; analogamente selezioniamo SOUND BANKS, premiamo il pulsante destro del mouse e selezioniamo NEWSOUND BANK; selezioniamo poi WINDOW - TILE HORIZZONTALY per ordinare le due finestre:

Posizioniamo il puntatore sulla finestra WAVE BANK, premiamo il tasto destro e selezioniamo INSERT WAVE FILE(S), a questo punto selezioniamo il primo file engine_2.wav.

Analogamente premiamo il tasto destro e selezioniamo INSERT WAVE FILE(S), a questo punto selezioniamo il secondo file hyperspace_activate.wav.

Selezioniamo il primo file engine_2.wav e trasportiamolo col mouse in corrispondenza della finestra SOUND BANK sotto CUE NAME; iteriamo lo stesso procedimento per il secondo file wav:

Come detto in precedenza, il primo file audio engine_2.wav sarà un effetto free run, per cui, dopo averlo selezionato col mouse prima nel frame SOUND BANK e in seguito in corrispondenza del frame in alto a destra (PLAY WAVE) , impostiamo la proprietà LOOPEVENT = INFINITE nella finestra delle proprietà in basso a sinistra.

Per quanto riguarda l'altro effetto, di default tale proprietà è impostata su one shot.

Salviamo il progetto e ritorniamo in Visual C# Express.

Innanzitutto nella finestra SOLUTION EXPLORER portiamo il puntatore del mouse su AUDIO, clicchiamo col tasto destro, selezioniamo ADD - EXISTING ITEM e selezioniamo il progetto MyGameAudio.xap.

Nel frame del codice C#, modifichiamo la funzione di inzializzazione Inizialize scrivendo:

protected override void Initialize()
{
    audioEngine = new AudioEngine("Content\\Audio\\MyGameAudio.xgs");
    waveBank = new WaveBank(audioEngine, "Content\\Audio\\Wave Bank.xwb");
    soundBank = new SoundBank(audioEngine, "Content\\Audio\\Sound Bank.xsb");
    base.Initialize();

}

Immediatamente sopra la funzione Inizializze aggiungiamo le seguenti stringhe:

AudioEngine audioEngine;
WaveBank waveBank;
SoundBank soundBank;

Il codice che andremo a scrivere assocerà all'evento "rotazione" e all'evento "ripristina vista iniziale" due diversi effetti sonori.

In particolare verrà emesso un suono free run durante la rotazione ed un suono one shot al ripristino della vista iniziale.

Andiamo dunque a modificare il metodo UpdateInput, differenziando il codice a seconda della periferica utilizzata per il controllo del modello 3D.

Qualora si utilizzi il joypad della console, modifichiamo il codice della funzione UpdateInput scrivendo:

protected void UpdateInput()
{
    //get the gamepad state
    GamePadState currentState = GamePad.GetState(PlayerIndex.One);
    if (currentState.IsConnected)
    {
        //rotate the model using the left thumbstick, scale it down
        modelRotation -= currentState.ThumbSticks.Left.X * 0.10f;
        //create some velocity if the right trigger is down
        Vector3 modelVelocityAdd = Vector3.Zero;
        //find out what direction we should be thrusting, using rotation
        modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
        modelVelocityAdd.Z = -(float)Math.Cos(modelRotation);
        //now scale our direction by how hard the trigger is down
        modelVelocityAdd *= currentState.Triggers.Right;
        //finally, add this vector to our velocity.
        modelVelocity += modelVelocityAdd;
        GamePad.SetVibration(PlayerIndex.One, currentState.Triggers.Right,
            currentState.Triggers.Right);
        //set some audio based on whether we're pressing trigger
        if (currentState.Triggers.Right > 0)
        {
            if (engineSound == null)
            {
                engineSound = soundBank.GetCue("engine_2");
                engineSound.Play();
            }
            else if (engineSound.IsPaused)
            {
                engineSound.Resume();
            }
        }
        else
        {
            if (engineSound != null && engineSound.IsPlaying)
            {
                engineSound.Pause();
            }
        }
 
        //in case you get lost, press A to warp back to the center
        if (currentState.Buttons.A == ButtonState.Pressed)
        {
            modelPosition = Vector3.Zero;
            modelVelocity = Vector3.Zero;
            modelRotation = 0.0f;
 
            //make a sound when we warp
            soundBank.PlayCue("hyperspace_activate");
        }
    }

}

Immediatamente sopra alla funzione UpdateInput inseriamo le stringhe:

//Cue so we can hang on to the sound of the engine.
Cue engineSound = null;
 
Qualora invece  si utilizzi il mouse, modifichiamo il codice della funzione UpdateInput scrivendo:
 

protected void UpdateInput()

{

//get the gamepad state

GamePadState currentState = GamePad.GetState(PlayerIndex.One);

if (currentState.IsConnected)

{

// Istruzioni per il pad

}

else

{

// istruzioni per il mouse

MouseState mouseState = Mouse.GetState();

Rectangle rt = this.Window.ClientBounds;

if (mouseState.LeftButton == ButtonState.Pressed)

{

//Routa clickando il tasto sinistro e accelera traslando il mouse

modelRotation -= (mouseState.X - rt.Width / 2) * 0.01f;

Vector3 modelVelocity_add = Vector3.Zero;

//find out what direction we should be thrusting, using rotation

modelVelocity_add.X = -(float)Math.Sin(modelRotation);

modelVelocity_add.Z = -(float)Math.Cos(modelRotation);

//finally, add this vector to our velocity.

modelVelocity += modelVelocity_add;

}

//set some audio based on whether we're pressing trigger

if (mouseState.LeftButton == ButtonState.Pressed)

{

if (engineSound == null)

{

engineSound = soundBank.GetCue("engine_2");

engineSound.Play();

}

else if (engineSound.IsPaused)

{

engineSound.Resume();

}

}

else

{

if (engineSound != null && engineSound.IsPlaying)

{

engineSound.Pause();

}

}

//Ripristina la vista iniziale

if (mouseState.RightButton == ButtonState.Pressed)

{

modelPosition = Vector3.Zero;

modelVelocity = Vector3.Zero;

modelRotation = 0.0f;

//make a sound when we warp

soundBank.PlayCue("hyperspace_activate");

}

}

}

 

Immediatamente sopra alla funzione UpdateInput inseriamo le stringhe:

//Cue so we can hang on to the sound of the engine.
Cue engineSound = null;

Torna all'indice tutorials xbox360
Xbox360-Tribe.org Designed by Dec & SeV3n - Powered by Console-Tribe.com - Copyright © 2002-2006 All rights reserved.
E' vietata la riproduzione, anche parziale, di contenuti e grafica senza il consenso degli autori.
Microsoft Xbox, Xbox360 and Xboxs logos' are trademarks of Microsoft Corp.
Il materiale contenuto all'interno di questo sito è volto a scopi didattici ed informativi.
Xbox Tribe ed i membri del suo staff non incoraggiano la pirateria.
Le copie di backup di software sono legittime solo se si dispone di una copia originale.

Console-Tribe Network: Xbox360-Tribe - PSP-Tribe - PS3-Tribe - DS-Tribe - Wii-Tribe