Cocos2d iphone 如何让子CCSprite在其父级上绘制?

Cocos2d iphone 如何让子CCSprite在其父级上绘制?,cocos2d-iphone,drawing,ccsprite,Cocos2d Iphone,Drawing,Ccsprite,我试图控制ccsprite的分层顺序。我会使用zOrder,但我正在制作由铰接精灵组成的角色的动画(一些精灵以addChild为其他精灵的父母),而zOrder只在兄弟姐妹精灵中受到尊敬 基本上,我想为我的精灵设置父对象,以便它们可以继承彼此的变换,但我想确定绘制顺序 ,听起来像是使用CCSprite的vertexZ属性才是最好的选择。我试过了。我将自定义CCSprite的绘制方法设置为: - (void)draw { glEnable(GL_BLEND); CHECK_GL_E

我试图控制ccsprite的分层顺序。我会使用
zOrder
,但我正在制作由铰接精灵组成的角色的动画(一些精灵以
addChild
为其他精灵的父母),而zOrder只在兄弟姐妹精灵中受到尊敬

基本上,我想为我的精灵设置父对象,以便它们可以继承彼此的变换,但我想确定绘制顺序

,听起来像是使用CCSprite的
vertexZ
属性才是最好的选择。我试过了。我将自定义CCSprite的绘制方法设置为:

- (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函数,结果是一样的。此外,它还显示了带有顶点Z的子精灵,但无论它们与任何其他精灵重叠在哪里,它们都不可见。紫色纸精灵是该生物左前臂精灵的后代(屏幕右侧),但应该位于其上方

对于上面的图片,我基本上是在我的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的转换,而不是我想要的。)

更新2:一些人建议我添加zOrder设置为-1的所有子项:例如
[lForearm addChild:handAndPaper z:-1]
。这改变了一些事情,但仍然没有解决它,唉。看起来要么vertexZ没有决定绘图顺序,要么混合错误


当只添加u时,是否可以控制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];

设置更高的z值以将对象设置在顶部。当使用Cocos2d编写RPG时,降低z值以设置在后面。

I。问题在于阿尔法混合。正如您所看到的,纸张被左臂精灵覆盖,即使它是透明的。出于某种原因,当使用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排序。这不是一个理想的解决方案,但是如果您使用“元”父节点,那么您仍然可以轻松地转换所有子节点。

我不能确定这是否是您的问题,但我过去在使用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);
}

我试过了,只是又试了一次,z顺序没有效果。我甚至读过,最好给他们所有相同的
zOrder
,让
vertexZ
解决排序问题。我敢打赌,问题就出在这幅画上。这在兄弟姐妹之间效果很好,因为他们有着相同的父母。但这不是我要问的。我希望在继承父级的变换时,使子级(可能还有它的一些子级)位于其自己的父级之上。