Как нарисовать ограничивающую рамку вокруг Sprite в бета-версии cocos2d-x 3?

я пытаюсь нарисовать ограничивающий прямоугольник вокруг спрайта, который я добавил в слой, и расположить его где-нибудь
флаг CC_SPRITE_DEBUG_DRAW не работает в версии 3
но я взял код от CCSprite

я использую этот код в духе метода рисования:

Point vertices1[4] = {
Point( _quad.bl.vertices.x, _quad.bl.vertices.y ),
Point( _quad.br.vertices.x, _quad.br.vertices.y ),
Point( _quad.tr.vertices.x, _quad.tr.vertices.y ),
Point( _quad.tl.vertices.x, _quad.tl.vertices.y ),
};

DrawPrimitives::setDrawColor4B(255, 255, 0, 255);
glLineWidth(2);
Point(50,100) };
DrawPrimitives::drawPoly( vertices, 4, true);

но это дает мне мировую космическую позицию, которая рисует Спрайта в левом нижнем углу главного окна, а не духовную позицию.
Как я могу это исправить ?

п.с.
я видел что-то здесь, но я не знаю, как перевести это на cocos2d-x 3
http://www.naveoss.com/site/450/tutorials/opengl-drawing-boxes-around-ccsprite-subclasses

0

Решение

Пожалуйста, попробуйте следующий фрагмент (это еще cocos2dx v2, но вы можете легко обновить его до v3).

void YourSprite::draw()  {
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position);
kmGLPushMatrix();
CCRect bb = boundingBox();
CCPoint vertices[4] = {
CCPoint( bb.origin.x, bb.origin.y ),
CCPoint( bb.origin.x, bb.origin.y + bb.size.height ),
CCPoint( bb.origin.x + bb.size.width, bb.origin.y + bb.size.height ),
CCPoint( bb.origin.x + bb.size.width, bb.origin.y)
};
ccDrawColor4B(255, 255, 0, 255);
glLineWidth(2);

ccDrawPoly(vertices, 4, true);
kmGLPopMatrix(); }

Также проверьте CCDrawNode и drawPolygon, который имеет лучшую производительность, чем DrawPrimitive.

PS: обратите внимание, что вы должны сбросить ширину линии до ее предыдущего состояния.

    float oldWidth = .0f;
glGetFloatv(GL_LINE_WIDTH, &oldWidth);
/// Set new line width
glLineWidth(mLineWidth);
....
/// Reset previous line width
glLineWidth(oldWidth);
1

Другие решения

Начиная с Cocos2d-x 3.3 вы можете использовать DrawNode класс для рисования фигур. Наследуется от Node так что вы можете добавить его в качестве ребенка или использовать его в качестве родителя.

auto box = DrawNode::create();
box::drawRect(p1, p2, p3, Color4F(255, 255, 0, 255));
box::setLineWidth(2)
this->addChild(box); // this being a node or scene

Существует также

void drawPoint(const Vec2& point, const float pointSize, const Color4F &color);
void drawLine(const Vec2 &origin, const Vec2 &destination, const Color4F  &color);`

и другие интересные вещи, которые напоминают вам о UIBezierPath из какао.

0