В любом случае, чтобы изменить назначение CCMoveTo после начала действия? - PullRequest
2 голосов
/ 15 января 2012

Я хочу переместить узел и вызвать блок после перемещения. Но иногда мне нужно переместить узел в другое положение, когда этот узел движется (изменить пункт назначения).

Я не могу просто остановить предыдущее действие и начать новое, потому что обратный вызов не будет вызван и приведет к несогласованному состоянию.

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 Ответ

1 голос
/ 15 января 2012

Вы можете добавить метод 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 доступной для части кода, которая изменит место назначения).

...