私の 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];
}