替换场景时Cocos2d游戏崩溃(包含代码)

时间:2012-11-25 05:58:02

标签: iphone ios cocos2d-iphone

因此我的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];
}

1 个答案:

答案 0 :(得分:1)

您正在以某种方式向场景添加节点两次,我查看了您的代码并且无法发现它但很容易找到它们。只需为所有Objective C异常添加断点即可。调试器将停在导致问题的线路上。

有关如何添加断点的信息,请参阅here。您可以将“Exception:All”更改为“Exception:Objective C”,以避免在使用CocosDenhesion时出现异常。

相关问题