我正在使用cocos2d-xv3.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所提到的,由于cocos2d-X3.0,您不能再重写draw()了。您必须使用draw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated)代替。
发布于 2014-03-22 15:04:33
将来,cocos2d-x3.x呈现程序将使用命令池进行多线程处理。
draw方法由visit方法调用,以创建新命令。当命令由命令池执行时,将调用onDraw。此时,命令在单个线程中执行,但在重载的onDraw方法中,您应该假设它将在另一个线程中调用,以简化将来的迁移。
发布于 2014-03-28 22:34:32
cocos2d-x RC0包上有示例,展示了如何在其他层之上使用DrawPrimitives。
在您的层中,.h添加以下内容:
private:
void onDrawPrimitives(const kmMat4 &transform, bool transformUpdated);
CustomCommand _customCommand;现在,在该层的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);
}发布于 2014-09-24 07:21:38
我对debugDraw使用了这样的绘图方法,这可能会有帮助
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);
}https://stackoverflow.com/questions/22549233
复制相似问题