我正在使用cocos2d-x v3.0,在某些测试项目中,我通过覆盖Node
draw
方法进行自定义绘制,但是DrawPrimitives示例提供了类似这样的内容:
void DrawPrimitivesTest::draw()
{
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(DrawPrimitivesTest::onDraw, this);
Director::getInstance()->getRenderer()->addCommand(&_customCommand);
}
void DrawPrimitivesTest::onDraw()
{
// drawing code here, why?
}
从阅读标题和源文件看起来这可能是将渲染命令直接发送到渲染器的某种方式,这是正确的吗?
我应该使用此方法进行自定义绘图吗? draw
和onDraw
之间的区别是什么?
修改
正如@Pedro Soares所提到的,自Cocos2D-X 3.0以来,你不能再覆盖draw()
了。你必须改用draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
。
答案 0 :(得分:10)
cocos2d-x RC0包中有一个示例,展示了如何在其他图层之上使用DrawPrimitive。
在你的图层.h上添加以下内容:
private:
void onDrawPrimitives(const kmMat4 &transform, bool transformUpdated);
CustomCommand _customCommand;
现在在Layer的cpp中,覆盖图层绘制方法并包含onDrawPrimitives方法:
void MyLayer::onDrawPrimitives(const kmMat4 &transform, bool transformUpdated)
{
kmGLPushMatrix();
kmGLLoadMatrix(&transform);
//add your primitive drawing code here
DrawPrimitives::drawLine(ccp(0,0), ccp(100, 100));
}
void MyLayer::draw(Renderer *renderer, const kmMat4& transform, bool transformUpdated)
{
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(MyLayer::onDrawPrimitives, this, transform, transformUpdated);
renderer->addCommand(&_customCommand);
}
答案 1 :(得分:7)
将来,cocos2d-x 3.x渲染器将使用命令池进行多线程处理。
draw
方法调用的 visit
方法,用于创建新命令。当命令池执行命令时,将调用onDraw
。此时,命令在单线程中执行,但在重载onDraw
方法中,您应该假设它将在另一个线程中调用以简化将来的迁移。
答案 2 :(得分:0)
我使用drawDraw的draw方法像这样可能会有所帮助
void HelloWorld::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
{
Layer::draw(renderer, transform, flags);
Director* director = Director::getInstance();
GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION );
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
world->DrawDebugData();
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
答案 3 :(得分:0)
draw()表达式应该与基类函数相同。 Node for cocos 3.3rc的draw方法是: 虚拟空白绘制(Renderer *渲染器,const Mat4& transform,uint32_t标志);