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

改善されたコードを私の質問に入れました。私はあなたの答えを受け入れるため、あなたは良い出発点を与えます。 –

関連する問題