Wednesday, February 8, 2012

Cocos2D iPhone - running actions on multiple targets + callback


I have an array of objects (objArray) and an array of actions (actArray). Both arrays are in order, I mean, object at index 0 of objArray has to perform action 0 on actArray.



To make the explanation clear, lets imagine both arrays have 3 objects, obj0, obj1 and obj2.




obj0 has to perform action 0 on actArray
obj1 has to perform action 1 on actArray
obj2 has to perform action 2 on actArray



these 3 operations (or n, in the case of the array) have to happen simultaneously.



When all animations end, I need the method animationsFinished to be called.



How do I do that?



I am beginning in Cocos. I have googled around and have not found any practical example around. I have found CCSpan but I don't see how this can be used with multiple objects each one with its own action. thanks.

2 comments:

  1. You can just perform the actions sequentially and they will occur at the same time.

    int yourAnimationDuration; //this needs to be set to whatever your animation speed is
    for(int idx = 0; idx < 3; idx++) {
    [[objArray objectAtIndex:idx] runAction:[actArray objectAtIndex:idx]];
    [self performSelector:@selector(someMethodToBeExecutedWhenAnimationFinishes) withObject:nil afterDelay:yourAnimationDuration];
    }


    Or if you want the animation-is-finished method to be executed only once, just take it out of the for loop.

    Edit:

    id finalAnimation = [CCSequence actionOne:[actArray objectAtIndex:idx] two:someMethod];


    This (I believe) will execute your method once the first action is completed.

    ReplyDelete
  2. In above case you mentioned , someMethodToBeExecutedWhenAnimationFinishes will be executed three times. Just use it 1 time after the loop.
    'yourAnimationDuration' will be time of the action with maximum duration as all other actions must have ended before the one with maximum duration.

    'CCSequence' is a good option but you need to perform CCSequence only with the action with maximum duration instead of all of the objects.

    So In 1st case

    int yourAnimationDuration; //this needs to be set to duration of action with maximum time
    for(int idx = 0; idx < 3; idx++) {
    [[objArray objectAtIndex:idx] runAction:[actArray objectAtIndex:idx]];
    }
    [self performSelector:@selector(someMethodToBeExecutedWhenAnimationFinishes) withObject:nil afterDelay:yourAnimationDuration];


    In 2nd Case
    Suppose if your 2nd action takes maximum time.

    int actionNum = 2;
    for(int idx = 0; idx < 3; idx++) {
    if(idx == (actionNum-1))
    {
    [[objArray objectAtIndex:idx] runAction:[CCSequence actions:[actArray objectAtIndex:idx],[CCCallFuncN actionWithTarget:self selector:@selector(someMethodToBeExecutedWhenAnimationFinishes:)],nil];
    }
    else{
    [[objArray objectAtIndex:idx] runAction:[actArray objectAtIndex:idx]];
    }
    }


    Hope that helps. I have not run this code. So check for syntax if any. :)

    ReplyDelete