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

3

我正在疯狂地尝试解决这个问题,所以非常感谢您的帮助。我想要隐藏大部分精灵并逐渐显示它。如果只使用矩形,这个方法可以很好地实现。例如,我找到了某人实现的“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不支持OpenGL的模板缓冲区(是吗?),即使它支持,我发现OpenGL很难理解,我仍然需要有人向我解释。如果我可以将贝塞尔路径设置为精灵的蒙版(我认为您可以在Quartz中这样做),那就太好了,但似乎不支持这样做。如果有任何智慧之言,请告诉我!

实际上,我会换一种方式问:是否有人可以更改对CCNode的“visit”实现,以将节点内容剪切为半径为40、以clippingRegion.origin为中心的圆形? - johnnysports
你成功地将它优雅地裁剪成圆形了吗? - jin
2个回答

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();    

}

1

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

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

还有一份关于模板缓冲的NeHe教程,但它是用C++编写的,而不是Objective C(尽管将其翻译成您需要的任何应用程序应该很容易):

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

编辑:这是基于您想要将其剪切成某个任意形状(例如星形、笑脸等)而不仅仅是矩形的假设。


那个第一个链接已经失效了。 - Grumdrig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接