Я делаю простой игровой проект с использованием Cocos2d. Теперь, как определено пример Рэя Вендерлиха, я завершил весь урок, но сам добавил дополнительный бит кода, чтобы проверить общее количество дынь, когда их становится 3, я заменяю экран на экран «Вы выиграли», чтобы уведомить пользователя о том, что он выиграл, используя [[CCDirector sharedDirector] replaceScene:gameoverscreen];
.
Проблема в том, что я получаю EXC_BAD_ACCESS каждый раз, когда я вызываю это из ccTouchEnded
, потому что здесь проверяется мое условие. Но то же самое работает, если я использую [[CCDirector sharedDirector] pushScene:gameoverscreen];
Не могу понять в чем проблема!!
код для экрана gameoverscreen:
#import "GameOverScene.h"
#import "HelloWorldScene.h"
@implementation GameOverScene
@synthesize _layer = layer;
- (id)init {
if ((self = [super init])) {
self._layer = [GameOverLayer node];
[self addChild:layer];
}
return self;
}
- (void)dealloc {
[layer release];
layer = nil;
[super dealloc];
}
@end
@implementation GameOverLayer
@synthesize _label = label;
-(id) init
{
if( (self=[super initWithColor:ccc4(255,255,255,255)] )) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
self._label = [CCLabel labelWithString:@"" fontName:@"Arial" fontSize:32];
label.color = ccc3(0,0,0);
label.position = ccp(winSize.width/2, winSize.height/2);
[self addChild:label];
[self runAction:[CCSequence actions:
[CCDelayTime actionWithDuration:3],
[CCCallFunc actionWithTarget:self selector:@selector(gameOverDone)],
nil]];
}
return self;
}
- (void)gameOverDone {
[[CCDirector sharedDirector] replaceScene:[[[HelloWorld alloc] init] autorelease]];
}
- (void)dealloc {
[label release];
label = nil;
[super dealloc];
}
@end
а файл заголовка GameoverScene содержит следующее!
#import "cocos2d.h"
@interface GameOverLayer : CCColorLayer {
CCLabel *label;
}
@property (nonatomic, retain) CCLabel *_label;
@end
@interface GameOverScene : CCScene {
GameOverLayer *layer;
}
@property (nonatomic, retain) GameOverLayer *_layer;
@end
я вызываю сцену из класса HelloWorld, используя следующий синтаксис!
GameOverScene *gameoverscene = [GameOverScene node];
[gameoverscene._layer._label setString:@"You WON!"];
[[CCDirector sharedDirector] pushScene:gameoverscene];