2

ノードを移動し、移動後にブロックを呼び出したい。ただし、ノードの移動中にノードを別の位置に移動する必要がある場合があります (移動先の変更)。

コールバックが呼び出されず、一貫性のない状態につながるため、以前のアクションを単純に停止して新しいアクションを開始することはできません。

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
4

1 に答える 1

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、送信先を変更するコード部分が変数にアクセスできるようにする必要があります)。

于 2012-01-15T15:56:41.653 に答える