may 16

Hoy explicaré como conseguir reproducir un sonido cuando se pulsa un botón, de hecho, lo que explicaré se puede usar para muchas más cosas y no sólo para botones, ya que lo que haré será crear un SystemSoundID que se usan, entre otras cosas, para reproducir sonidos cortos (30 segundos o menos). Pero como ejemplo, usaré un botón.

Para poder reproducir sonidos necesitaremos añadir el Framework AudioToolbox a nuestro proyecto.

Imaginaros que contamos con un UIViewController y la vista que éste controla, añadamos un UIButton a la vista mediante Interface Builder o a base de código, como más os guste. Si aun no hemos añadido el Framework a nuestro proyecto hacedlo ahora, una vez añadido tendremos que importarlo a nuestro controlador.

En el archivo cabecera (.h) de nuestro controlador añadimos una variable de tipo SystemSoundID, y un método que será llamado cuando se pulse el botón.

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

Ahora necesitamos un archivo de audio, con el sonido que queramos, por ejemplo ButtonSound.caf, y en el método viewDidLoad de nuestro controlador añadir las siguientes líneas para crear la referencia a nuestro sonido.

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

Como veis en el código, necesitamos la ruta a nuestro archivo de audio, si habéis añadido el archivo a vuestro grupo Resources en Xcode, el código anterior debería funcionar. Echad un vistazo a NSBundle en caso de que no sea así para buscar otro método que os deje encontrar el archivo.

Con eso ya tenemos creada la referencia al sonido, ahora solo falta reproducir éste cuando sea necesario, en este ejemplo, queremos que se reproduzca cuando pulsamos el botón. Para ello tenemos que añadir una línea a la función que llamamos cuando se pulsa el botón.

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

Con esto ya deberíais oír el sonido cuando pulsáis el botón.

En caso de no necesitar más el sonido en cuestión, podéis usar la siguiente función para eliminar la referencia creada, por ejemplo en el viewDidUnload de nuestro controlador.

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

Espero que esto os sea útil para añdirle a vuestra aplicación todo tipo de sonidos cortos, para darle un poco más de vida.

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:
ene 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