2012-01-15 2 views
2

Я хочу переместить узел и вызвать блок после завершения перемещения. Но иногда мне нужно переместить узел в другую позицию, пока этот узел перемещается (сменяет место назначения).В любом случае, чтобы изменить назначение 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 

ответ

1

Вы можете добавить setEndPosition метод с использованием категории (предупреждение: проверялось, дайте мне знать в комментариях, если это не работает):

@interface CCMoveTo (SetEndPosition) 

- (void)setEndPosition:(CGPoint)position; 

@end 


@implementation CCMoveTo (SetEndPosition) 

- (void)setEndPosition:(CGPoint)position { 
    endPosition_ = position; 
    delta_ = ccpSub(endPosition_, startPosition_); 
} 

@end 

Затем измените пункт назначения, вызвав [move setEndPosition:newPosition] (это означает, что вы должны сделать переменную move доступной для части кода, которая изменит назначение) ,

+0

Узел будет прыгать, когда я назову 'setEndPosition:'. Я думаю, что это сложнее. –

+0

@ xlc0212 Вы уже решили свою проблему? Потому что, если вы уже отметили ответ здесь, это значит. – Lukman

+1

Я поставил улучшенный код в свой вопрос. Вы даете хорошую начальную точку, поэтому я принимаю ваш ответ. –

Смежные вопросы