cocos2d-x-3.0 draw vs onDraw
Solution 1
In future, cocos2d-x 3.x renderer will be multithreaded with command pool.
draw
method called by visit
method, to create new command. When command is performed by command pool, onDraw
is called. At this moment, commands are performed in single thread, but in overloaded onDraw
method you should assume, that it will be called in another thread to simplify future migration.
Solution 2
There is sample on cocos2d-x RC0 package that shows how to use the DrawPrimitives on top of other layers.
On your Layer .h add the following:
private:
void onDrawPrimitives(const kmMat4 &transform, bool transformUpdated);
CustomCommand _customCommand;
Now in the cpp of the Layer, override the layer draw method and include the onDrawPrimitives method:
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);
}
Comments
-
jere almost 2 years
I'm using cocos2d-x v3.0 and in some test project I'm doing some custom drawing by overriding
Node
'sdraw
method, but in the DrawPrimitives example provided they do something like this: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? }
From reading the header and source files it seems like this may be some way of sending render commands straight to the renderer, is that correct?
Should I be using this method to do custom drawing? What's the difference between
draw
anonDraw
?EDIT:
As @Pedro Soares mentioned, since Cocos2D-X 3.0 you can't override
draw()
anymore. you have to usedraw(Renderer *renderer, const kmMat4 &transform, bool transformUpdated)
instead. -
Narek about 10 yearsNice, but please change
MyLayer::onDraw
toMyLayer::onDrawPrimitives
. -
John almost 10 yearsIs this the only benefit of overriding
onDrawPrimitives
. Blitting and stuff without getting bogged down in invalidation rectangles and cascading internalonDraw
calls is one of the attractions of game development with cocos2d-x.