cocos2d-iphone - 我怎样才能让一个 child CCSprite在其父对象上绘制?

标签 cocos2d-iphone drawing ccsprite

我试图控制CCSprites一层一层堆叠的顺序。我将使用zOrder,但我要对由关节 Sprite (某些 Sprite 以addChild代入其他 Sprite )组成的角色进行动画处理,并且zOrder仅在同级 Sprite 中受人尊敬。

基本上,我想让我的子画面成为父级,以便它们可以继承彼此的变换,但是我想确定绘制顺序。

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);
}

现在,我的每个子画面的zOrder都为0,并且有一个唯一的vertexZ可以按照我的意愿对其进行分层,但是它不起作用:任何具有父项的子画面都不会显示!

尝试一些事情,我发现如果不设置vertexZ,则会显示所有 Sprite 。而且,如果我保留vertexZ并且不作 parent ,那么它们都将显示出来。但是设置了vertexZs后,将不会显示任何子 Sprite 。

这是怎么回事,如何使它正常工作?

更新:更多线索。我可以在调用[super draw]时完全注释掉GL函数,结果是相同的。同样,它可以显示具有vertexZ的子子画面,但是无论它们与其他任何子画面重叠的位置如何,它们都将变得不可见。紫色纸 Sprite 是该生物的左前臂 Sprite 的子代(在屏幕右侧),但应该位于其上方。

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

最佳答案

用Cocos2d编写RPG时,我dealt with this issue。问题是Alpha混合。如您所见,即使透明,纸张仍被左手 Sprite 覆盖。由于某些原因,当使用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顺序。这不是理想的解决方案,但是如果您使用“元”父节点,那么仍然可以轻松转换所有子节点。

关于cocos2d-iphone - 我怎样才能让一个 child CCSprite在其父对象上绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165481/

相关文章:

javascript - HTML5 Canvas 问题 |点击跟踪

c++ - 绘制并填充圆

iphone - 如何获取由子 Sprite 组成的CCSprite的高度和宽度(Cocos2D)

ios - ""CCSprite 没有使用相同的纹理 ID ""解决方法?

iphone - 声纳效应的方向?

iPhone Cocos2D - Sprite 可用的混合模式列表以及如何设置它们

c# - 使用不同的 Thread.sleep() 持续时间来控制播放器速度?

ios - b2Body 未正确定位在 CCSprite 上?

rotation - Cocos2dx继承的CCNode类不围绕其中心旋转?

ios - CCNode.children 的功能 - 这是冗余代码吗?