博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2d-x 3.8.1 Widget 置灰的实现
阅读量:4288 次
发布时间:2019-05-27

本文共 2955 字,大约阅读时间需要 9 分钟。

首先我这里说明一下,因为我们的ui大部分是用CocosStudio做的,所以这里针对的对象基本是都是Widget的子类对象。这里实现有两种方式

第一方式就是直接利用引擎提供的现有的内容来实现。以下两个方法可以实现将Widget置灰,以及从置灰还原原色

//将节点置灰

void addNodeGray(cocos2d::ui::Widget* node){
    do{
        CC_BREAK_IF(node==nullptr);
        const char* key=GLProgram::SHADER_NAME_POSITION_GRAYSCALE;
        GLProgram* gLProgram=GLProgramCache::getInstance()->getGLProgram(key);
        auto scale9Sprite=dynamic_cast<Scale9Sprite*>(node->getVirtualRenderer());
        if(scale9Sprite!=nullptr){
            auto sprite=scale9Sprite->getSprite();
            if(sprite!=nullptr){
                sprite->setGLProgram(gLProgram);
            }else{
                scale9Sprite->setGLProgram(gLProgram);
            }
        }
    }while (0);
}
//将节点从灰色恢复正常颜色
void removeNodeGray(cocos2d::ui::Widget* node){
    do{
        CC_BREAK_IF(node==nullptr);
        const char* key=GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP;
        auto glprogramstate = GLProgramState::getOrCreateWithGLProgramName(key);
        auto scale9Sprite=dynamic_cast<Scale9Sprite*>(node->getVirtualRenderer());
        if(scale9Sprite!=nullptr){
            auto sprite=scale9Sprite->getSprite();
            if(sprite!=nullptr){
                sprite->setGLProgramState(glprogramstate);
            }else{
                scale9Sprite->setGLProgramState(glprogramstate);
            }
        }
    }while (0);
}

第二种方式:则是自己提供两个文件gray.fsh和gray.vsh,这两个文件放在项目的Resources目录下

gray.fsh的内容

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;      
  
void main()           
{  
    vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);  
    float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));  
    gl_FragColor = vec4(gray, gray, gray, v_orColor.a);  
gray.vsh的内容
attribute vec4 a_position;
attribute vec2 a_texCoord;  
attribute vec4 a_color;  
                      
  
varying vec4 v_fragmentColor;  
varying vec2 v_texCoord;  
                                  
void main()   
{                             
    gl_Position = CC_PMatrix * a_position;  
    v_fragmentColor = a_color;  
    v_texCoord = a_texCoord;  
}
--------------------------------------------------------------------------------这里是分割线---------------------------------------------------------------------------------------------
//将节点置灰
void addNodeGray(cocos2d::ui::Widget* node){
    do{
        CC_BREAK_IF(node==nullptr);
        GLProgram* gLProgram=GLProgramCache::getInstance()->getGLProgram("black_white");
        if(gLProgram==nullptr){
               gLProgram = GLProgram::createWithFilenames("gray.vsh", "gray.fsh");
    GLProgramCache::getInstance()->addGLProgram(gLProgram,"black_white");
        }
        auto scale9Sprite=dynamic_cast<Scale9Sprite*>(node->getVirtualRenderer());
        if(scale9Sprite!=nullptr){
            auto sprite=scale9Sprite->getSprite();
            if(sprite!=nullptr){
                sprite->setGLProgram(gLProgram);
            }else{
                scale9Sprite->setGLProgram(gLProgram);
            }
        }
    }while (0);
}
//将节点从灰恢复正常颜色
void removeNodeGray(cocos2d::ui::Widget* node){
    do{
        CC_BREAK_IF(node==nullptr);
        auto glprogramstate = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP);
        auto scale9Sprite=dynamic_cast<Scale9Sprite*>(node->getVirtualRenderer());
        if(scale9Sprite!=nullptr){
            auto sprite=scale9Sprite->getSprite();
            if(sprite!=nullptr){
                sprite->setGLProgramState(glprogramstate);
            }else{
                scale9Sprite->setGLProgramState(glprogramstate);
            }
        }
    }while (0);
}

转载地址:http://ettgi.baihongyu.com/

你可能感兴趣的文章
ISO之日历的使用
查看>>
ISO框架设计之登录超时、未登录设计和断网重连的设计。。。。。
查看>>
iOS 之IQKeyboardManager键盘的使用
查看>>
PHP之目录的操作
查看>>
iOS 之苹果运行机制总结
查看>>
PHP之文件操作,http请求数据格式,模拟get和post,CURL模拟请求的使用
查看>>
PHP之电商网站解析设计及防攻击、错误日志、iframe局部刷新
查看>>
iOS之Header Search Paths和User Header Search Paths和library searchpath、pch(prefix header)、pods文件路径
查看>>
iOS之开发编码规范
查看>>
iOS中状态栏网络加载指示器
查看>>
PHP之MAC上环境配置
查看>>
iOS之WKWebView修改网页页面的值
查看>>
PHP之数据库设计
查看>>
iOS之NSLog控制台打印不完全的解决方法
查看>>
iOS之github、oschina、bitboucket使用(二)
查看>>
iOS 之AFN封装(四)常用
查看>>
iOS 企业版账号的使用
查看>>
iOS 多线程控制线程并发数、GCD之dispatch_group、GCD信号量、验证码按钮倒计时
查看>>
iOS 之NSRange实现小数向上取整
查看>>
PHP 之XML编程,注释总结
查看>>