无论如何在行动开始后修改CCMoveTo的目的地?

时间:2012-01-15 06:59:56

标签: ios cocos2d-iphone ccaction

我想在移动完成后移动一个节点并调用一个块。但有时我需要在节点移动时将节点移动到另一个位置(更改目标)。

我不能简单地停止上一个操作并启动新操作,因为不会调用回调并导致状态不一致。

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 个答案:

答案 0 :(得分: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变量,这将修改目的地。)