Iphone Can';t检测运行动作的精灵的确切位置

Iphone Can';t检测运行动作的精灵的确切位置,iphone,objective-c,ios,cocos2d-iphone,Iphone,Objective C,Ios,Cocos2d Iphone,我需要执行以下操作:将精灵移动到某个位置,当精灵移动到此位置时,我需要执行反向操作。 对于本例中的测试,当我到达该位置时,我只打印“ok”,以避免过度释放操作并冒一些异常的风险 -(id) init { if( (self=[super init])) { soldier=[CCSprite spriteWithFile: @"soldier.gif"]; soldier.position= CGPointMake(250, 250);

我需要执行以下操作:将精灵移动到某个位置,当精灵移动到此位置时,我需要执行反向操作。
对于本例中的测试,当我到达该位置时,我只打印“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");
    }
}
问题是,它打印“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”。在断点I打印位置,最后一个值是(47,47),它永远不会到达(0,0)。

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

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

我不会将KVO/KVC与cocos2d一起使用,原因很简单,cocos2d不符合KVC/KVO。Cocos2D类的属性可能会在您从未收到通知的情况下更改


我不知道这是否是问题所在,但如果您继续使用KVC/KVO,很有可能最终会遇到问题。

我不会将KVO/KVC与cocos2d一起使用,原因很简单,cocos2d不符合KVC/KVO。Cocos2D类的属性可能会在您从未收到通知的情况下更改


我不知道这是否是问题所在,但如果继续使用KVC/KVO,很有可能最终会遇到问题。

谢谢。因此,现在它不会打印很多ok,但永远不会打印ok。我编辑了答案。@RamyAlZuhouri,因为您正在执行
CGPoint
的转换,为什么不尝试在内部放置一个
NSLog
语句,以直观地确定转换后的点是否达到
CGPointZero
?@RamyAlZuhouri尝试不在
内部的点上执行转换-observeValueForKeyPath:of对象:更改:上下文:
。因为你已经修复了你的条件,它显然永远不会等于真。即使我这样做,它也永远不会到达CGZeroPoint。精灵正在向CGZeroPoint移动,你知道如何使用observeValueForKeyPath:ofObject:change检测移动的结束吗?@RamyAlZuhouri我不知道你的
-runAction:
方法中发生了什么,但你所做的一切看起来都很好。您的通知方法正在被调用(现在仍然是,尽管您的条件计算结果为false)应该可以证明这一点。这里还有一个建议:47可能是你的精灵的高度和宽度吗?谢谢。所以现在它不会打印很多ok,但它永远不会打印ok。我编辑了答案。@RamyAlZuhouri,因为你正在执行
CGPoint
的转换,为什么不尝试在内部放置一个
NSLog
语句,以直观地确定转换后的点是否达到
CGPointZero
?@RamyAlZuhouri尝试不在
内部的点上执行转换-observeValueForKeyPath:of对象:更改:上下文:
。因为你已经修复了你的条件,它显然永远不会等于真。即使我这样做,它也永远不会到达CGZeroPoint。精灵正在向CGZeroPoint移动,你知道如何使用observeValueForKeyPath:ofObject:change检测移动的结束吗?@RamyAlZuhouri我不知道你的
-runAction:
方法中发生了什么,但你所做的一切看起来都很好。您的通知方法正在被调用(现在仍然是,尽管您的条件计算结果为false)应该可以证明这一点。这里还有另一个建议:47是你的雪碧的高度和宽度吗?那么你有什么建议?我需要知道行动停止了。那你有什么建议?我需要知道行动停止了。