|
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;
|