2014-01-15 3 views
0

Хорошо, пора спросить. У меня есть метод в моем player.m файле с именем musicOn. Вот мои занятия. При запуске он воспроизводит музыку и во всех сценах, но мои кнопки в моем MainMenu, чтобы отключить и на музыку, не работают. Что я делаю не так?Методы вызова из классов в комплекте Sprite?

Player.h

#import <Foundation/Foundation.h> 

@interface Player : NSObject{ 


} 

+ (Player *) musicOn; 
+ (Player *) musicOff; 

@end 

Player.m

#import "Player.h" 
#import <AVFoundation/AVFoundation.h> 
@import AVFoundation; 

@interface Player() 

@property (nonatomic, strong) AVAudioPlayer * backgroundMusicPlayer; 

@end 

static Player *musicOff = nil; 
static Player *musicOn = nil; 

@implementation Player 

//Music on Method. 
+ (Player *) musicOn { 

NSLog(@"Music on method called"); 

if (!musicOn) { 

    musicOn = [[super allocWithZone:nil]init]; 

    //Play Music. 
    NSError *error; 
    NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:@"music" withExtension:@"wav"]; 
    musicOn.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error]; 
    musicOn.backgroundMusicPlayer.numberOfLoops = -1; 
    [musicOn.backgroundMusicPlayer prepareToPlay]; 
    [musicOn.backgroundMusicPlayer play]; 
    NSLog(@"Music on"); 

} 
    return musicOn; 

} 

//Music off Method. 
+ (Player *) musicOff { 

NSLog(@"Music off method called"); 

if (!musicOff) { 

    musicOff = [[super allocWithZone:nil]init]; 

    [musicOff.backgroundMusicPlayer stop]; 

    NSLog(@"Music off"); 
} 

return musicOff; 

} 

//Overwriting allocWithZone. 
+(id) allocWithZone:(NSZone *)zone { 

return [self musicOn]; 
return [self musicOff]; 
} 

//Overwriting init. 
- (id) init { 

self = [super init]; 

if (self) { 

    _backgroundMusicPlayer = self.backgroundMusicPlayer; 

} 
return self; 
} 


@end 

MainMenu.m

//Calling the method from Player class. 
[Player musicOn]; 

Журнал показывает этот

2014-01-16 21:23:04.010 Sprite Test[12582:60b] Music on method called 
2014-01-16 21:23:04.035 Sprite Test[12582:60b] Music on 
2014-01-16 21:23:04.065 Sprite Test[12582:60b] Music on 
2014-01-16 21:23:04.068 Sprite Test[12582:60b] soundOn Called 

2014-01-16 21:23:08.641 Sprite Test[12582:60b] Music off method called 
2014-01-16 21:23:08.643 Sprite Test[12582:60b] Music off 
2014-01-16 21:23:08.646 Sprite Test[12582:60b] Music off 
2014-01-16 21:23:08.649 Sprite Test[12582:60b] soundOff Called 

2014-01-16 21:23:09.304 Sprite Test[12582:60b] Music on method called 
2014-01-16 21:23:09.306 Sprite Test[12582:60b] Music on 
2014-01-16 21:23:09.307 Sprite Test[12582:60b] soundOn Called 
+0

вы создаете новые экземпляры вид контроллера, необходимо использовать ссылку на существующий. – LearnCocos2D

+1

Узлы soundOn и soundOff не удаляются ... Вы обнаружите, что они добавляются друг к другу. – ZeMoon

+0

@akashg Спасибо, я забыл удалить узел, когда отображается другой, я исправил это сейчас. Благодарю. Можете ли вы помочь с синглтоном? – Jason

ответ

1

В вашем viewController.m, редактировать метод -musicOn следующим образом:

if (self.backgroundMusicPlayer == nil) 
{ 
    self.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error]; 
} 

Кроме того, вам нужно создать синглтон класса ViewController. Только тогда вы сможете получить доступ к конкретному экземпляру AVAudioPlayer, который воспроизводит музыку.

Пожалуйста, измените метод класса для одноточечного следующим образом:

+ (Player *) musicOn { 

NSLog(@"Music on method called"); 

    @synchronized (self) 
    { 
     if (!musicOn) { 

      musicOn = [[super allocWithZone:nil]init]; 
     } 

    } 
    //Play Music. 
    NSError *error; 
    NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:@"music" withExtension:@"wav"]; 
    musicOn.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error]; 
    musicOn.backgroundMusicPlayer.numberOfLoops = -1; 
    [musicOn.backgroundMusicPlayer prepareToPlay]; 
    [musicOn.backgroundMusicPlayer play]; 
    NSLog(@"Music on"); 

} 
    return musicOn; 

} 
+0

Я создаю одноэлементный класс под названием «Player». Должен ли я перемещать свои методы из viewController и в «Player»? – Jason

+0

Я добавил свой метод после создания одноэлементного класса, звук включается при открытии приложения, отключается при ударе, но когда он нажимается, метод вызывается, но не содержит музыку в инструкции IF. Ты знаешь почему? – Jason

+0

Да, вы должны переместить методы в одноэлементный класс. – ZeMoon

3

В вашем MainMenu.m вы создаете новый экземпляр каждый раз, когда нажимается кнопка с кодом: ViewController *musicInstance = [[ViewController alloc] init]; с последующим [musicInstance musicOn]; Вы также делаете это, когда вы поворачиваете музыка снова выключена.

Убедитесь, что переменная статического игрока не находится внутри метода, или вы создадите новые экземпляры AVAuidioPlayer вместо их сохранения. Помогает ли ниже код класса игрока?

static Player *musicOn = nil; // <-- Shouldn't be in the method. 

+ (Player *)musicOn 
{ 
    NSLog(@"Music on method called"); 
    if (!musicOn) 
    { 
     musicOn = [[super allocWithZone:nil] init]; 
     NSError *error; 
     NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:@"music" withExtension:@"wav"]; 
     musicOn.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error]; 
     musicOn.backgroundMusicPlayer.numberOfLoops = -1; 
     [musicOn.backgroundMusicPlayer prepareToPlay]; 
    } 
    [musicOn.backgroundMusicPlayer play]; 
    NSLog(@"Music on"); 
    return musicOn; 
} 
+0

Я сделал одноэлементный класс под названием Player, так вот как я его сейчас называю. [Player musicOn]; – Jason

+0

Я переместил статическую переменную вне метода, такую ​​же проблему. После того, как каждый метод вызывается один раз, он вызывается методом, но не вызывает его внутри оператора IF. Я предполагаю, что это потому, что его не ноль, я поставил журнал, чтобы узнать, нет ли он, а его нет, но он не возвращается или что-то в этом роде. – Jason

Смежные вопросы