如何让孩子CCSprite在其父级之上绘制?

时间:2012-08-28 18:42:41

标签: cocos2d-iphone drawing ccsprite

我正在尝试控制CCSprites在另一个上面分层的顺序。我使用zOrder,但我正在制作由明确的精灵组成的角色(一些精灵用addChild作为其他精灵,而zOrder只在兄弟精灵中受到尊重。

基本上,我想让我的精灵成为父母,以便他们可以继承彼此的变换,但我想确定绘制顺序。

Looking around,听起来好像使用CCSprite的vertexZ属性是可行的。我试过了。我设置了自定义CCSprite的draw方法,如下所示:

- (void)draw
{
    glEnable(GL_BLEND);
    CHECK_GL_ERROR_DEBUG();
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
    CHECK_GL_ERROR_DEBUG();
    [super draw];
    glDisable(GL_BLEND);
}

我的每个精灵现在都有一个0的zOrder和一个独特的vertexZ来按照我的意愿对它们进行分层,但它不起作用:任何有父级的精灵都不会显示!

尝试一些事情,我发现如果我没有设置vertexZ,则会显示所有精灵。如果我保留顶点并且不是父节点,它们都会显示出来。但是设置了vertexZs后,任何子精灵都不会显示。

这里发生了什么,我怎样才能让它发挥作用?

更新:更多线索。我可以完全围绕我对[super draw]的调用来评论GL函数,结果是一样的。此外,它显示了具有vertexZ do显示的子精灵,但是只要它们与任何其他精灵重叠,它们就会变得不可见。紫色纸精灵是该生物的左前臂精灵(在屏幕右侧)的孩子,但应该在它上面。

There are bites taken out of the purple sprite wherever it's over or under other sprites.

对于上图,我基本上是在我的CCLayer中这样做的。我想养育孩子,但我希望手和纸都在上面。

[self addChild:lUpperarm];
[self addChild:lForearm];
[self addChild:face];
[self addChild:rUpperarm];
[self addChild:rForearm];
[lForearm addChild:handAndPaper];

lUpperarm.vertexZ = -100;
lForearm.vertexZ = -99;
face.vertexZ = -98;
rUpperarm.vertexZ = -97;
rForearm.vertexZ = -96;
handAndPaper.vertexZ = -95;

这就是我想要的样子。 (我将最后一行更改为[self addChild:handAndPaper],这会失去lForearm的转换,而不是我想要的。)

The purple paper covering the other sprites.

更新2:有人建议我将zOrder设置为-1的所有子项添加:例如[lForearm addChild:handAndPaper z:-1]。这改变了一点,但仍然没有解决它,唉。似乎vertexZ不确定绘制顺序和/或混合是错误的。

The effects of zOrder -1.

4 个答案:

答案 0 :(得分:1)

在使用Cocos2d编写RPG时,我dealt with this issue。问题是alpha混合。正如你所看到的那样,即使它是透明的,左臂精灵也会覆盖纸张。出于某种原因,当使用Cocos2d的vertexZ技术时,有时会出现这个问题。要解决此问题,您可以尝试更改Alpha混合级别。尝试0.0,0.5和1.0:

-(void) draw
{
    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0.0f);
    [super draw];
    glDisable(GL_ALPHA_TEST);
}

如果这不起作用,那么我建议使用完整的解决方法。将所有精灵保留为同一父节点的一部分,并使用常规z排序。它不是一个理想的解决方案,但如果您使用“元”父节点,那么您仍然可以轻松地转换所有孩子。

答案 1 :(得分:0)

虽然只添加你可以控制z顺序吗?

[self addChild:lUpperarm z:1];
[self addChild:lForearm z:2];
[self addChild:face z:3];
[self addChild:rUpperarm z:4];
[self addChild:rForearm z:5];
[lForearm addChild:handAndPaper z:6];

答案 2 :(得分:0)

我无法确定这是你的问题,但我在使用draw()时遇到过问题,结果发现我在调用结束时没有重置blendfunc。

这是我使用的绘图功能,它使用一些透明度进行基本绘图。再一次,没有保证。

- (void) draw {
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    ccDrawSolidPoly(vertices, 4, fillColor);

    // This is the important bit.  Must do this last.
    //
    glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);
}

答案 3 :(得分:-3)

设置更高的z值以将对象设置在顶部。并在后面设置较低的z值..