이동을 마친 후 노드를 이동하고 블록을 호출하고 싶습니다. 하지만 때로는 노드가 다른 위치로 이동해야합니다 (대상 변경).작업 시작 후 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
개선 된 코드를 제 질문에 넣었습니다. 당신은 좋은 출발점을 주므로 당신의 대답을 받아 들일 것입니다. –