目标 - C:`self`没有回应

时间:2012-03-25 09:04:04

标签: objective-c cocos2d-iphone

我有一个名为ChoosePlayer的cocos2d图层,在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:]也没有回应。所以我猜它不是sprite的问题,而是self本身。

initavatarchanged之间,我正在做的是在openGL View上显示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

获取flowcoverview的页面的链接

2 个答案:

答案 0 :(得分:2)

'self'是否处于运行模式(self.isRunning)?如果不是从cocos2d的观点来看也不会发生什么。将ChoosePlayer实例添加到正在运行的CCNode后代时,可以实现isRunning模式。如果您忘记将其添加到正在运行的节点,它将在绘图,操作等中被忽略......

答案 1 :(得分:1)