我需要做以下事情:一个精灵被移动到一个位置,当精灵移动到这个位置时,我需要执行相反的动作。
为了在这个例子中进行测试,当我到达那个位置时,我只打印“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)。