我正在尝试控制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显示的子精灵,但是只要它们与任何其他精灵重叠,它们就会变得不可见。紫色纸精灵是该生物的左前臂精灵(在屏幕右侧)的孩子,但应该在它上面。
对于上图,我基本上是在我的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不确定绘制顺序和/或混合是错误的。
答案 0 :(得分:1)
-(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值..