2012-03-25 62 views
0

我有一个名为ChoosePlayer的cocos2d图层和init方法,我使用[self addChild:]添加了一些精灵。它的朴素和正确的作品。但是,当我尝试下面给出这样做的另一种方法,它不工作:Objective-C:`self` not responding

-(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本身。

initavatarchanged之间,我做的是显示对OpenGL视图,顶一个UIView,执行某些操作那里和返回回如下:

-(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 

的BG的runAction也没有得到应用,但在init方法做同样的工作完全正确的。

编辑3: 我添加的FlowCoverView是在内部使用OpenGL调用实现的。可能会导致与cocos2d中的OpenGL状态设置冲突。但我不知道OpenGL寻找这些问题。 这里是我从http://www.chaosinmotion.com/flowcover.html

+0

其中' - (无效)avatarchanged'声明? – giorashc 2012-03-25 09:07:48

+0

你的意思是“它不工作”和“也没有回应”? NSLog是否发生? – yuji 2012-03-25 09:09:06

+0

你可以显示你的init方法吗? – 2012-03-25 09:09:17

回答

2

流程模式(self.isRunning)的'self'的页面的链接?如果不是从cocos2d的角度来看没有什么会发生。当您将ChoosePlayer实例添加到正在运行的CCNode后代时,可以实现isRunning模式。如果你忘了将它添加到正在运行的节点,它会在被忽略平局,行动等......

+0

很棒的线索,我确定'isRunning'会是假的,但可悲的是它不是.. !!! – saiy2k 2012-03-26 05:41:32

1
+0

thx为链接...我havnt在我的班级实施'onExit'和'onEnter',但现在我实现了与相应的'超级'调用,并尝试过,仍然没有工作.. 和正如在说我发表评论出我的'self.isTouchEnabled =是;'和触摸方法,然后也不工作..! – saiy2k 2012-03-27 05:13:04