CCClippingNode(Clip修剪 可以实现新手引导遮罩、滚动字幕。。渲染child时仅渲染模板透明度值大于透明度阀值的像素点.默认透明度阀值 =1)

本文主要是介绍CCClippingNode(Clip修剪 可以实现新手引导遮罩、滚动字幕。。渲染child时仅渲染模板透明度值大于透明度阀值的像素点.默认透明度阀值 =1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

http://blog.csdn.net/univcore/article/details/42149725

         Cocos2d-x开发--使用CCRenderTexture将矩形图片裁剪成圆形显示         

  CCNode* m_pStencil;//模板   简单的模板可以用CCDrawNode 、 CCLayerColor来做 。 复杂的可以通过ccsprite 使用图片做


cocos2d-x利用CCClippingNode实现滚动字幕 - 白白手游专栏(...

要实现文字在一定区域里滚动,首先用CCClippingNode做出一个剪裁区域,在这个区域内文字可以显示,出了这个区域之后文字就看不到。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool TestLayer::init()
{
     CCSize size = CCDirector::sharedDirector()->getVisibleSize();
       
     //创建要显示的文字
     text = CCLabelTTF::create( "text\nbaibai\n白白\nbaibai\nhaha\nhaha\nahha\n" , "" , 30 );
     text->setPosition(ccp( 100 , - 120 ));
     
     //绘制裁剪区域
     CCDrawNode* shap = CCDrawNode::create();
     CCPoint point[ 4 ] = {ccp( 0 , 0 ), ccp( 200 , 0 ), ccp( 200 , 200 ), ccp( 0 , 200 )};
     shap->drawPolygon(point, 4 , ccc4f( 355 , 255 , 255 , 255 ), 2 , ccc4f( 255 , 255 , 255 , 255 ));
     CCClippingNode* cliper = CCClippingNode::create();
     cliper->setStencil(shap);
     cliper->setAnchorPoint(ccp(. 5 , . 5 ));
     cliper->setPosition(ccp( 100 , 20 ));
     addChild(cliper);
     //把要滚动的文字加入到裁剪区域
     cliper->addChild(text);
     
     //文字滚动,超出范围后从新开始
     schedule(schedule_selector(CTestLayer::rollText));
     return true ;
}
void TestLayer::rollText( float )
{
     text->getPositionY()> 300 ? text->setPositionY(- 150 ) : text->setPositionY(text->getPositionY()+ 2 );
}
cocos2d-x CCClippingNode遮罩实现手电筒效果         ( 通过移动模板实现

CCClippingNode遮罩解析 - shangguanyingqi的专栏 - 博客频道 - ...


#ifndef __MISCNODE_CCCLIPPING_NODE_H__

#define __MISCNODE_CCCLIPPING_NODE_H__


#include "base_nodes/CCNode.h"

#include "CCGL.h"  


NS_CC_BEGIN


/** CCClippingNode is a subclass of CCNode.

 It draws its content (childs) clipped using a stencil.  //绘制child时会先通过模板裁剪

 The stencil is an other CCNode that will not be drawn. //模板也是一个ccnode 但不会被渲染

 The clipping is done using the alpha part of the stencil (adjusted(调整) with an alphaThreshold).// 模板只是提供他的alpha 以实现裁剪的效果

 */

class CC_DLL CCClippingNode : public CCNode

{

protected:


// CCClippingNode 在渲染child时 仅渲染模板透明度值 大于 透明度阀值的 像素点 默认透明度阀值 =1 

    CCNode* m_pStencil;//模板   简单的模板可以用CCDrawNode 、 CCLayerColor来做 。 复杂的可以通过ccsprite 使用图片做

    GLfloat m_fAlphaThreshold;  //Alpha 透明度    Threshold 阀值工具

    bool    m_bInverted; //倒转的 反向的

        

private:

    CCClippingNode(); // 私有化构造函数 子类就不能new出此类了 这个类是不准备被派生了  

public:

    static CCClippingNode*create();  //无模板创建

    static CCClippingNode*create(CCNode *pStencil);//通过模板创建

    

    CCNode*getStencil() const;  //set get 模板

    voidsetStencil(CCNode *pStencil);

    

    GLfloatgetAlphaThreshold() const;   //set get AlphaThreshold

    voidsetAlphaThreshold(GLfloat fAlphaThreshold);

    

    /** Inverted. If this is set to YES,

     the stencil is inverted, so the content is drawn where the stencil is NOT drawn.

     This default to NO.

     */

    bool isInverted() const;

    voidsetInverted(bool bInverted);

    virtual ~CCClippingNode();

    virtual bool init();

    virtual boolinit(CCNode *pStencil);   

{

    CC_SAFE_RELEASE(m_pStencil);

    m_pStencil = pStencil;

    CC_SAFE_RETAIN(m_pStencil);

    

    m_fAlphaThreshold = 1;

    m_bInverted = false;

    // get (only once) the number of bits of the stencil buffer

    static bool once = true;

    if (once)

    {

        glGetIntegerv(GL_STENCIL_BITS, &g_sStencilBits);

        if (g_sStencilBits <= 0)

        {

            CCLOG("Stencil buffer is not enabled.");

        }

        once = false;

    }

    

    return true;

}

    virtual void onEnter();

    virtual void onEnterTransitionDidFinish();

    virtual void onExitTransitionDidStart();

    virtual void onExit();

    virtual void visit();

};


void CCClippingNode::visit()

{

    // if stencil buffer disabled

    if (g_sStencilBits < 1)

    {

        // draw everything, as if there where no stencil

        CCNode::visit();

        return;

    }

    

    // return fast (draw nothing, or draw everything if in inverted mode) if:

    // - nil stencil node

    // - or stencil node invisible:

    if (!m_pStencil || !m_pStencil->isVisible())

    {

        if (m_bInverted)

        {

            // draw everything

            CCNode::visit();

        }

        return;

    }

    

    // store the current stencil layer (position in the stencil buffer),

    // this will allow nesting up to n CCClippingNode,

    // where n is the number of bits of the stencil buffer.

    static GLint layer = -1;

    

    // all the _stencilBits are in use?

    if (layer + 1 == g_sStencilBits)

    {

        // warn once

        static bool once = true;

        if (once)

        {

            char warning[200] = {0};

            snprintf(warning, sizeof(warning), "Nesting more than %d stencils is not supported. Everything will be drawn without stencil for this node and its childs.", g_sStencilBits);

            CCLOG("%s", warning);

            

            once = false;

        }

        // draw everything, as if there where no stencil

        CCNode::visit();

        return;

    }

    

    ///

    // INIT

    

    // increment the current layer

    layer++;

    

    // mask of the current layer (ie: for layer 3: 00000100)

    GLint mask_layer = 0x1 << layer;

    // mask of all layers less than the current (ie: for layer 3: 00000011)

    GLint mask_layer_l = mask_layer - 1;

    // mask of all layers less than or equal to the current (ie: for layer 3: 00000111)

    GLint mask_layer_le = mask_layer | mask_layer_l;

    

    // manually save the stencil state

    GLboolean currentStencilEnabled = GL_FALSE;

    GLuint currentStencilWriteMask = ~0;

    GLenum currentStencilFunc = GL_ALWAYS;

    GLint currentStencilRef = 0;

    GLuint currentStencilValueMask = ~0;

    GLenum currentStencilFail = GL_KEEP;

    GLenum currentStencilPassDepthFail = GL_KEEP;

    GLenum currentStencilPassDepthPass = GL_KEEP;

    currentStencilEnabled = glIsEnabled(GL_STENCIL_TEST);

    glGetIntegerv(GL_STENCIL_WRITEMASK, (GLint *)&currentStencilWriteMask);

    glGetIntegerv(GL_STENCIL_FUNC, (GLint *)&currentStencilFunc);

    glGetIntegerv(GL_STENCIL_REF, &currentStencilRef);

    glGetIntegerv(GL_STENCIL_VALUE_MASK, (GLint *)&currentStencilValueMask);

    glGetIntegerv(GL_STENCIL_FAIL, (GLint *)&currentStencilFail);

    glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, (GLint *)&currentStencilPassDepthFail);

    glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, (GLint *)&currentStencilPassDepthPass);

    

    // enable stencil use

    glEnable(GL_STENCIL_TEST);

    // check for OpenGL error while enabling stencil test

    CHECK_GL_ERROR_DEBUG();

    

    // all bits on the stencil buffer are readonly, except the current layer bit,

    // this means that operation like glClear or glStencilOp will be masked with this value

    glStencilMask(mask_layer);

    

    // manually save the depth test state

    //GLboolean currentDepthTestEnabled = GL_TRUE;

    GLboolean currentDepthWriteMask = GL_TRUE;

    //currentDepthTestEnabled = glIsEnabled(GL_DEPTH_TEST);

    glGetBooleanv(GL_DEPTH_WRITEMASK, &currentDepthWriteMask);

    

    // disable depth test while drawing the stencil

    //glDisable(GL_DEPTH_TEST);

    // disable update to the depth buffer while drawing the stencil,

    // as the stencil is not meant to be rendered in the real scene,

    // it should never prevent something else to be drawn,

    // only disabling depth buffer update should do

    glDepthMask(GL_FALSE);

    

    ///

    // CLEAR STENCIL BUFFER

    

    // manually clear the stencil buffer by drawing a fullscreen rectangle on it

    // setup the stencil test func like this:

    // for each pixel in the fullscreen rectangle

    //     never draw it into the frame buffer

    //     if not in inverted mode: set the current layer value to 0 in the stencil buffer

    //     if in inverted mode: set the current layer value to 1 in the stencil buffer

    glStencilFunc(GL_NEVER, mask_layer, mask_layer);

    glStencilOp(!m_bInverted ? GL_ZERO : GL_REPLACE, GL_KEEP, GL_KEEP);

    

    // draw a fullscreen solid rectangle to clear the stencil buffer

    //ccDrawSolidRect(CCPointZero, ccpFromSize([[CCDirector sharedDirector] winSize]), ccc4f(1, 1, 1, 1));

    ccDrawSolidRect(CCPointZero, ccpFromSize(CCDirector::sharedDirector()->getWinSize()), ccc4f(1, 1, 1, 1));

    

    ///

    // DRAW CLIPPING STENCIL

    

    // setup the stencil test func like this:

    // for each pixel in the stencil node

    //     never draw it into the frame buffer

    //     if not in inverted mode: set the current layer value to 1 in the stencil buffer

    //     if in inverted mode: set the current layer value to 0 in the stencil buffer

    glStencilFunc(GL_NEVER, mask_layer, mask_layer);

    glStencilOp(!m_bInverted ? GL_REPLACE : GL_ZERO, GL_KEEP, GL_KEEP);

    

    // enable alpha test only if the alpha threshold < 1,

    // indeed if alpha threshold == 1, every pixel will be drawn anyways

#if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WINDOWS || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)

    GLboolean currentAlphaTestEnabled = GL_FALSE;

    GLenum currentAlphaTestFunc = GL_ALWAYS;

    GLclampf currentAlphaTestRef = 1;

#endif

    if (m_fAlphaThreshold < 1) {

#if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WINDOWS || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)

        // manually save the alpha test state

        currentAlphaTestEnabled = glIsEnabled(GL_ALPHA_TEST);

        glGetIntegerv(GL_ALPHA_TEST_FUNC, (GLint *)&currentAlphaTestFunc);

        glGetFloatv(GL_ALPHA_TEST_REF, &currentAlphaTestRef);

        // enable alpha testing

        glEnable(GL_ALPHA_TEST);

        // check for OpenGL error while enabling alpha test

        CHECK_GL_ERROR_DEBUG();

        // pixel will be drawn only if greater than an alpha threshold

        glAlphaFunc(GL_GREATER, m_fAlphaThreshold);

#else

        // since glAlphaTest do not exists in OES, use a shader that writes

        // pixel only if greater than an alpha threshold

        CCGLProgram *program = CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColorAlphaTest);

        GLint alphaValueLocation = glGetUniformLocation(program->getProgram(), kCCUniformAlphaTestValue);

        // set our alphaThreshold

        program->setUniformLocationWith1f(alphaValueLocation, m_fAlphaThreshold);

        // we need to recursively apply this shader to all the nodes in the stencil node

        // XXX: we should have a way to apply shader to all nodes without having to do this

        setProgram(m_pStencil, program);

       

#endif

    }

    

    // draw the stencil node as if it was one of our child

    // (according to the stencil test func/op and alpha (or alpha shader) test)

    kmGLPushMatrix();

    transform();

    m_pStencil->visit();

    kmGLPopMatrix();

    

    // restore alpha test state

    if (m_fAlphaThreshold < 1)

    {

#if (CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WINDOWS || CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)

        // manually restore the alpha test state

        glAlphaFunc(currentAlphaTestFunc, currentAlphaTestRef);

        if (!currentAlphaTestEnabled)

        {

            glDisable(GL_ALPHA_TEST);

        }

#else

// XXX: we need to find a way to restore the shaders of the stencil node and its childs

#endif

    }

    

    // restore the depth test state

    glDepthMask(currentDepthWriteMask);

    //if (currentDepthTestEnabled) {

    //    glEnable(GL_DEPTH_TEST);

    //}

    

    ///

    // DRAW CONTENT

    

    // setup the stencil test func like this:

    // for each pixel of this node and its childs

    //     if all layers less than or equals to the current are set to 1 in the stencil buffer

    //         draw the pixel and keep the current layer in the stencil buffer

    //     else

    //         do not draw the pixel but keep the current layer in the stencil buffer

    glStencilFunc(GL_EQUAL, mask_layer_le, mask_layer_le);

    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

    

    // draw (according to the stencil test func) this node and its childs

    CCNode::visit();

    

    ///

    // CLEANUP

    

    // manually restore the stencil state

    glStencilFunc(currentStencilFunc, currentStencilRef, currentStencilValueMask);

    glStencilOp(currentStencilFail, currentStencilPassDepthFail, currentStencilPassDepthPass);

    glStencilMask(currentStencilWriteMask);

    if (!currentStencilEnabled)

    {

        glDisable(GL_STENCIL_TEST);

    }

    

    // we are done using this layer, decrement

    layer--;

}



这篇关于CCClippingNode(Clip修剪 可以实现新手引导遮罩、滚动字幕。。渲染child时仅渲染模板透明度值大于透明度阀值的像素点.默认透明度阀值 =1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/661607

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义