May 16

Today I will explain how we can play a sound when a button is pressed, in fact, what I will explain can be used in many other situations and not only for buttons, because what I will do is to create a SystemSoundID which is used, among another things, to play short (30 seconds or less) sounds. But as an example, I will use a button.

To be able to reproduce sounds we will need to add the AudioToolbox Framework to our project.

Imagine we have a UIViewController and the view it is controlling, add a UIButton to the view using Interface Builder or do it programmatically, as you like most. If you haven’t added yet the Framework to the project, do it now, once you have done it we have to import it to our view controller.

In the header file (.h) of our controller add a variable of type SystemSoundID and a method which will be called when the button is pressed.

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioToolbox.h>
 
@interface testKeyboardViewController : UIViewController <UITextFieldDelegate> {
 
	SystemSoundID buttonSoundID;
}
- (IBAction)buttonPressed;
 
@end

Now we need a sound file, with the sound we want, for example call it ButtonSound.caf, now, and in the viewDidLoad of our controller add the following lines to create the reference to our sound.

- (void)viewDidLoad {
    [super viewDidLoad];
	NSString *path = [[NSBundle mainBundle] pathForResource:@"ButtonSound" ofType:@"caf"];
	AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path], &buttonSoundID);	
}

As you can see in the code, we need the path for our file, if you have add the file to your group Resources in Xcode, the code above should work for you. Take a look at NSBundle if that doesn’t work to look for another method that allows you to find the path to the file.

With this we have the reference to the sound, now we only need to play it when we need, in this case, we want to play it when the button is pressed. Add to the method that is called when the button is pressed, the following lines

- (IBAction)buttonPressed {	
	AudioServicesPlaySystemSound(buttonSoundID);
}

Now you should be hearing the sound when you press the button.

When you don’t need anymore the sound, you can use the following function to remove the reference, for example in the viewDidUnload of our controller.

- (void)viewDidUnload {
	AudioServicesDisposeSystemSoundID(buttonSoundID);
}

I hope that this post is useful and now you are able to add all kind of short sounds to your application to give it a bit more of life.

VN:F [1.9.8_1114]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.8_1114]
Rating: +2 (from 2 votes)
Tagged with:
Jan 20

Navegando por foros de Internet sobre progracmación de juegos con cocos2d me encuetro muchas preguntas sobre como usar sonidos en los juegos.
Con este pequeño artículo voy a explicar como se hace eso usando el SimpleAudioEngine (como su nombre indica es muy simple de usar).

Doy por hecho que ya teneís configurado el XCode y tenéis incluidos las APIs de cocos2d.

Para empezear a usar SimpleAudioEngine debeís incluirlo en su fichero fuente:

#import "SimpleAudioEngine.h"

SimpleAudioEngine es capaz de reproducir varios sonidos al mismo tiempo y diferencia lo que sería la música de fondo y los efectos de sonido (p.e. disparos, explosiones, etc.).

Para usar los sonidos (sea de fondo o de efecto) hay que precargarlos para evitar un pequeño retraso al reproducirlos por primera vez (si no están precargados, el motor perderá tiempo cargando y luego reproducirá).

Entonces, se recomienda tener cargado un sonido antes del primer uso.

Vamos a ver como se podemos integrar un sonido de fondo en nuestros juegos.

Sonidos de fondo

Como he dicho antes, primero hay que cargarlo (eso lo haremos en alguna parte del código antes de mostrar el escenario del juego):

[[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"background.wav"];

Una vez hecho el preload podemos reproducirlo:

[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"background.wav"];
//O si queremos que la música de fondo se repita pode usar el siguiente método
[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"background.wav" loop:YES];

También podemos pausar, resumir y para la música:

[[SimpleAudioEngine sharedEngine] pauseBackgroundMusic]; //Pausa
[[SimpleAudioEngine sharedEngine] resumeBackgroundMusic]; //Seguir reproduciendo
[[SimpleAudioEngine sharedEngine] stopBackgroundMusic]; //Parar la reproducción

También puede controlar el volumen de la música. El varor del volumen ha de estar entre 0 y 1 (volumen máximo).

[SimpleAudioEngine sharedEngine].backgroundMusicVolume = 0.5;

Efectos de sonido (disparos, explosiones, etc.)

Como en el caso anterior tenemos que cargar el/los efecto/s.

[[SimpleAudioEngine sharedEngine] preloadEffect:@"bip.wav"];

Podemos reproducir o para un efecto con:

[[SimpleAudioEngine sharedEngine] playEffect:@"bip.wav"]; //reproducir
[[SimpleAudioEngine sharedEngine] playEffect:@"bip.wav"]; //parar

Para liberar la memoria se usa:

[[SimpleAudioEngine sharedEngine] unloadEffect:@"bip.wav"];

Y finalmente se puede controlar el volumen con (min 0, max 1):

[SimpleAudioEngine sharedEngine].effectsVolume = 0.9;

Hay mas métodos que puede ser útiles a parte de los aquí citados. Pueden ver todos los métodos disponibles en la API de SimpleAudioEngine.

VN:F [1.9.8_1114]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.8_1114]
Rating: +1 (from 1 vote)
Tagged with:
preload preload preload