cocos2d

用两个图片初始化两个CCSprite,一样的大小,重叠在一起,分别叫做 foregroundNode 和 backgroundNode 。

- (void)flipover
{
    if (isFliping) {
        return;
    }
    [self chooseCard];
}

-(void) chooseCard
{
    isFliping = YES;
    CCSprite *fore = nil;
    CCSprite *back = nil;
    if (flipovered) {
        fore = self.foregroundNode;
        back = self.backgroundNode;
    }else{
        fore = self.backgroundNode;
        back = self.foregroundNode;
    }

    //始终保证前面的图像是未横向翻转过的,后面的图像是翻转过的
    if ([back flipX] == NO) {
        [back setFlipX:YES];
    }
    if ([fore flipX] == YES) {
        [fore setFlipX:NO];
    }
    
    //执行动画的时间
    float orbitTime = 0.3;
    
    //前景图像转动90度不可见
    [fore runAction:[CCSequence actions:[CCOrbitCamera actionWithDuration:orbitTime radius: 1 deltaRadius:0 angleZ:0 deltaAngleZ:90 angleX:0 deltaAngleX:0],[CCCallFunc actionWithTarget:self selector:@selector(showCard:)], nil]];
    
    //背景图像同步旋转,当前景图像停止动画时,背景图像继续旋转90度,此时图像左右是翻转的,为了保证看着的图像是正常的,所以在执行动画前要翻转一次
    [back runAction:[CCSequence actions:[CCOrbitCamera actionWithDuration:orbitTime*2 radius:1 deltaRadius:0 angleZ:0 deltaAngleZ:180 angleX:0 deltaAngleX:0], [CCCallFunc actionWithTarget:self selector:@selector(flipFinished)], nil]];
}

// 翻转后,调整前后景图像的层次
-(void)showCard:(id)sender
{
    if (flipovered) {
        [self.foregroundNode setZOrder:0];
        [self.backgroundNode setZOrder:1];
    }else{
        [self.foregroundNode setZOrder:1];
        [self.backgroundNode setZOrder:0];
    }
    flipovered = !flipovered;
}

- (void)flipFinished
{
    isFliping = NO;
}
原文地址:https://www.cnblogs.com/ihojin/p/cocos2d-flip-sprite.html