智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 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之蒙板,局部高亮可点,CCRenderTexture

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

转自:http://www.2cto.com/kf/201207/144656.html

  蒙板,局部高亮可点的用处大多是在新手引导的时候,引导玩家一步一步的走游戏的操作流程。

  之前写了一个cocos2d-iphone的版本,因为设置成圆角的,比较美观,如果不用圆角,可以直接把Sprite改成layercolor,这个版本的缺点是每步都需要美术出一个资源(如果每步的点击区域大小不一样的话),现在这个版本是直接设置大小即可。


  这个版本的设计思路是,用layercolor,先把高亮的区域设置好了,然后在layercolor的四个角加上一个小圆角的sprite,这样就不用每步都需要美术出资源了。可以随意的设置高亮区域的大小。本来想直接不用sprite,直接找个方法设置layercolor的圆角的,没找到合适的方法,如果大家有比较合适的更简便的方法,欢迎拍砖。

 

  原理是:渲染的时候,使用异步混合渲染。ccBlendFunc

  不多说,直接上代码

  为了获取点击事件,所以继承了 CCTargetedTouchDelegate,把touch的权限设置为最高。

复制代码
//.h  
#ifndef Good_PlayGuide_h 
#define Good_PlayGuide_h 
 
#include "cocos2d.h" 
 
using namespace cocos2d; 
 
class PlayerGuide:public CCSprite , public CCTargetedTouchDelegate 
{ 
public: 
    PlayerGuide(); 
    virtual ~PlayerGuide(); 
     
    virtual bool init(); 
    virtual void onEnter(); 
    virtual void onExit(); 
     
    virtual bool ccTouchBegan(CCTouch *touch, CCEvent *event); 
    virtual void ccTouchMoved(CCTouch *touch, CCEvent *event); 
    virtual void ccTouchEnded(CCTouch *touch, CCEvent *event); 
     
    void onSetSpriteAndPosition(float width,float height,CCPoint point); 
    CCLayerColor *m_layer; // color layer 
    float m_layerWidth; //layer width  
    float m_layerHeight; // layer height  
    CCRenderTexture *m_pTarget; // render texture  
}; 
#endif 
复制代码

复制代码
// cpp
#include <iostream> 
#include "PlayerGuide.h" 
 
 
PlayerGuide::PlayerGuide() 
{ 
    m_layerWidth = 0.0f; 
    m_layerHeight = 0.0f; 
} 
 
PlayerGuide::~PlayerGuide() 
{ 
    
} 
 
bool PlayerGuide::init() 
{ 
    if (!CCSprite::init()) { 
        return false; 
    } 
     
    return true; 
} 
 
void PlayerGuide::onEnter() 
{ 
    //since v2.0 
//    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -201, true); 
//当进入这个对象时,设置touch事件的响应权限,menu的响应级别是-128,我们要获取比这个要高的权限,(设置的数值越低,权限越高) 
    CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, -201, true); 
    CCSprite::onEnter(); 
} 
 
void PlayerGuide::onExit() 
{ 
    //since v2.0 
   //    CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); 
   //退出时,把touch响应的事件 移除 
    CCTouchDispatcher::sharedDispatcher()->removeDelegate(this); 
    CCSprite::onExit(); 
} 
#pragma mark  --------------------------setSpriteAndPosition---------------------------- 
 
/*******************************************************************************
*@param width 设置高亮区域的宽度,height 高亮区域的高度,point 设置layer的position
*
*
*******************************************************************************/ 
 
void PlayerGuide::onSetSpriteAndPosition(float width,float height, CCPoint point) 
{ 
    if (width != 0 && height != 0) { 
        m_layerWidth = width; 
        m_layerHeight = height; 
        m_layer = CCLayerColor::layerWithColorWidthHeight(ccc4(0x00, 0x00, 0x00, 0xff), width, height); 
        m_layer->retain(); 
        ccBlendFunc ccb = {GL_ZERO,GL_ONE_MINUS_SRC_ALPHA}; 
         
        m_layer->setBlendFunc(ccb); 
        m_layer->setPosition(point); 
         
        CCSprite *topright = CCSprite::spriteWithFile("yourfile");//自己设置圆角的小图,如果不需要圆角,可以直接把sprite去掉 
        topright->getTexture()->setAliasTexParameters(); 
        ccBlendFunc cbf = {GL_ONE,GL_ONE_MINUS_DST_ALPHA}; 
        topright->setBlendFunc(cbf); 
        topright->setPosition(ccp(m_layer->getContentSize().width - topright->getContentSize().width/2,m_layer->getContentSize().height - topright->getContentSize().height/2)); 
        topright->setOpacity(255*0.5); 
        m_layer->addChild(topright,1); 
         
        CCSprite *topleft = CCSprite::spriteWithFile(IMG_PATH(IMAGE_PLAYERGUIDE_ROUNDED)); 
        topleft->getTexture()->setAliasTexParameters(); 
        ccBlendFunc cbf1 = {GL_ONE,GL_ONE_MINUS_DST_ALPHA}; 
        topleft->setBlendFunc(cbf1); 
        topleft->setPosition(ccp(topleft->getContentSize().width/2,m_layer->getContentSize().height - topleft->getContentSize().height/2)); 
        topleft->setOpacity(255*0.5); 
        topleft->setFlipX(true); 
        m_layer->addChild(topleft,1); 
         
        CCSprite *buttomleft = CCSprite::spriteWithFile(IMG_PATH(IMAGE_PLAYERGUIDE_ROUNDED)); 
        buttomleft->getTexture()->setAliasTexParameters(); 
        ccBlendFunc cbf2 = {GL_ONE,GL_ONE_MINUS_DST_ALPHA}; 
        buttomleft->setBlendFunc(cbf2); 
        buttomleft->setPosition(ccp(buttomleft->getContentSize().width/2,buttomleft->getContentSize().height/2)); 
        buttomleft->setOpacity(255*0.5); 
        buttomleft->setFlipX(true); 
        buttomleft->setFlipY(true); 
        m_layer->addChild(buttomleft,1); 
         
        CCSprite *buttomright = CCSprite::spriteWithFile(IMG_PATH(IMAGE_PLAYERGUIDE_ROUNDED)); 
        buttomright->getTexture()->setAliasTexParameters(); 
        ccBlendFunc cbf3 = {GL_ONE,GL_ONE_MINUS_DST_ALPHA}; 
        buttomright->setBlendFunc(cbf3); 
        buttomright->setPosition(ccp(m_layer->getContentSize().width - buttomleft->getContentSize().width/2,buttomright->getContentSize().height/2)); 
        buttomright->setOpacity(255*0.5); 
        buttomright->setFlipY(true); 
        m_layer->addChild(buttomright,1); 
    } 
     
    CCSize s = CCDirector::sharedDirector()->getWinSize(); 
     
    m_pTarget = CCRenderTexture::renderTextureWithWidthAndHeight(s.width, s.height); 
    ccBlendFunc ccb1 = {GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA}; 
    m_pTarget->getSprite()->setBlendFunc(ccb1); 
    m_pTarget->clear(0.0f, 0.0f, 0.0f, 0.5f); 
     
    m_pTarget->setPosition(ccp(s.width/2,s.height/2)); 
     
    this->addChild(m_pTarget); 
     
    m_pTarget->begin(); 
    if (width != 0 && height != 0) { 
         m_layer->visit(); 
    } 
    
    m_pTarget->end(); 
} 
 
bool PlayerGuide::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) 
{ 
    CCPoint touchpoint = touch->locationInView(touch->view()); 
    touchpoint = CCDirector::sharedDirector()->convertToGL(touchpoint); 
 
if (m_layerWidth != 0 && m_layerHeight != 0) { 
    //如果点击高亮区域,则响应下层的区域 
            CCRect rect = m_layer->boundingBox(); 
            if (CCRect::CCRectContainsPoint(rect, touchpoint)) { 
                return false; 
            } 
 
     
    return true; 
} 
 
void PlayerGuide::ccTouchMoved(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) 
{ 
     
} 
 
void PlayerGuide::ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) 
{ 
     
} 
复制代码

 

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示