У меня есть слой cocos2d с именем ChoosePlayer
, а в методе init
я добавляю несколько спрайтов, используя [self addChild:]
. Это просто и работает правильно. Но когда я пытаюсь сделать то же самое в другом методе, как указано ниже, он не работает:
-(void) avatarchanged {
[self addChild:[CCSprite spriteWithFile:@"av1.png"]];
[self runAction:[CCMoveBy actionWithDuration:1.0 position:ccp(100, 100)]];
NSLog(@"added new avatar");
}
[self runAction:]
также не отвечает. Так что, я думаю, проблема не в спрайте, а в самом self
.
Между init
и avatarchanged
я показываю UIView поверх OpenGL View, выполняю там некоторые действия и возвращаюсь следующим образом:
-(void) selectAvatar {
CGSize winSize = [CCDirector sharedDirector].winSize;
flowCoverView = [[[FlowCoverView alloc] initWithFrame: CGRectMake(0, 0, 480, 320)] autorelease];
flowCoverView.center = ccp(-80 + winSize.width / 2, 80 + winSize.height / 2);
flowCoverView.delegate = self;
flowCoverView.transform = CGAffineTransformMakeRotation(90*(3.14/180));
[[CCDirector sharedDirector].openGLView.window addSubview:flowCoverView];
}
Когда необходимые действия выполняются, flowCoverView удаляется следующим образом:
- (void)flowCover:(FlowCoverView *)view didSelect:(int)cover {
selectedavat = cover;
[flowCoverView removeFromSuperview];
[[NSNotificationCenter defaultCenter] postNotificationName:@"avatarchanged" object:nil];
}
Уведомление, опубликованное выше, использовало мой метод avatarchanged
, когда self
не отвечает.
Редактировать: вот мой init
метод:
-(id) init {
if( (self=[super init])) {
self.isTouchEnabled = YES;
BG = [CCSprite spriteWithFile:@"opponent.jpg"];
BG.scale *= CC_CONTENT_SCALE_FACTOR() * 1;
BG.position = ccp(240,160);
[self addChild:BG];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(avatarchanged) name:@"avatarchanged" object:nil];
}
return self;
}
Примечание: в моем проекте есть несколько глобальных переменных, объявленных с использованием extern
, они могут как-то иметь отношение к моей проблеме, но я не уверен.
Может кто-нибудь помочь мне с этим?
Редактировать 2:
изменилось avatarchanged
следующим образом:
-(void) avatarchanged {
if (self == nil) {
NSLog(@"self is nil!!!!!!!!");
} else {
NSLog(@"pheww.. its not nil");
}
if (self.isRunning) {
NSLog(@"running");
} else {
NSLog(@"not running");
}
[BG runAction:[CCRotateBy actionWithDuration:1.0 angle:100.0]];
[self addChild:[CCSprite spriteWithFile:@"av1.png"]];
NSLog(@"added new avatar");
[self runAction:[CCMoveBy actionWithDuration:1.0 position:ccp(100, 100)]];
}
журнал показывает как
2012-03-26 11:16:21.213 Funsip[1550:207] pheww.. its not nil
2012-03-26 11:16:21.214 Funsip[1550:207] running
2012-03-26 11:16:21.224 Funsip[1550:207] added new avatar
runAction BG также не применяется, но выполнение того же метода в init
работает идеально.
Редактировать 3:
FlowCoverView, который я добавляю, реализуется внутренними вызовами OpenGL. Возможно, это может вызывать конфликты с настройкой состояний OpenGL в cocos2d. Но я не знаю OpenGL, чтобы искать подобные проблемы.
Вот ссылка на страницу, где я взял потоковое представление от http://www.chaosinmotion.com/flowcover.html