Objective c 从sprite cocos2d中剪切自定义形状

Objective c 从sprite cocos2d中剪切自定义形状,objective-c,cocos2d-iphone,alpha,shape,ccsprite,Objective C,Cocos2d Iphone,Alpha,Shape,Ccsprite,我有一个形象和一个形状。我需要用我形状的alpha通道从图像中创建一个剪切,我的意思是: 我可以使用CCMask,但我对结果没有印象。 你能给我指一个替代方案吗? 非常感谢您的帮助 看看这些教程 CoCoS2D2.0: Cocos2d 1.0: -=(W)=- 我也有类似的问题。我阅读了教程并使用了CCMask。CCMask是一个很好的类,但有一个问题。当遮罩的大小大于纹理的大小时,我们可以看到遮罩的碎片,这是非常糟糕的。 用我的决定享受吧 -(CCSprite *)maskedSprite

我有一个形象和一个形状。我需要用我形状的alpha通道从图像中创建一个剪切,我的意思是:

我可以使用CCMask,但我对结果没有印象。 你能给我指一个替代方案吗?
非常感谢您的帮助

看看这些教程

CoCoS2D2.0:

Cocos2d 1.0: -=(W)=-

我也有类似的问题。我阅读了教程并使用了CCMask。CCMask是一个很好的类,但有一个问题。当遮罩的大小大于纹理的大小时,我们可以看到遮罩的碎片,这是非常糟糕的。 用我的决定享受吧

-(CCSprite *)maskedSpriteWithSprite:(CCSprite *)textureSprite maskSprite:(CCSprite *)maskSprite
{
    CCSprite *maskSprite_ = [CCSprite spriteWithTexture:[maskSprite texture]];
    CCSprite *textureSprite_ = [CCSprite spriteWithTexture:[textureSprite texture]];

    maskSprite_.position = maskSprite.position;
    maskSprite_.rotation = maskSprite.rotation;
    maskSprite_.opacity = maskSprite.opacity;
    maskSprite_.scale = maskSprite.scale;
    maskSprite_.zOrder = maskSprite.zOrder;

    textureSprite_.position = textureSprite.position;
    textureSprite_.rotation = textureSprite.rotation;
    textureSprite_.opacity = textureSprite.opacity;
    textureSprite_.scale = textureSprite.scale;
    textureSprite_.zOrder = textureSprite.zOrder;

    [maskSprite_ setColor:ccc3(0.0, 0.0, 0.0)];

    //Start cutting sprite

    CCRenderTexture *rt;
    float dx;
    float dy;

    //Correct mask

    rt = [CCRenderTexture renderTextureWithWidth:maskSprite_.contentSize.width*maskSprite_.scale height:maskSprite_.contentSize.height*maskSprite_.scale];

    dx = textureSprite_.position.x - maskSprite_.position.x;
    dy = textureSprite_.position.y - maskSprite_.position.y;

    maskSprite_.position = ccp(maskSprite_.contentSize.width/2*maskSprite_.scale, maskSprite_.contentSize.height/2*maskSprite_.scale);
    textureSprite_.position = ccp(maskSprite_.position.x+dx, maskSprite_.position.y+dy);

    [textureSprite_ setBlendFunc:(ccBlendFunc){GL_ONE, GL_ZERO}];
    [maskSprite_ setBlendFunc:(ccBlendFunc){GL_DST_ALPHA, GL_ZERO}];

    [rt begin];
    [textureSprite_ visit];
    [maskSprite_ visit];
    [rt end];

    CCSprite *correctMaskSprite_ = [CCSprite spriteWithTexture:rt.sprite.texture];
    correctMaskSprite_.flipY = YES;

    correctMaskSprite_.position = maskSprite.position;
    correctMaskSprite_.rotation = maskSprite.rotation;
    correctMaskSprite_.opacity = maskSprite.opacity;
    correctMaskSprite_.scale = maskSprite.scale;
    correctMaskSprite_.zOrder = maskSprite.zOrder;

    //New sprite with correct mask

    [correctMaskSprite_ setBlendFunc:(ccBlendFunc){GL_ONE, GL_ZERO}];
    [textureSprite_ setBlendFunc:(ccBlendFunc){GL_DST_ALPHA, GL_ZERO}];

    [rt begin];
    [correctMaskSprite_ visit];
    [textureSprite_ visit];
    [rt end];

    CCSprite *retval = [CCSprite spriteWithTexture:rt.sprite.texture];
    retval.flipY = YES;

    return retval;
}