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

64
5

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

Я использую этот код в методе draw draw:

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);

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

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

спросил(а) 2021-01-19T19:45:55+03:00 8 месяцев назад
1
Решение
64

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

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);

ответил(а) 2021-01-19T19:45:55+03:00 8 месяцев назад
46

Начиная с 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 от Cocoa.

ответил(а) 2021-01-19T19:45:55+03:00 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема