6

我正在尝试控制 CCSprites 一层层叠加的顺序。我会使用,但我正在为由 zOrder关节精灵组成的角色制作动画(一些精灵以addChild

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

环顾四周,听起来像使用 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 而不是父级,它们都会显示出来。但是设置了 vertexZs,任何子精灵都不会显示。

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

更新: 更多线索。我可以完全注释掉我对 [super draw] 的调用的 GL 函数,结果是一样的。此外,结果显示带有 vertexZ 的子精灵确实会显示,但无论它们与任何其他精灵重叠,它们都会变得不可见。紫色纸精灵是该生物左前臂精灵(在屏幕右侧)的子精灵,但应该在它上面。

无论紫色精灵在其他精灵的上方或下方,都会有咬痕。

对于上面的图片,我基本上是在我的 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 没有确定绘制顺序和/或混合错误。

zOrder -1 的效果。

4

4 回答 4

1

我在使用 Cocos2d 编写 RPG 时处理了这个问题。问题是阿尔法混合。如您所见,纸被左臂精灵遮住了,尽管它是透明的。由于某种原因,在使用 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 排序。这不是一个理想的解决方案,但是如果您使用“元”父节点,那么您仍然可以轻松地转换所有子节点。

于 2012-09-05T16:35:37.710 回答
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);
}
于 2013-06-05T15:32:30.360 回答
0

只添加你可以控制z-order?

[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];
于 2012-08-29T15:12:57.683 回答
-3

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

于 2012-08-30T06:44:23.093 回答