0

我正在尝试使用 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 调用时,我看到我所有的各种填充矩形动画(即一堆以粒子效果方式填充的正方形。但是,通过调用,我只看到第一个。我是否缺少明显的东西?

4

1 回答 1

0

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

因此,我在 while 循环中围绕我的代码插入了 save 和 restore 调用,如下所示:

    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);
于 2011-02-12T00:06:10.847 回答