【问题标题】:How to blend two DrawNodes in cocos2d如何在 cocos2d 中混合两个 DrawNode
【发布时间】:2016-02-10 18:08:58
【问题描述】:

我需要一些关于 cocos2d DrawNodes 混合的帮助。我有带有精灵的 DrawNode:

另一个绘制多边形的 DrawNode(多边形面积小于心形精灵)。作为混合的结果,我只需要在多边形内有一部分心形精灵,如下所示: 我的代码: 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;
};

纹理节点.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.对不起我的英语)

【问题讨论】:

  • 我不明白你想做什么。你想用多边形掩盖一个精灵吗?发布一些预览应该是什么样子。
  • @Makalele 我有一个带有精灵(灰色心脏)的节点和另一个带有绘制多边形的节点。第二个节点的大小小于第一个。我需要混合这个节点。混合的结果 - 来自第二个节点的多边形与其中的第一个节点的精灵(在第二张图片上它是红色多边形内的区域)。

标签: c++ c++11 cocos2d-x cocos2d-x-3.0 cocos2d-x-2.x


【解决方案1】:

您似乎想使用多边形作为模板来剪辑心形精灵。在这种情况下。您不必混合两个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

【讨论】:

  • 是的,你是对的,但我需要使用渲染器和混合函数来做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
相关资源
最近更新 更多