通过图像掩蔽创建粒子

时间:2011-02-11 23:57:45

标签: ios image quartz-graphics masking particles

我正在尝试使用CGContextClipToMask()函数创建不同颜色的粒子。出于某种原因,我的第一个粒子似乎完全显示并通过其更新动画,但根本没有其他粒子显示。这是一段代码:

while(i < mNextParticleIndex)
    {
        Particle* p = &mParticles[i];

        CGRect drawRect = CGRectMake(
            p->mPos.x,
            p->mPos.y,
            p->mSize,
            p->mSize);

        // try image masking
        CGContextClipToMask(context, drawRect, [mImage CGImage]);
        CGContextSetBlendMode(context, kCGBlendModeNormal);
        CGContextSetFillColor(context, CGColorGetComponents([UIColor 
            colorWithRed:p->mColor.r green:p->mColor.g blue:p->mColor.b alpha:p->mColor.a].CGColor));
        CGContextFillRect(context, drawRect);

当我注释掉ClipToMask调用时,我看到我所有的各种填充动画都是动画的(即一堆正方形填充粒子效果方式。然而,通过调用,我只能看到第一个。有什么明显的东西我'我不见了?

1 个答案:

答案 0 :(得分:0)

根据Quartz文档: “剪切区域是图形状态的一部分。要将剪切区域恢复到先前的状态,您可以在剪辑之前保存图形状态,并在完成剪切绘图后恢复图形状态。”

所以,我在while循环中的代码周围插入了保存和恢复调用:

    CGContextSaveGState(context);
    CGContextClipToMask(context, drawRect, [mImage CGImage]);
    CGContextSetBlendMode(context, kCGBlendModeNormal);
    CGContextSetFillColor(context, CGColorGetComponents([UIColor 
        colorWithRed:p->mColor.r green:p->mColor.g blue:p->mColor.b alpha:p->mColor.a].CGColor));
    CGContextFillRect(context, drawRect);
    CGContextRestoreGState(context);