zoukankan      html  css  js  c++  java
  • Cocos2dx 学习记录 [2] 关于混合和高亮一些知识点的体会

    网上有一篇博客讲的是高亮的 http://www.cnblogs.com/mrblue/p/3455775.html

    就是这篇,尽管代码简单,但对于刚開始学习的人的我,看的还是有些吃力的,毕竟有些内容不是太理解,当时为了看代码费了非常大功夫,仅此记录一下,省的以后忘了


    首先假设目的是做一个高亮效果,那么就要有阴影,在阴影的某个区域把颜色正常显示出来就是高亮了,所以先说下阴影的生成


    原理上阴影的生成用的纹理 (结合混合)

    就是CCRenderTexture::create(visibleSize.width, visibleSize.height, kCCTexture2DPixelFormat_RGBA8888);

    后面那个參数是纹理样式的意思

    这时候建设你的界面上已经有图片显示了,这时候你把这块纹理放到你屏幕中(注意zorder值要在背景之上),哈哈是出不来阴影效果的

    还要加一句m_pTarget->clear(0,0,0,0.5f);

    好吧这个函数我感觉非常奇异,有点像opengl中的glcolor4f的意思,感觉就是上色了。。。

    另外最后那个0.5f就是opengl中的通道制,相当于与设置透明度了,假设是0 就是全透明,假设是1就是不透明

    好的,把我们设定好的透明度为0.5纹理调整好位置大小(纹理也是ccnode的一种方法类似于精灵类)这样就能显示出一片阴影了


    总结一下,实现阴影,就是先建立一块纹理,然后把它放到指定的位置上,把这块纹理的透明度设置小于1.0,这样就能在纹理区域生成阴影效果了。


    然后就是高亮部分了

    这里上一下上面引用博客MrBlue的代码

    bool HelloWorld::init()
    {
        //////////////////////////////
        // 1. super init first
        if ( !CCLayer::init() )
        {
            return false;
        }
        
        CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
        CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();


        …………
        …………
        
        m_pTarget = CCRenderTexture::create(visibleSize.width, visibleSize.height, kCCTexture2DPixelFormat_RGBA8888);
        m_pTarget->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2));
        addChild(m_pTarget, 10000);


        return true;
    }


    void HelloWorld::setHighlightRect(const cocos2d::CCRect& rect)
    {
        CCSprite* pMask = CCSprite::create("btn-about-normal.png");
        pMask->setPosition(ccp(rect.origin.x,rect.origin.y));
        pMask->setAnchorPoint(ccp(0,0));
        pMask->setScaleX(rect.size.width/pMask->getContentSize().width);
        pMask->setScaleY(rect.size.height/pMask->getContentSize().height);


        ccBlendFunc blend;
        blend.src = GL_ZERO;
        blend.dst = GL_ONE_MINUS_SRC_ALPHA;
        pMask->setBlendFunc(blend);


        m_pTarget->clear(0,0,0,0.8f);
        m_pTarget->begin();
        pMask->visit();
        m_pTarget->end();
    }


    前面一个函数,就是生成阴影的部分,当然仅仅敲前面那几行是生成不了的,由于缺少了 m_pTarget->clear(0,0,0,0.8f);这一句,不知道为什么这位大神给放到了后面,放到前面的话,就能够直接生成阴影了哦。。

    后面的那个函数就是令人激动人心得高亮部分了,嘿嘿

    看看都干了些什么:

    首先是设置了一个精灵,而且把精灵的大小位置都做了设定,这个没啥说的,继续

    然后设置了一个混合对象,这里有个知识点,主要是说混合的一些原理和參数的,能够參考下这个博客,说的非常好

    http://www.cnblogs.com/yujunyong/archive/2011/04/13/2015467.html

    再看下代码

      blend.src = GL_ZERO;
      blend.dst = GL_ONE_MINUS_SRC_ALPHA;

    好吧,我是这样理解的,原目标透明值清零(全透明),结果目标透明值等于1减去元目标的透明值,就是假设原目标的透明值是0.3,那么结果目标就是0.7,还是有些遮挡的吧,毕竟不是全透明,所以我做了一下改动blend.dst = GL_ZERO;

    嘿嘿,这下好了,原透明值为0,如今这个透明值也为零,世界清净了,都透明了,这下能够把后面“原“遮挡的东西本色展现出来了(为什么后面的图像不參与混合呢,后面会说),这样就形成了高亮

    后面还有几行代码

        m_pTarget->begin();
        pMask->visit();
        m_pTarget->end();
    这个我纠结了非常久,毕竟还是菜鸟,上红孩儿的群里问了一下,他们说就是在纹理作用区域上绘制,恩,答得非常精辟啊

    我是这样理解的

      a->begin();
       b->visit();
       b->end();

    a是个纹理,b在a上进行绘制,不会影响到其它(这应该就是后面的透明值没有受到影响的原因),这样这个二次混合就仅仅针对产生了阴影的纹理作用了,进而产生了高亮的效果

    还有那个visit,好吧,之前还真不知道,刚開始学习的人,羞愧啊,就是遍历全部子节点绘制的意思吧,意思不知道到不到位,还须要多实践啊。。。

    欢迎批评指正,我就脸皮厚,不怕歧视,嘿嘿

    九月份要找工作了,加油

    
    

  • 相关阅读:
    乐观锁与悲观锁——解决并发问题
    CentOS7 loaded active exited
    ubuntu安装phpVirtualBox web服务
    linux drwxr-xr-x 是什么意思
    phpmyadmin配置文件权限错误,不应任何用户都能修改
    转: CentOS安装jdk8
    PostgreSQL windows service启动失败
    PostgreSQL 添加自定义变量
    数据库检查约束是否存在
    转:PostgreSQL Cheat Sheet
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/3981262.html
Copyright © 2011-2022 走看看