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