2012-01-15 1 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

개선 된 코드를 제 질문에 넣었습니다. 당신은 좋은 출발점을 주므로 당신의 대답을 받아 들일 것입니다. –