我想移动一个节点并在移动完成后调用一个块。但有时我需要在节点移动时将节点移动到另一个位置(更改目标)。
我不能简单地停止上一个动作并开始新的动作,因为不会调用回调并导致状态不一致。
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