activar/desactivar el sonido globalmente en la aplicación cocos2d

He usado una clase singleton y la he usado en todas las clases para activar/desactivar el sonido de la aplicación. El problema es que cuando cambio la pantalla, el sonido se enciende incluso si estaba silenciado. Llamo al método de sonido en el inicio de cada clase, por lo que se enciende. Pero si no llamo desde init, nunca comienza. estoy en mal estado

Lo siguiente es lo que he usado

//SingletonClass.m
+(SingletonClass*)sharedMySingleton
{
 .....
}
+(id)alloc{
 ......
}

-(id)init{
    self = [super init];
         if (self != nil) {
             // initialize stuff here
             is_sound_enable = TRUE;
    //         [[SimpleAudioEngine sharedEngine] setMute:NO];
             [[SimpleAudioEngine sharedEngine] resumeBackgroundMusic];
            }              
      return self;
}

-(void)setsound{
    if(is_sound_enable == TRUE){
//       [[SimpleAudioEngine sharedEngine] setMute:NO]; //this is not working when called again
        [[SimpleAudioEngine sharedEngine] resumeBackgroundMusic];
//        is_sound_enable = FALSE;
    }
    else{
//        [[SimpleAudioEngine sharedEngine] setMute:YES]; // this is not working when called again
        [[SimpleAudioEngine sharedEngine] pauseBackgroundMusic];
//        is_sound_enable = TRUE;
    }

    if(is_sound_enable == TRUE){
        is_sound_enable = FALSE;
    }
    else{
        is_sound_enable = TRUE;
    }
}


//MyClass.m
-(void)toggleSoound{
[[SingletonClass sharedMySingleton] setsound];
}

preguntado el 04 de julio de 12 a las 06:07

Sin ver el código, es algo difícil ayudarte. -

@Jennis: ¿puede sugerirme una forma de hacerlo? Mediante el uso de variables globales puede ser. -

En realidad, dijiste que implementaste la clase singleton, por lo que si publicas el código, podemos verificar ese código en busca de errores o, de lo contrario, debes cambiar todo si sugiero una nueva forma. -

@Jennis, consulte mi código. Ahora, cuando cambio una transición, la música se vuelve a encender. -

@Jennis cuando la música está apagada en la escena actual, se enciende cuando cambia la escena, pero si está encendida, no se apaga en el cambio de escena. -

1 Respuestas

Cree el archivo SingletonClass.h de la siguiente manera

#import <Foundation/Foundation.h>
#import "AVFoundation/AVFoundation.h"

@interface SingletonClass : NSObject 
{
    BOOL is_sound_enable;
    AVAudioPlayer *audioPlayer;
}

@property (nonatomic,assign) BOOL is_sound_enable;
@property (nonatomic,retain) AVAudioPlayer *audioPlayer;

+ (SingletonClass *)sharedInstance;
-(void)checkAndPlayMusic;
-(void)loadNewFile:(NSURL*)newFileURL;

@end

Cree el archivo SingletonClass.m de la siguiente manera

#import "SingletonClass.h"

@implementation SingletonClass

@synthesize is_sound_enable;
@synthesize audioPlayer;

#pragma mark -
#pragma mark Singleton Variables
static SingletonClass *singletonHelper = nil;

#pragma mark -
#pragma mark Singleton Methods
- (id)init {
    if ((self = [super init])) {
        is_sound_enable = YES;
        NSString *strPath = @""; //<-- Assign path here
        NSURL *url = [NSURL URLWithString:strPath];
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
        [audioPlayer prepareToPlay];
        audioPlayer.numberOfLoops = -1; //<-- This will set it to infinite playing.
    }

    return self;
}
+ (SingletonClass *)sharedInstance {
    @synchronized(self) {
        if (singletonHelper == nil) {
            [[self alloc] init]; // assignment not done here
        }
    }
    return singletonHelper;
}
+ (id)allocWithZone:(NSZone *)zone {
    @synchronized(self) {
        if (singletonHelper == nil) {
            singletonHelper = [super allocWithZone:zone];
            // assignment and return on first allocation
            return singletonHelper;
        }
    }
    // on subsequent allocation attempts return nil
    return nil;
}
- (id)copyWithZone:(NSZone *)zone {
    return self;
}
- (id)retain {
    return self;
}
- (unsigned)retainCount {
    return UINT_MAX;  // denotes an object that cannot be released
}
//- (void)release {
- (void)dealloc {
    [audioPlayer release];
    [super dealloc];
}
- (id)autorelease {
    return self;
}

-(void)resumeBackgroundMusic
{
    //Your code
    NSLog(@"Playing music");
    [self.audioPlayer play];
}

-(void)pauseBackgroundMusic
{
    //Your code here
    NSLog(@"Paused music");
    [self.audioPlayer pause];
}

-(void)checkAndPlayMusic
{
    if(self.is_sound_enable)
        [self resumeBackgroundMusic];
    else 
        [self pauseBackgroundMusic];
}

//Added this new method to load new music file.
-(void)loadNewFile:(NSURL*)newFileURL
{
    if(self.audioPlayer)
        [self.audioPlayer release];

    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:newFileURL error:nil];
    [audioPlayer prepareToPlay];
    audioPlayer.numberOfLoops = -1; 
}


@end

Ahora lo que tienes que hacer es

SingletonClass *sgHelper = [SingletonClass sharedInstance];
sgHelper.is_sound_enable = NO; //<--Set here NO or YES according to your requirement and music will be played accordingly.
[sgHelper checkAndPlayMusic];

Avísame si necesitas más ayuda.

Respondido 04 Jul 12, 08:07

pero tengo música diferente en cada escena. así que de acuerdo con eso, si la música está desactivada, entonces no reproduzca BGMusic para esa escena, de lo contrario, continúe y escriba un código para reproducir música. Cuando alterno un interruptor para encender la música, debería establecer la variable de activación en la clase Singleton y usar esa variable para registrar cualquier escena para pausar/reproducir música. - manicura

sí, entonces, cuando usa las últimas 3 líneas de código en cualquiera de sus escenas, lo que tiene que hacer es configurar SÍ o NO según la elección de la escena y la música se reproducirá/pausará según la elección. - Janak Nirmal

pero la ruta del archivo de música se asigna en la clase Singleton. Si estoy asignando una ruta de archivo, por ejemplo. scene1.mp3 en la escena primero y scene2.mp3 en la escena segundo, y de la misma manera, ¿debería eliminar el código de init de singleton [que está asignando la ruta del archivo de audio]? ¿Y qué más cambios hay que hacer? - manicura

Compruebe que he agregado un nuevo método para cargar música nueva. - Janak Nirmal

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.