次のことを行う必要があります: スプライトがある位置に移動し、スプライトがこの位置に移動したら、逆のアクションを実行する必要があります。
この例のテストでは、その位置に到達したときに「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) には到達しません。