Я хочу переместить узел и вызвать блок после завершения перемещения. Но иногда мне нужно переместить узел в другую позицию, пока этот узел перемещается (сменяет место назначения).В любом случае, чтобы изменить назначение CCMoveTo после запуска действия?
Я не могу просто остановить предыдущее действие и начать новый, потому что обратный вызов не будет вызван и приведет к несогласованному состоянию.
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
Узел будет прыгать, когда я назову 'setEndPosition:'. Я думаю, что это сложнее. –
@ xlc0212 Вы уже решили свою проблему? Потому что, если вы уже отметили ответ здесь, это значит. – Lukman
Я поставил улучшенный код в свой вопрос. Вы даете хорошую начальную точку, поэтому я принимаю ваш ответ. –