Ios 是否仍要在操作启动后修改CCMoveTo的目标?
我想移动一个节点并在移动完成后调用一个块。但有时我需要在节点移动时将节点移动到另一个位置(更改目的地) 我不能简单地停止以前的操作并开始新的操作,因为这样回调将不会被调用并导致不一致的状态Ios 是否仍要在操作启动后修改CCMoveTo的目标?,ios,cocos2d-iphone,ccaction,Ios,Cocos2d Iphone,Ccaction,我想移动一个节点并在移动完成后调用一个块。但有时我需要在节点移动时将节点移动到另一个位置(更改目的地) 我不能简单地停止以前的操作并开始新的操作,因为这样回调将不会被调用并导致不一致的状态 id move = [CCMoveTo actionWithDuration:time position:pos]; id call = [CCCallBlock actionWithBlock:^{ // do something like clean up }]; CCSequence *action =
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
您可以使用category添加setEndPosition
方法(警告:未测试,如果不起作用,请在注释中告诉我):
然后,通过调用[move setEndPosition:newPosition]
(这意味着您必须使move
变量可访问将修改目标的代码部分)。当我调用setEndPosition:
时,节点将跳转。我认为比这更复杂。@xlc0212您已经解决了您的问题吗?因为如果你已经在这里勾选了答案,这意味着。我在我的问题中加入了改进的代码。你给了我一个很好的起点,所以我接受你的回答。
@interface CCMoveTo (SetEndPosition)
- (void)setEndPosition:(CGPoint)position;
@end
@implementation CCMoveTo (SetEndPosition)
- (void)setEndPosition:(CGPoint)position {
endPosition_ = position;
delta_ = ccpSub( endPosition_, startPosition_ );
}
@end