0

私の Cocos2d ゲームで何かがおかしくなっています。最近、ゲームの特定のレベルの開始時にダイアログ メッセージを表示できるコードをいくつか追加しました。ダイアログ cclayer が現在のシーンに追加されているレベルの (シーンを置き換える) レベルを再起動するたびに、iPhone シミュレーターで BAD ACCESS エラーが発生し、iPhone 4S で実行すると、という SIGARBT エラーが発生しています

" *キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: '子は既に追加されています。再度追加することはできません'"

これは私が作っている最初の cocos2d ゲームです。私は cocos2d をいろいろいじりましたが、基本的な理解であると信じています。他の言語でのプログラミング経験は豊富ですが、objective-c の学習を始めたのは約 3 か月前です。

これが私のコードです。

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 クラスのダイアログ プロパティにダイアログが追加されます。

保有物件はこちら

@property (nonatomic, retain) GameDialogLayer *dialog;

そして、これがダイアログをlevelDataダイアログプロパティに追加する方法です

-(void) addDialog: (NSString *)dialogText
{
    dialog = [GameDialogLayer node];
    [dialog addDialogWithText:dialogText];
}
4

1 に答える 1

1

どういうわけかシーンにノードを 2 回追加しています。コードを確認しましたが、見つけられませんでしたが、簡単に見つけることができます。すべての Objective C 例外にブレークポイントを追加するだけです。デバッガーは、問題の原因となっている行で停止します。

ブレークポイントの追加方法については、こちらを参照してください。CocosDenhesion を使用している場合は、「Exception: All」を「Exception: Objective C」に変更して、CocosDenhesion からの例外を回避できます。

于 2012-11-26T00:53:14.197 に答える