1

CCLayer上から下に「マスクを解除」する必要がある、があります。

GLScissorレイヤーの境界外にあるものをカットするために、事前訪問と事後訪問を実装しました。

#pragma mark Clipping
-(void)visit {
    [self preVisit];
    [super visit];
    [self postVisit];
}
-(void)preVisit {
    if (!self.visible)
        return;

    glEnable(GL_SCISSOR_TEST);
    CGRect clipRect = [self boundingBox];
    CGPoint origin = [self convertToWorldSpaceAR:clipRect.origin];
    CGRect scissorRect = CGRectMake(origin.x - self.anchorPoint.x * clipRect.size.width, 768 - origin.y - self.anchorPoint.y * clipRect.size.height, clipRect.size.width, clipRect.size.height);

    scissorRect = CC_RECT_POINTS_TO_PIXELS(scissorRect);

    glScissor((GLint) scissorRect.origin.x, (GLint) scissorRect.origin.y,
          (GLint) scissorRect.size.width, (GLint) scissorRect.size.height);
}
-(void)postVisit {
    glDisable(GL_SCISSOR_TEST);
}

そして、私CCLayerは1024x0のcontentSizeを設定し、スケジュールされた呼び出しを使用して成長させます。

-(void) grow {
    float height = [self contentSize].height + 2;
    if (height >= 768){
        [self unschedule:@selector(grow)];
        height = 768;
    }
    [self setContentSize:CGSizeMake(1024, height)];
}

これは魅力のように機能します。CCLayer高さは着実に成長し、完全にマスクされていません。ただし、アクションを使用していないため、イージング機能を使用できません。

イージング関数を使用できるようにする(スケーリングではなく)サイズを変更するアクションはありますか、CCLayerまたはこれを行う他の(より良い)方法はありますか?

4

1 に答える 1

2

最適な候補は、CCActionTween(以前の:CCPropertyAction)を使用し、それをイーズアクションでラップすることです。

id tween = [CCActionTween actionWithDuration:5 key:"sizeHeight" from:1024 to:0];
id ease = [CCEaseInOut actionWithAction:tween];
[layer runAction:ease];

sizeHeightこれにより、レイヤーの名前が付けられたプロパティが変更されます。CGSizeやCGPointなどのC構造体プロパティを直接トゥイーンすることはできないため、これを使用してcontentSizeを調整できます。

-(void) setSizeHeight:(float)height
{
    self.contentSize = CGSizeMake(self.contentSize.width, height);
}
于 2012-09-20T15:02:42.657 に答える