cocos2d - 仅显示精灵的一部分 - 不规则形状

时间:2011-06-24 06:47:43

标签: cocos2d-iphone shape

我真的很想解决这个问题,所以任何帮助都会非常感激。我试图隐藏大部分精灵并逐渐显示它。如果我只使用矩形,这可以正常工作。例如,我发现某人的“ClippingNode”类的实现,它运作良好,即代码的这一部分:

-(void) visit
{
    glPushMatrix();
    glEnable(GL_SCISSOR_TEST);
    glScissor(clippingRegion.origin.x + positionInPixels_.x, clippingRegion.origin.y + positionInPixels_.y, clippingRegion.size.width, clippingRegion.size.height);

    [super visit];

    glDisable(GL_SCISSOR_TEST);
    glPopMatrix();
}

问题是我需要一个不规则的形状,而不仅仅是一个矩形。我希望我可以堆叠调用glScissor并创建一个带有许多小矩形的形状,但不幸的是glScissor只能工作一次(最后一次调用它)。

似乎cocos2d不支持OpenGLs模板缓冲区(是吗?),即使它确实如此,我发现OpenGL很难理解,我仍然需要有人向我解释。如果我可以在精灵上设置一个bezier路径作为掩码(我认为你可以在Quartz中做),那就太棒了,但它似乎不支持。

如果有人在这里有任何智慧,那就太棒了!

2 个答案:

答案 0 :(得分:1)

使用glScissor是不可能的,但您可以使用模板缓冲区轻松实现此效果。这是文档:

http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

还有一个关于模板缓冲区的NeHe教程,但它是用C ++编写的,而不是目标C(虽然它很容易转换成你需要的任何应用程序):

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26

编辑:这是基于你想要将它剪裁成任意形状的假设,例如星星,笑脸等等,而不仅仅是一个矩形。

答案 1 :(得分:1)

想出来。你可以多次调用glScissor,你也需要每次都画出那个剪裁的形状:

-(void) visit
{
    NSEnumerator *enumerator;
    NSValue *val;
    CGRect aRegion;

    glPushMatrix();
    glEnable(GL_SCISSOR_TEST);

    enumerator = [regions objectEnumerator];
    while ((val = (NSValue *)[enumerator nextObject])) {
        aRegion = [val CGRectValue];

        glScissor(aRegion.origin.x, aRegion.origin.y,
                  aRegion.size.width, aRegion.size.height);
        [super visit];
    }

    glDisable(GL_SCISSOR_TEST);
    glPopMatrix();    

}