开发者社区> 雪人泰山> 正文

cocos2d-x 手电筒效果

简介: 常见的手电筒效果,可以通过CCRenderTexture来实现。主要是通过修改渲染表面的alpha值来达到手电筒光照范围内的透明效果。此方法纯原创,如有雷同,英雄所见略同。
+关注继续查看

常见的手电筒效果,可以通过CCRenderTexture来实现。主要是通过修改渲染表面的alpha值来达到手电筒光照范围内的透明效果。此方法纯原创,如有雷同,英雄所见略同。这里由于本人没有什么图片,这里直接用矩形区域来代替圆形区域。通过以下几个基本步骤来完成这个效果。

  1. 首先创建一个全黑的渲染表明覆盖在场景之上。
        //create render target
        CCRenderTexture* pRenderTexture = CCRenderTexture::create( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT );
        
        //render the target to black
        pRenderTexture->begin();
        glDisable( GL_BLEND );
        ccDrawSolidRect( ccp( 0, 0 ), ccp( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT ), ccc4f( 0, 0, 0, 1 ) );
        glEnable( GL_BLEND );
        pRenderTexture->end();
        
        //set the render target over the scene
        pRenderTexture->setPosition( ccp( BY_WIN_SIZE_WIDTH_HALF, BY_WIN_SIZE_HEIGHT_HALF ) );
        addChild( pRenderTexture, 2, 1000 );
        
        //render target is the sprite's texture.
        //set the sprite render parms.
        ccBlendFunc bf = { GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA };
        pRenderTexture->getSprite()->setBlendFunc( bf );
    
  2. 在ccTouchBegan()函数中透明处用户点击的区域
        //get transparent area
        CCPoint ptBottomLeftCorner = ccpSub( pTouch->getLocation(), ccp( 200, 200 ) );
        CCPoint ptTopRightCorner = ccpAdd( pTouch->getLocation(), ccp( 200, 200 ) );
        
        //set the area transparent
        BY_GET_CHILD( CCRenderTexture, 1000 )->begin();
        glDisable( GL_BLEND );
        ccDrawSolidRect( ptBottomLeftCorner, ptTopRightCorner, ccc4f( 0, 0, 0, 0 ) );
        glEnable( GL_BLEND );
        BY_GET_CHILD( CCRenderTexture, 1000 )->end();
  3. 在ccTouchMoved()函数中,首先抹黑原来的区域(这里为了保险,我们直接抹黑整个渲染表面),另外透明出新的区域
        //get transparent area
        CCPoint ptBottomLeftCorner = ccpSub( pTouch->getLocation(), ccp( 200, 200 ) );
        CCPoint ptTopRightCorner = ccpAdd( pTouch->getLocation(), ccp( 200, 200 ) );
        
        BY_GET_CHILD( CCRenderTexture, 1000 )->begin();
        glDisable( GL_BLEND );
        
        //set the render target black
        ccDrawSolidRect( CCPointZero, ccp( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT ), ccc4f( 0, 0, 0, 1 ) );
        //set the new area transparent
        ccDrawSolidRect( ptBottomLeftCorner, ptTopRightCorner, ccc4f( 0, 0, 0, 0 ) );
        
        glEnable( GL_BLEND );
        BY_GET_CHILD( CCRenderTexture, 1000 )->end();
    
  4. 在ccTouchEnded()和ccTouchCanceled()函数中,抹黑整块渲染表面。
        BY_GET_CHILD( CCRenderTexture, 1000 )->begin();
        glDisable( GL_BLEND );
        ccDrawSolidRect( CCPointZero, ccp( BY_WIN_SIZE_WIDTH, BY_WIN_SIZE_HEIGHT ), ccc4f( 0, 0, 0, 1 ) );
        glEnable( GL_BLEND );
        BY_GET_CHILD( CCRenderTexture, 1000 )->end();

好了,我们实现了这个“矩形"的手电筒效果。最好使用png图片来弄出手电筒光圈和透明区域来。

另外:其中BY开头的宏是我个人写的一些宏,以便本人加快编程速度。你可以通过字面意思猜到我的宏实现方法,呵呵。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
activity 做出 dialog 效果
引用:http://www.oschina.net/code/snippet_4873_6112 好像是Activity里声明的Dialog。其实是两个Activity,而且甚至是两个不同的App的Activity。
779 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
23589 0
cocos2d-x 手电筒效果
常见的手电筒效果,可以通过CCRenderTexture来实现。主要是通过修改渲染表面的alpha值来达到手电筒光照范围内的透明效果。此方法纯原创,如有雷同,英雄所见略同。
984 0
css3图片过滤效果
在线演示 本地下载
960 0
visual C++游戏绘图之透明效果制作原理
<p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; font-family:Arial; font-size:14px; line-height:26px"> <span style="font-family:'Microsoft YaHei'; font-size:16px"
1394 0
OpenCV 实现哈哈镜效果
代码,有参考别人的代码 // haha_mirror.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include "cv.
1507 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
29206 0
+关注
雪人泰山
把每个细节都做好 ,精益求精
113
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载