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 ループ内のコードの周りに保存呼び出しと復元呼び出しを挿入しました。

    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 に答える