因此我的Cocos2d游戏会出现问题。我最近添加了一些代码,允许我在游戏的某些级别的开头有一个对话框消息。每当我重新启动一个级别(取代场景)的级别,其中有一个对话框cclayer添加到当前场景时,我通过iPhone模拟器得到一个BAD ACCESS错误,然后如果我在iPhone 4S上运行它我我收到一个说
的SIGARBT错误“ * 由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'已添加子项。无法再次添加'”
这是我正在制作的第一个cocos2d游戏。我用cocos2d玩弄了很多东西,并且我认为这是一个基本的理解。我有很多其他语言的编程经验,但我大约3个月前才开始学习objective-c。
这是我的代码。
GameDialog.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "GameData.h"
@interface GameDialogLayer : CCLayer {
NSString *dialogText;
}
@property (nonatomic, retain) NSString *dialogText;
+(CCScene *) scene;
-(void) addDialogWithText: (NSString *)text;
@end
GameDialog.m
#import "GameDialogLayer.h"
@implementation GameDialogLayer
@synthesize dialogText;
+(CCScene *) scene
{
CCScene *scene = [CCScene node];
GameDialogLayer *layer = [GameDialogLayer node];
[scene addChild: layer];
return scene;
}
-(id) init
{
if( (self=[super init]) ) {
// init the bg overlay
CCLayerColor *backgroundLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 175)];
[self addChild:backgroundLayer z:0];
// init the dialog box
CCSprite *dialogBox = [CCSprite spriteWithFile:@"dialog.png"];
dialogBox.position = ccp([[CCDirector sharedDirector] winSize].width / 2, [[CCDirector sharedDirector] winSize].height / 2);
[self addChild:dialogBox];
// init the dialog menu
CCMenuItemImage *dialogOkay = [CCMenuItemImage itemWithNormalImage:@"dialogOkayButton.png" selectedImage:@"dialogOkayButtonPressed.png" target:self selector:@selector(okayButton)];
CCMenu *dialogMenu = [CCMenu menuWithItems:dialogOkay, nil];
dialogMenu.position = ccp(dialogMenu.position.x, dialogMenu.position.y - 118);
[self addChild:dialogMenu];
}
return self;
}
-(void) okayButton
{
[GameData sharedGameData].isPaused = 0;
[[self parent] schedule:@selector(startCountdown:) interval:1];
[[self parent] removeChild:self cleanup:YES];
}
-(void) addDialogWithText: (NSString *)text
{
CCLabelTTF *dialogTextLabel = [CCLabelTTF labelWithString:text dimensions:CGSizeMake(180, 250) hAlignment:kCCTextAlignmentLeft fontName:@"MarkerFelt-Thin" fontSize:20];
dialogTextLabel.color = ccBLACK;
dialogTextLabel.position = ccp([[CCDirector sharedDirector] winSize].width / 2, [[CCDirector sharedDirector] winSize].height / 2);
[self addChild:dialogTextLabel];
}
- (void) dealloc
{
[super dealloc];
}
@end
然后对话框被添加到我的levelData类的dialog对象属性中,该对象属性为每个级别进行了身份验证,并保存了该级别的属性。
这是持有它的财产
@property (nonatomic, retain) GameDialogLayer *dialog;
以下是我将对话框添加到levelData对话框属性
的方法-(void) addDialog: (NSString *)dialogText
{
dialog = [GameDialogLayer node];
[dialog addDialogWithText:dialogText];
}
答案 0 :(得分:1)
您正在以某种方式向场景添加节点两次,我查看了您的代码并且无法发现它但很容易找到它们。只需为所有Objective C异常添加断点即可。调试器将停在导致问题的线路上。
有关如何添加断点的信息,请参阅here。您可以将“Exception:All”更改为“Exception:Objective C”,以避免在使用CocosDenhesion时出现异常。