我正在尝试使用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调用时,我看到我所有的各种填充动画都是动画的(即一堆正方形填充粒子效果方式。然而,通过调用,我只能看到第一个。有什么明显的东西我'我不见了?
答案 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);