2011-02-11 59 views
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电话,我看到我的各种填充rects动画(即一束正方形的粒子效果的方式填充在呼叫,但是,我只。看到第一个。是否有什么明显的我失踪?

回答

0

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

S o,我在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);