cocos2d Sprite混合达到水流动效果

使用Sprite混合setBlendFunc方式达到流动效果
这里写图片描述

void MainHomeLayer::updateWaterFall(float dt)
{
    static float offset = 0;
    if(NULL != _waterFall)
    {
        _waterFall->removeFromParentAndCleanup(true);
    }

    CCSprite* background = (CCSprite*)this->getChildByTag(eMainHomeLayer_Background);
    CCSprite * waterFall = CCSprite::create("img/mainHome/waterfall.png");
    CCTexture2DPixelFormat pixelFormat =  waterFall->getTexture()->getPixelFormat();

    if(kTexture2DPixelFormat_RGBA8888 == pixelFormat ||
       kTexture2DPixelFormat_RGB5A1 == pixelFormat ||
       kTexture2DPixelFormat_RGBA4444 == pixelFormat)
    {
        float scaleX = background->getScaleX();
        float scaleY = background->getScaleY();

        ///Render Texture Begin
        CCSize textrueSize = CCSizeMake(waterFall->getContentSize().width  * scaleX,waterFall->getContentSize().height * scaleY);
        CCRenderTexture* renderTexture = CCRenderTexture::create(textrueSize.width, textrueSize.height, kTexture2DPixelFormat_RGBA8888);
        renderTexture->begin();

        ccBlendFunc blendFunc1 = {GL_ONE,GL_ONE_MINUS_SRC_ALPHA};
        waterFall->setBlendFunc(blendFunc1);
        waterFall->setOpacity(30);
        waterFall->setPosition(CCPointMake(textrueSize.width * 0.5, textrueSize.height * 0.5));
        waterFall->setScaleX(scaleX);
        waterFall->setScaleY(scaleY);
        waterFall->visit();

        ccBlendFunc blendFunc = {GL_DST_ALPHA,GL_ONE_MINUS_DST_ALPHA};
        ccTexParams tp = {GL_LINEAR,GL_LINEAR,GL_REPEAT,GL_REPEAT};
        float PIXRIS_PRR_SECOND_WATER  =  (CCRANDOM_0_1() * 20 + 20) * scaleY;
        CCSprite * water = CCSprite::create("img/mainHome/Water02.jpg");
        water->setBlendFunc(blendFunc);
        water->setScaleX(scaleX);
        water->setScaleY(scaleY);
        water->getTexture()->setTexParameters(&tp);
        water->setTextureRect(CCRectMake(0, -offset, water->getContentSize().width, water->getContentSize().height));
        water->setPosition(CCPointMake(textrueSize.width * 0.5, textrueSize.height * 0.5));
        water->visit();

        renderTexture->end();
        ///Render Texture End

        this->setWaterFall(renderTexture->getSprite());
        this->getWaterFall()->removeFromParentAndCleanup(true);
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        this->getWaterFall()->setPosition(CCPointMake(winSize.width * 0.87, winSize.height * 0.8));
        this->addChild(this->getWaterFall(),100);

        offset += PIXRIS_PRR_SECOND_WATER * dt;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Cocos2d-x中实现流光效果可以使用shader来进行渲染。首先,我们需要创建一个自定义的shader,并将其应用于需要实现流光效果的节点上。 在使用Cocos2d-x的过程中,我们可以使用GLSL语言编写shader代码。在实现流光效果的shader中,我们可以通过改变像素的颜色和透明度来创建流动效果。 首先,我们定义一个uniform变量time,用于控制流光的移动速度。然后,在片段着色器中,通过改变颜色和透明度的计算公式来实现流动效果。我们可以使用sin函数或者其他数学函数来计算出每个像素点的颜色和透明度,然后将其应用到节点上。 在节点的渲染流程中,我们将这个自定义的shader应用到节点上,然后传入时间参数,即更新uniform变量time的值。随着时间的增加,我们就可以看到节点上的流光效果在不断地移动。 为了实现更加逼真的流光效果,我们可以尝试给流光添加一些额外的效果,比如模糊、叠加等。通过调整shader代码中的计算公式和传入的参数,我们可以根据自己的需求来调整流光效果的强度和样式。 总结起来,在Cocos2d-x中实现流光效果需要创建一个自定义的shader,并将其应用于需要实现效果的节点上。通过改变颜色和透明度的计算公式、传入时间参数等,我们可以实现一个流光效果,使节点看起来具有流动的动画效果
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值