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是你的雪碧的高度和宽度吗?那么你有什么建议?我需要知道行动停止了。那你有什么建议?我需要知道行动停止了。