2012-03-25 3 views
0

У меня есть слой cocos2d с именем ChoosePlayer и в методе init. Я добавляю несколько спрайтов с помощью [self addChild:]. Его равнина и работает правильно. Но когда я пытаюсь сделать то же самое в другом методе, как указано ниже, ее не работает:Цель - C: `self` не отвечает

-(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 не отвечает.

Edit: вот мой 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, они могли бы что-то делать с моей проблемой, но я не уверен.

Не могли бы вы помочь мне с этим?

Edit 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 БГ является также не получает прикладной, но делает то же самое в init метод отлично работает правильно.

Редактировать 3: FlowCoverView, который я добавляю, реализован с помощью вызовов OpenGL изнутри. Может быть, это может вызвать конфликты с настройкой состояний OpenGL в cocos2d. Но я не знаю OpenGL, чтобы искать такие проблемы. Вот ссылка на страницу, где я снял обзор потока с http://www.chaosinmotion.com/flowcover.html

+0

где '- (Недействительными) avatarchanged' объявлен? – giorashc

+0

Что значит «его не работает» и «тоже не отвечает»? Происходит ли NSLog? – yuji

+0

Не могли бы вы показать свой метод init? –

ответ

2

Является ли «я» в режиме работы (self.isRunning)? если ничего не будет сделано с точки зрения cocos2d. Режим isRunning достигается, когда вы добавляете экземпляр SelectPlayer к исполняемому потоку CCNode. Если вы забыли добавить его к работающему узлу, он будет проигнорирован в розыгрышах, действия и т.д. ...

+0

отличная подсказка, я был чертовски уверен, что «isRunning» будет ложным, но, к сожалению, это не .. !!! – saiy2k

1

Это может помочь: http://www.cocos2d-iphone.org/forum/topic/28056

+0

thx для ссылки ... Я havnt реализовал 'onExit' и' onEnter' в моем классе, но теперь я реализовал те с соответствующими 'super' вызовами и попробовал, все еще не работая. и, как сказано в этом сообщении, я прокомментировал out my 'self.isTouchEnabled = YES;' и сенсорные методы, то и его не работает .. !! – saiy2k