我怎样才能在精灵上而不是在精灵后面画东西
How can I draw something on the sprite not behind sprite
我使用 cocos2dx v3.8,并使用覆盖绘制成功绘制了一些东西:
void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION );
Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
box2dWorld->DrawDebugData();
Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
// super::draw(renderer, transform, flags);
}
但它总是在精灵后面。 z-order修改后不能改变
已解决
现在我可以修复 cocos2d v3.x box2d DrawDebugData 问题。
我粘贴所有 cocos2dx 解决代码。
v2:(简单,因为v2引擎opengl draw是每个单独的任务)
void Box2dManager::draw(){
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
kmGLPushMatrix();
box2dWorld->DrawDebugData();
kmGLPopMatrix();
}
v3:(v3 引擎使用 quence 将绘图公共项推送到核心,因此您需要创建一个回调)
void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
super::draw(renderer, transform, _transformUpdated);
GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_modelViewMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(Box2dManager::onDraw, this);
renderer->addCommand(&_customCommand);
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
void Box2dManager::onDraw() {
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
Mat4 oldMV;
oldMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewMV);
box2dWorld->DrawDebugData();
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, oldMV);
}
参考:
http://discuss.cocos2d-x.org/t/box2d-debug-drawing-for-cocos2d-x-3-0/11912/2
http://blog.csdn.net/zszeng/article/details/50000757
如何使用 DrawNode
并将其添加为子项?如果您要使用您在绘图树上管理的节点,那么维护起来会更容易。
auto myDrawing = DrawNode::create();
myDrawing::drawRect(p1, p2, p3, Color4F(255, 255, 0, 255));
myDrawing::setLineWidth(2)
this->addChild(myDrawing);
现在我可以修复 cocos2d v3.x box2d DrawDebugData 问题。
然后我粘贴所有 cocos2dx 解决代码。
v2:(简单,因为v2引擎opengl draw是每个单独的任务)
void Box2dManager::draw(){
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
kmGLPushMatrix();
box2dWorld->DrawDebugData();
kmGLPopMatrix();
}
v3:(v3 引擎使用 quence 将绘图公共项推送到核心,因此您需要创建一个回调)
void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
super::draw(renderer, transform, _transformUpdated);
GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_modelViewMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(Box2dManager::onDraw, this);
renderer->addCommand(&_customCommand);
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
void Box2dManager::onDraw() {
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
Mat4 oldMV;
oldMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewMV);
box2dWorld->DrawDebugData();
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, oldMV);
}
参考:
http://discuss.cocos2d-x.org/t/box2d-debug-drawing-for-cocos2d-x-3-0/11912/2
http://blog.csdn.net/zszeng/article/details/50000757
virtual void draw (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform,uint32_t flags) override;
cocos2d::CustomCommand _customCmd;
void onDraw(const cocos2d::Mat4 &transform, uint32_t flags);
void linedraw:: draw(cocos2d::Renderer* renderer, const cocos2d::Mat4 &transform, uint32_t flags){
//cocos2d::Layer::draw(renderer, transform, flags);
_customCmd.init(1);
_customCmd.func = CC_CALLBACK_0(linedraw::onDraw, this, transform, flags);
renderer->addCommand(&_customCmd);
}
void linedraw:: onDraw(const cocos2d::Mat4 &transform, uint32_t flags)
{
}
我使用 cocos2dx v3.8,并使用覆盖绘制成功绘制了一些东西:
void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
GL::enableVertexAttribs( GL::VERTEX_ATTRIB_FLAG_POSITION );
Director::getInstance()->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
box2dWorld->DrawDebugData();
Director::getInstance()->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
// super::draw(renderer, transform, flags);
}
但它总是在精灵后面。 z-order修改后不能改变
已解决
现在我可以修复 cocos2d v3.x box2d DrawDebugData 问题。 我粘贴所有 cocos2dx 解决代码。 v2:(简单,因为v2引擎opengl draw是每个单独的任务)
void Box2dManager::draw(){
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
kmGLPushMatrix();
box2dWorld->DrawDebugData();
kmGLPopMatrix();
}
v3:(v3 引擎使用 quence 将绘图公共项推送到核心,因此您需要创建一个回调)
void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
super::draw(renderer, transform, _transformUpdated);
GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_modelViewMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(Box2dManager::onDraw, this);
renderer->addCommand(&_customCommand);
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
void Box2dManager::onDraw() {
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
Mat4 oldMV;
oldMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewMV);
box2dWorld->DrawDebugData();
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, oldMV);
}
参考: http://discuss.cocos2d-x.org/t/box2d-debug-drawing-for-cocos2d-x-3-0/11912/2 http://blog.csdn.net/zszeng/article/details/50000757
如何使用 DrawNode
并将其添加为子项?如果您要使用您在绘图树上管理的节点,那么维护起来会更容易。
auto myDrawing = DrawNode::create();
myDrawing::drawRect(p1, p2, p3, Color4F(255, 255, 0, 255));
myDrawing::setLineWidth(2)
this->addChild(myDrawing);
现在我可以修复 cocos2d v3.x box2d DrawDebugData 问题。 然后我粘贴所有 cocos2dx 解决代码。 v2:(简单,因为v2引擎opengl draw是每个单独的任务)
void Box2dManager::draw(){
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
kmGLPushMatrix();
box2dWorld->DrawDebugData();
kmGLPopMatrix();
}
v3:(v3 引擎使用 quence 将绘图公共项推送到核心,因此您需要创建一个回调)
void Box2dManager::draw(Renderer *renderer, const Mat4& transform, uint32_t flags){
super::draw(renderer, transform, _transformUpdated);
GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_modelViewMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(Box2dManager::onDraw, this);
renderer->addCommand(&_customCommand);
director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
}
void Box2dManager::onDraw() {
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
Mat4 oldMV;
oldMV = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, _modelViewMV);
box2dWorld->DrawDebugData();
director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, oldMV);
}
参考: http://discuss.cocos2d-x.org/t/box2d-debug-drawing-for-cocos2d-x-3-0/11912/2 http://blog.csdn.net/zszeng/article/details/50000757
virtual void draw (cocos2d::Renderer* renderer, const cocos2d::Mat4& transform,uint32_t flags) override;
cocos2d::CustomCommand _customCmd;
void onDraw(const cocos2d::Mat4 &transform, uint32_t flags);
void linedraw:: draw(cocos2d::Renderer* renderer, const cocos2d::Mat4 &transform, uint32_t flags){
//cocos2d::Layer::draw(renderer, transform, flags);
_customCmd.init(1);
_customCmd.func = CC_CALLBACK_0(linedraw::onDraw, this, transform, flags);
renderer->addCommand(&_customCmd);
}
void linedraw:: onDraw(const cocos2d::Mat4 &transform, uint32_t flags)
{
}