Как остановить ранее запущенную анимацию в Cocos2d - PullRequest
0 голосов
/ 05 октября 2011

Я создаю игру, используя cocos2d.

Я перемещаю спрайты, применяя действие CCRepeatForever в методе ccTouchBegan , и когда спрайт сталкивается с другим спрайтом, анимация столкновенияat in ccTouchMoved . У меня проблемы с остановкой анимации после окончания коллизии - я остановил ее с помощью stopAction , но она не работает.

Это код, который я использую:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {    
    [selSprite resumeSchedulerAndActions];
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    [self selectSpriteForTouch:touchLocation];   
    return TRUE;    
}

- (void)selectSpriteForTouch:(CGPoint)touchLocation 
{
    else if(selSprite==FuelTruck) 
    {
        NSMutableArray *FuelTruckWalkAnimFrames = [NSMutableArray array];
        for(int i = FuelTruckTouchStartFrameIndex; i <= FuelTruckTouchEndFrameIndex; ++i) {
            [FuelTruckWalkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"ftruck_move_%d.png", i]]];
        }
        FuelTruckWalkAnim = [CCAnimation animationWithFrames:FuelTruckWalkAnimFrames delay:FuelTruckTouchFrameDelay];
        walkFuelTruck = [CCRepeatForever actionWithAction:
                            [CCAnimate actionWithAnimation:FuelTruckWalkAnim restoreOriginalFrame:YES]];
        [selSprite runAction:walkFuelTruck]; 
    }
}

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {    

    else if(CGRectIntersectsRect(selSprite.boundingBox,BluePlaneFuelHatch.boundingBox))
    { 
        NSMutableArray *FuelTruckAnimFrames = [NSMutableArray array];
        for(int i = FuelTruckCollisionStartFrameIndex; i <= FuelTruckCollisionEndFrameIndex; ++i) 
        {
            [FuelTruckAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"ftruck_col_%d.png", i]]];
        }
        CCAnimation *FuelTruckAnim = [CCAnimation animationWithFrames:FuelTruckAnimFrames delay:FuelTruckCollisionFrameDelay];

        CCAction *FuelTruckCollisionBlue = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:FuelTruckAnim restoreOriginalFrame:NO]];

        [FuelTruck runAction:FuelTruckCollisionBlue];

        isCollided=YES;
    }
    else
    {

        if(isCollided==YES)
        { 
            isCollided=No;
            [FuelTruck stopAction:FuelTruckCollisionBlue];
        }
    }
}        

Но это не останавливает анимацию столкновения, когда столкновение закончено.Для завершения анимации требуется несколько миллисекунд, почему это так?

1 Ответ

1 голос
/ 05 октября 2011

Помимо того, что ваш код не будет компилироваться, похоже, это проблема области видимости.Посмотрите комментарии, которые я добавил к этой сокращенной версии вашего кода.

    if(CGRectIntersectsRect(selSprite.boundingBox,BluePlaneFuelHatch.boundingBox))
    { //<(1)>
        ...
        //THIS ANIMATION IS ONLY AVAILABLE WITHIN THE BRACES MARKED WITH (1)
        CCAnimation *FuelTruckAnim = [CCAnimation animationWithFrames:FuelTruckAnimFrames delay:FuelTruckCollisionFrameDelay];

        CCAction *FuelTruckCollisionBlue = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:FuelTruckAnim restoreOriginalFrame:NO]];
        ...
        isCollided=YES;
    }//<(1)>
    else
    {

        if(isCollided==YES)
        { 
            isCollided=No;
            //YOU ARE THEN TRYING TO USE THE VARIABLE HERE. IT DOESN'T EXIST IN THIS SCOPE.
            [FuelTruck stopAction:FuelTruckCollisionBlue];
        }
    }

Попробуйте вместо этого:

    //As a member variable
    CCAction *FuelTruckCollisionBlue;




    if(CGRectIntersectsRect(selSprite.boundingBox,BluePlaneFuelHatch.boundingBox))
    { //<(1)>
        ...
        //THIS ANIMATION IS ONLY AVAILABLE WITHIN THE BRACES MARKED WITH (1)
        CCAnimation *FuelTruckAnim = [CCAnimation animationWithFrames:FuelTruckAnimFrames delay:FuelTruckCollisionFrameDelay];

        FuelTruckCollisonBlue = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:FuelTruckAnim restoreOriginalFrame:NO]];
        ...
        isCollided=YES;
    }//<(1)>
    else
    {

        if(isCollided==YES)
        { 
            isCollided=No;
            //YOU ARE THEN TRYING TO USE THE VARIABLE HERE. IT DOESN'T EXIST IN THIS SCOPE.
            [FuelTruck stopAction:FuelTruckCollisionBlue];
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...