Cocos2D-x 3.0中的基元和精灵Z指数不一致?

时间:2014-03-09 21:10:41

标签: cocos2d-x cocos2d-x-3.0

我有两层。每个图层都有一个原始图形,其中包含OpenGL,如下所示:

void Layer1::drawPolygon()
{
    glLineWidth(1);
    DrawPrimitives::setDrawColor4B(255,255,255,255);
    DrawPrimitives::setPointSize(1);

    // Anti-Aliased
    glEnable(GL_LINE_SMOOTH);

    // filled poly
    glLineWidth(1);
    Point filledVertices[] = { Point(10,120), Point(50,120), Point(50,170), Point(25,200), Point(10,170) };
    DrawPrimitives::drawSolidPoly(filledVertices, 5, Color4F(0.5f, 0.5f, 1, 1 ) );
}

当我将这些图层添加到场景并设置Z阶1和2时,我看到我可以将一个基元置于另一个基础之上,反之亦然 - 当我交换Z顺序值时。当我将一个精灵添加到其中一个图层时,奇怪的事情开始了。如果我添加一个精灵,那么精灵就位于该层的基元之上,而不仅仅是该层。即使图层具有较小的Z索引,无论如何,它的精灵位于其他图层的图元之上,而其图元低于其他图元形状 - 正如预期的那样。这个可以吗?我该怎么理解这个?如果我想在所有精灵上绘制基元怎么办?

编辑:

我可以通过以下方式操纵他们的订单,但不能操纵订单:

CCDirector::getInstance()->setDepthTest(true);
myLayer->setVertexZ(-1);

但是我不明白为什么Z层次较小的图层中的精灵比Z层次较大的图层的图元要晚。换句话说,似乎所有图层中的所有图元都是按照它们的顺序绘制的,那么对于精灵来说也是如此。

2 个答案:

答案 0 :(得分:2)

由于cocos2d-x 3.0上的新多线程渲染器,使用基元绘制需要采用不同的方法。看看我在这个帖子的回复:

https://stackoverflow.com/a/22724319/1468700

答案 1 :(得分:1)

我相信cocos2d-x V3 beta 2中存在一个错误,它会使原始绘图始终显示在所有图层下方。 它在V3.0 RC中是固定的(我理解)

这是不正确的 - 没有错误(我被其他帖子误导了 - 道歉)。

请参阅下面的帖子,获取一个链接,说明在“正确”的z顺序中绘制基元需要采取的措施。

总结是所有绘图操作都被添加到游戏循环中的队列中,然后处理了队列 - 因此您需要将原始绘图添加到队列中而不是立即绘制。