我正在尝试控制 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 没有确定绘制顺序和/或混合错误。