智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 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
30 31 1 2 3 4 5

cocos2d-x 手电筒效果

Posted on   Bill Yuan  阅读(1152)  评论(0编辑  收藏  举报

转自:http://blog.csdn.net/xujiezhige/article/details/8448524#

常见的手电筒效果,可以通过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 );
复制代码

在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();
复制代码

在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();
复制代码

在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开头的宏是我个人写的一些宏,以便本人加快编程速度。你可以通过字面意思猜到我的宏实现方法,呵呵。
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2009-12-28 程序英语
点击右上角即可分享
微信分享提示