2016-02-10 6 views
0

Мне нужна помощь с cocos2d DrawNodes blending. У меня есть DrawNode со спрайтом на нем:Как смешать два DrawNodes в cocos2d

enter image description here И еще один DrawNode с нарисованным многоугольником (область полигона меньше, чем спрайт сердца). В результате смешивания мне нужно иметь только часть сердца спрайта внутри многоугольника, например: enter image description here Мой код: TextureNode.h

class CTextureNode : public cocos2d::DrawNode 
{ 
public: 
static CTextureNode * create(const std::string & fileName, const cocos2d::Rect & rect); 

CTextureNode(); 
virtual ~CTextureNode(); 

void setPolygonalMask(const cocos2d::Vec2 * verts, int count); 

private: 
bool initTexture(const std::string & fileName, const cocos2d::Rect & rect); 

private: 
cocos2d::DrawNode * m_pMask; 
cocos2d::Sprite * m_pSprite; 

float timeOutline; 
bool bShaderInc; 
}; 

TextureNode.cpp

CTextureNode * CTextureNode::create(const std::string & fileName, const cocos2d::Rect & rect) 
{ 
auto ret = new CTextureNode(); 
if (!ret || !ret->init() || !ret->initTexture(fileName, rect)) 
{ 
    CC_SAFE_DELETE(ret); 
} 

return ret; 
} 

CTextureNode::CTextureNode() 
: timeOutline(0.f) 
, bShaderInc(true) 
, m_pMask(nullptr) 
, m_pSprite(nullptr) 
{ 
} 

CTextureNode::~CTextureNode() 
{ 
} 

bool CTextureNode::initTexture(const std::string & fileName, const cocos2d::Rect & rect) 
{ 
m_pSprite = cocos2d::Sprite::create(fileName, rect); 
m_pSprite->setAnchorPoint(cocos2d::Point::ZERO); 
addChild(m_pSprite); 

m_pMask = cocos2d::DrawNode::create(); 
m_pMask->setPosition(cocos2d::Point::ZERO); 
m_pMask->setAnchorPoint(cocos2d::Point::ZERO); 
addChild(m_pMask); 

return true; 
} 

void CTextureNode::setPolygonalMask(const cocos2d::Vec2 * verts, int count) 
{ 
if (m_pMask) 
{ 
    m_pMask->drawPolygon(verts, count, cocos2d::Color4F::WHITE, 1, cocos2d::Color4F::WHITE); 

    cocos2d::BlendFunc maskBlendFunc = { GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA }; 
    m_pMask->setBlendFunc(maskBlendFunc); 

    auto size = m_pSprite->getContentSize(); 

    auto renderer = cocos2d::RenderTexture::create(size.width, size.height, cocos2d::Texture2D::PixelFormat::RGBA8888); 
    renderer->begin(); 

    m_pMask->visit(); 

    renderer->end(); 
} 
} 

Как результат этого кода. Я вижу полный спрайт hart без полигона. Я также пытаюсь изменить значения BlendFunc, но это не помогает. Пожалуйста, расскажите мне, что я делаю.)

P.S. Благодаря! P.S.P.S. Извините за мой английский)

+0

Я не понимаю, что вы хотите сделать. Вы хотите замаскировать спрайт полигоном? Опубликуйте предварительный просмотр, как он должен выглядеть. – Makalele

+0

@Makalele У меня есть узел со спрайтом (серое сердце) на нем и еще один узел с нарисованным многоугольником. Размер второго узла меньше первого. Мне нужно смешать эти узлы. Результат смешивания - многоугольник со второго узла со спрайтом от первого узла внутри него (на втором изображении это область внутри красного многоугольника). – otashlanov

ответ

0

Кажется, что вы хотите обрезать сердечный спрайт, используя многоугольник в качестве трафарета. В таком случае. Вам не нужно смешивать два DrawNode. Вместо этого, вы можете использовать ClippingNode как:

auto heartSprite = cocos2d::Sprite::create(fileName); 

auto stencil = DrawNode::create(); 
stencil->drawPolygon(verts, count, cocos2d::Color4F::WHITE, 1, cocos2d::Color4F::WHITE); 

auto clipper = ClippingNode::create(); 
clipper->setStencil(stencil); 
clipper->addChild(heartSprite) 

Для более ClippingNode примеров, вы можете обратиться к официальному коду образца: https://github.com/cocos2d/cocos2d-x/tree/v3/tests/cpp-tests/Classes/ClippingNodeTest

+0

Да, вы правы, но мне нужно сделать это, используя функции визуализации и смешивания – otashlanov