我需要执行以下操作:将精灵移动到某个位置,当精灵进入此位置时,我需要执行反向操作。
为了在这个例子中进行测试,我只是在到达那个位置时打印“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)。
答案 0 :(得分:2)
在-observeValueForKeyPath:ofObject:change:context:
方法中删除if语句第一行后面的分号。因此,无条件地调用NSLog
函数。
答案 1 :(得分:1)
我不会将KVO / KVC与cocos2d一起使用,原因很简单,因为cocos2d不符合KVC / KVO。如果没有收到通知,Cocos2D类的属性可能会发生变化。
我不知道这是否是这个问题,但如果你继续使用KVC / KVO,你很可能会遇到问题。