0

我需要做以下事情:一个精灵被移动到一个位置,当精灵移动到这个位置时,我需要执行相反的动作。
为了在这个例子中进行测试,当我到达那个位置时,我只打印“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”。在断点中我打印位置,最后一个值为(47,47),它永远不会达到(0,0)。

4

2 回答 2

2

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

于 2012-12-10T18:34:58.143 回答
1

我不会将 KVO/KVC 与 cocos2d 一起使用,原因很简单,因为 cocos2d 不兼容 KVC/KVO。Cocos2D 类的属性可能会在您没有收到通知的情况下发生更改。

我不知道这是否是这里的问题,但如果你继续使用 KVC/KVO,你最终会遇到问题。

于 2012-12-11T11:18:56.430 回答