Cocos2d iphone Cocos2d CocosDenshion声音引擎停止错误

Cocos2d iphone Cocos2d CocosDenshion声音引擎停止错误,cocos2d-iphone,Cocos2d Iphone,感谢您抽出时间来研究这个问题,我对编程非常陌生,遇到了以下错误。任何帮助都将不胜感激 我目前正在通过Ray Wenderlich的《learning CoCoCos2D》一书学习,但同时也尝试使用代码来学习更多内容,这就是我遇到的无法解决的问题 “我正在使用CocosDenshion播放主菜单和第一个游戏场景的音乐曲目,”Ray在书中建议从游戏场景调用以下方法 [[GameManager sharedGameManager] playBackgroundTrack:BACKGOUND_TRACK

感谢您抽出时间来研究这个问题,我对编程非常陌生,遇到了以下错误。任何帮助都将不胜感激

我目前正在通过Ray Wenderlich的《learning CoCoCos2D》一书学习,但同时也尝试使用代码来学习更多内容,这就是我遇到的无法解决的问题

“我正在使用CocosDenshion播放主菜单和第一个游戏场景的音乐曲目,”Ray在书中建议从游戏场景调用以下方法

[[GameManager sharedGameManager] playBackgroundTrack:BACKGOUND_TRACK_OLE_AWAKES];
这当然有效,但我不想在游戏场景中调用上述方法,而是想控制GameManager类中音乐的开始和停止。 所以我想让音乐在菜单中播放,然后在游戏层上不播放任何东西,从一个类控制它

为此,我尝试在“GameManager.h.”中添加以下内容

在下面的方法中

    - (NSString*)formatSceneTypeToString:(SceneTypes)sceneID {
        NSString *result = nil;
        switch(sceneID) {
            case kNoSceneUninitialized:
                if ((soundEngine.isBackgroundMusicPlaying == YES)){
                    [soundEngine stopBackgroundMusic];
                }
                result = @"kNoSceneUninitialized";
                break;

             case kMainMenuScene:

                if ((isSoundEffectsOn == YES)&&(soundEngine.isBackgroundMusicPlaying == NO)){

                [self playBackgroundTrack:BACKGROUND_TRACK_MAIN_MENU];
                } else if ((isSoundEffectsOn == NO)&&(soundEngine.isBackgroundMusicPlaying == YES)){
                    [soundEngine stopBackgroundMusic];
                }

                if (isMusicOn == YES) {
                    result = @"kMainMenuScene";
                } else if (isMusicOn == NO) {
                    result = @"kNoSceneUninitialized";                
                   // return NO;
                }
                break;

           case kOptionsScene:

            if ((isSoundEffectsOn == YES)&&(soundEngine.isBackgroundMusicPlaying == NO)){

                [self playBackgroundTrack:BACKGROUND_TRACK_MAIN_MENU];
            } else if ((isSoundEffectsOn == NO)&&(soundEngine.isBackgroundMusicPlaying == YES)){
                [soundEngine stopBackgroundMusic];
            }
            if (isMusicOn == YES) {
                result = @"kOptionsScene";
            } else if (isMusicOn == NO) {
               // return NO;
                result = @"kNoSceneUninitialized";                
            }
            break;




                case kGameLevel1:


                if ([soundEngine.isBackgroundMusicPlaying == YES]){
                    [soundEngine stopBackgroundMusic]; <--CRASHES HERE!

                } else  {

                }
                result = @"kGameLevel1";
                break;
很抱歉,这个问题太长,但我想尝试包含尽可能多的信息

编辑

我可能完全错了,但如果声音引擎是从两个不同的类调用的,会导致这种情况吗?因为我在主菜单层中有以下内容

-(void)playScene:(CCMenuItemFont*)itemPassedIn {
    if ([itemPassedIn tag] == 1) {
        CCLOG(@"Tag 1 found, mode");
        if ([GameManager sharedGameManager].isSoundEffectsOn ==YES ) {

            PLAYSOUNDEFFECT(BUTTONPRESS); <----Calling the sound engine to play a sound on button press.- this is unloading the sound as level1 starts.

            [[GameManager sharedGameManager] runSceneWithID:kGameLevel1];
        }else if ([GameManager sharedGameManager].isSoundEffectsOn ==NO ) {
            [[GameManager sharedGameManager] runSceneWithID:kGameLevel1];
            return;
        }
-(void)播放场景:(CCMenuItemFont*)项目传递{
如果([itemPassedIn标记]==1){
CCLOG(@“找到标签1,模式”);
如果([GameManager sharedGameManager].isSoundEffectsOn==是){

PLAYSOUNDEFFECT(BUTTONPRESS);你确定这行是正确的吗?如果([soundEngine.IsBackgroundMusicLaying==YES])。就在“崩溃在这里”的正上方。看起来它不会编译。嗨,本,谢谢你的回复。问题是它确实有效(大多数时候,平均每10次调用游戏级别就会崩溃一次).另外,我从Rays的书中偷了这句话。看了更多的书后,我想这可能与我合并了一个声音文件(按钮)有关在主菜单层,因为它失败了,因为有两个层正在尝试访问同一个声音引擎。现在还要编辑问题以包括它。只尝试删除主菜单层上的按钮声音效果(在编辑问题之前不应该这样!!)(将其保留在选项屏幕中)它似乎没有崩溃那么多,但仍然崩溃。我想我当时有一分钟的时间,就像它崩溃时一样,它把我带到CDAudioManager.h.和[audioSourcePlayer iPlaying]的线路上。我真是个笨蛋。
-(BOOL) isPlaying {
    if (state != kLAS_Init) {
        return [audioSourcePlayer isPlaying]; <--Thread 18:EXC_BAD_ACCESS(code=1,address=0x8001400c)


    } else {
        return NO;
    }
}
2014-10-28 12:46:03.948 SpaceViking[1807:343] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CCStandardTouchHandler isPlaying]: unrecognized selector sent to instance 0x7e013d80'
*** First throw call stack:
(
    0   CoreFoundation                      0x05bb25e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x025658b6 objc_exception_throw + 44
    2   CoreFoundation                      0x05c4f903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x05ba290b ___forwarding___ + 1019
    4   CoreFoundation                      0x05ba24ee _CF_forwarding_prep_0 + 14
    5   SpaceViking                         0x00183e72 -[CDLongAudioSource isPlaying] + 82
    6   SpaceViking                         0x00185425 -[CDAudioManager isBackgroundMusicPlaying] + 69
    7   SpaceViking                         0x0018ea60 -[SimpleAudioEngine isBackgroundMusicPlaying] + 48
    8   SpaceViking                         0x0019fe62 -[GameManager formatSceneTypeToString:] + 9634
    9   SpaceViking                         0x001a095e -[GameManager getSoundEffectsListForSceneWithID:] + 2302
    10  SpaceViking                         0x0019d50a -[GameManager unloadAudioForSceneWithID:] + 186
    11  Foundation                          0x01e39597 -[NSThread main] + 76
    12  Foundation                          0x01e394f6 __NSThread__main__ + 1275
    13  libsystem_pthread.dylib             0x02d185fb _pthread_body + 144
    14  libsystem_pthread.dylib             0x02d18485 _pthread_struct_init + 0
    15  libsystem_pthread.dylib             0x02d1dcf2 thread_start + 34
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 
-(void)playScene:(CCMenuItemFont*)itemPassedIn {
    if ([itemPassedIn tag] == 1) {
        CCLOG(@"Tag 1 found, mode");
        if ([GameManager sharedGameManager].isSoundEffectsOn ==YES ) {

            PLAYSOUNDEFFECT(BUTTONPRESS); <----Calling the sound engine to play a sound on button press.- this is unloading the sound as level1 starts.

            [[GameManager sharedGameManager] runSceneWithID:kGameLevel1];
        }else if ([GameManager sharedGameManager].isSoundEffectsOn ==NO ) {
            [[GameManager sharedGameManager] runSceneWithID:kGameLevel1];
            return;
        }