无法检测运行动作的精灵的确切位置

时间:2012-12-10 17:57:38

标签: iphone objective-c ios cocos2d-iphone

我需要执行以下操作:将精灵移动到某个位置,当精灵进入此位置时,我需要执行反向操作。
为了在这个例子中进行测试,我只是在到达那个位置时打印“ok”,避免过度释放动作并冒一些异常。

-(id) init
{
    if( (self=[super init]))
    {
        soldier=[CCSprite spriteWithFile: @"soldier.gif"];
        soldier.position= CGPointMake(250, 250);
        [self addChild: soldier];
        CGPoint position=[soldier convertToNodeSpace: CGPointZero];
        CCMoveTo* move=[CCMoveBy actionWithDuration: 2 position: position];
        [move retain];
        [soldier addObserver: self forKeyPath: @"position" options: NSKeyValueObservingOptionNew context: (void*)move];
        [soldier runAction: move];
    }
    return self;
}

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    CGPoint position= [self convertToNodeSpace: soldier.position];
    if(CGPointEqualToPoint(position, CGPointZero));
    {
        NSLog(@"ok");
    }
}

问题是它很多次打印“确定”,它应该只打印一次,为什么?

修改

我删除了额外的';' :

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    CGPoint position= [self convertToNodeSpace: soldier.position]; // breakpoint here
    if(CGPointEqualToPoint(position, CGPointZero))
    {
        NSLog(@"ok");
    }
}

现在它从不打印“ok”。在断点我打印位置,最后一个值是(47,47),它永远不会达到(0,0)。

2 个答案:

答案 0 :(得分:2)

-observeValueForKeyPath:ofObject:change:context:方法中删除if语句第一行后面的分号。因此,无条件地调用NSLog函数。

答案 1 :(得分:1)

我不会将KVO / KVC与cocos2d一起使用,原因很简单,因为cocos2d不符合KVC / KVO。如果没有收到通知,Cocos2D类的属性可能会发生变化。

我不知道这是否是这个问题,但如果你继续使用KVC / KVO,你很可能会遇到问题。