2016-02-10 31 views
0

我需要一些關於cocos2d DrawNodes混合的幫助。我有DrawNode與精靈上它:如何混合cocos2d中的兩個DrawNode

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

作爲此代碼的結果我看到完整的哈特精靈沒有多邊形。我也嘗試改變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