ノードを移動し、移動後にブロックを呼び出したい。ただし、ノードの移動中にノードを別の位置に移動する必要がある場合があります (移動先の変更)。
コールバックが呼び出されず、一貫性のない状態につながるため、以前のアクションを単純に停止して新しいアクションを開始することはできません。
id move = [CCMoveTo actionWithDuration:time position:pos];
id call = [CCCallBlock actionWithBlock:^{
// do something like clean up
}];
CCSequence *action = [CCSequence actions:move, call, nil];
action.tag = kMovingActionTag;
[node runAction:action];
アクションを取得できますが、CCSequence *action = (id)[node getActionByTag:kMovingActionTag];
できることはそれを停止して CCCallBlock アクションを失うことだけです。
これは改善されたソリューションです:
@interface CCMoveTo (SetEndPosition)
- (void)setEndPosition:(CGPoint)position;
@end
@implementation CCMoveTo (SetEndPosition)
- (void)setEndPosition:(CGPoint)position {
CGPoint pos = [target_ position];
CGFloat dis = ccpLength(delta_);
CGFloat move = ccpDistance(endPosition_, pos);
CGFloat percent = move / dis;
endPosition_ = position;
delta_ = ccpSub( endPosition_, pos);
delta_.x /= percent;
delta_.y /= percent;
startPosition_ = ccpSub(endPosition_, delta_);
}
@end