转自: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, -, 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 != && height != ) {
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/,m_layer->getContentSize().height - topright->getContentSize().height/));
topright->setOpacity(*0.5);
m_layer->addChild(topright,); 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/,m_layer->getContentSize().height - topleft->getContentSize().height/));
topleft->setOpacity(*0.5);
topleft->setFlipX(true);
m_layer->addChild(topleft,); 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/,buttomleft->getContentSize().height/));
buttomleft->setOpacity(*0.5);
buttomleft->setFlipX(true);
buttomleft->setFlipY(true);
m_layer->addChild(buttomleft,); 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/,buttomright->getContentSize().height/));
buttomright->setOpacity(*0.5);
buttomright->setFlipY(true);
m_layer->addChild(buttomright,);
} 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/,s.height/)); this->addChild(m_pTarget); m_pTarget->begin();
if (width != && height != ) {
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 != && m_layerHeight != ) {
//如果点击高亮区域,则响应下层的区域
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)
{ }

cocos2d-x之蒙板,局部高亮可点,CCRenderTexture的更多相关文章

  1. PS日记二(调色:色阶,曲线,色相/饱和度,色彩平衡,蒙板)

    基础知识一:在PS操作中为什么要复制图层(ctrl+J)? 答:复制图层主要是为了 备份原图层,在副本中进行操作 如果说你副本弄坏了,还有原来的PS复制图层一方面是保全原图.二是因为图层是ps操作的基 ...

  2. WPF弹出带蒙板的消息框

    效果图 思路 拿到父级窗体的内容,放入一个容器里,再在容器里放入一个半透明层.将整个容器赋给父级窗体的内容. 关闭时反向操作. 代码 消息窗弹出时 /// <summary> /// 弹出 ...

  3. SVG 2D入门9 - 蒙板

    SVG支持的蒙板 SVG支持多种蒙板特效,使用这些特性,我们可以做出很多很炫的效果.至于中文中把mask叫做"蒙板"还是"遮罩"就不去区分了,这里都叫做蒙板吧. ...

  4. NeHe OpenGL教程 第二十课:蒙板

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. 利用 js 实现弹出蒙板(model)功能

    关于 js 实现一个简单的蒙板功能(model) 思路: 创建一个蒙板, 设置蒙板的堆叠顺序保证能将其它元素盖住 position: absolute; top: 0; left: 0; displa ...

  6. CLIP PATH (MASK) GENERATOR是一款在线制作生成clip-path路径的工具,可以直接生成SVG代码以及配合Mask制作蒙板。

    CLIP PATH (MASK) GENERATOR是一款在线制作生成clip-path路径的工具,可以直接生成SVG代码以及配合Mask制作蒙板. CLIP PATH (MASK) GENERATO ...

  7. Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现

    Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现 暂时还未有时间开发这效果,所以先贴出来. 先贴一张效果图,这是一张手机截屏: 左上方的风景图:背景图片 右上方的人物图:前景图 ...

  8. js动态加载的蒙板弹框

    我们访问一些网站时总会遇到这种点击后,背景像被打上一层模板一样,这个是怎么做到的呢? 它是将这个弹框div独立于页面容器wrap,设置position为absolute,将其水平垂直之后都居中,设置弹 ...

  9. WPF蒙板弹窗

    由于界面设计需要,要给弹窗添加蒙板效果,在百度和google搜索了半天,竟然没有一个满意的方案,最后只能自己想办法实现了一个,原理还是比较简单的,现在分享给大家. 先看一下效果..      原理其实 ...

随机推荐

  1. Java版本的删除指定目录及子目录下名叫“xxx.txt”的所有文件

    以前写过一个python版本的,但是在查找文件路径的时候出现错误,无法正确的获取到文件的路径,就造成无法删除该路径下的“xxx.txt”文件. 当时以为是windows版本系统的错误造成这个问题的,也 ...

  2. Apache HTTP Server多个拒绝服务漏洞

    漏洞版本: Apache Group Apache HTTP Server < 2.4.9 漏洞描述: BUGTRAQ ID: 66303 CVE ID: CVE-2013-6438,CVE-2 ...

  3. UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)

    题意: 知道矩阵的前i行之和,和前j列之和(任意i和j都可以).求这个矩阵.每个格子中的元素必须在1~20之间.矩阵大小上限20*20. 思路: 这么也想不到用网络流解决,这个模型很不错.假设这个矩阵 ...

  4. 【转】java枚举类型enum的使用

    原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...

  5. (二)学习CSS之cursor属性

    参考:http://www.w3school.com.cn/tiy/t.asp?f=csse_zindex cursor 属性规定要显示的光标的类型(形状). <html> <bod ...

  6. Ext入门学习系列(五)表格控件(1)

    上节学习了Ext面板控件,为后面的各个控件学习奠定基础,在此基础上本章将学习网络开发最期待的功能——表格控件. 我们都知道网络编程语言中,除了.net其他的基本没有提供网格控件,而最近的asp.net ...

  7. c#中单元测试

    从走进.net后发现每天有写不完的代码,有做不完的测试...人感觉都已经机械,我们需要认清自己调整好心态,问下自己是否真的喜欢编程.我的答案当然也就是我爱编码,编码给我带来了许多欢乐,每天都给我体验小 ...

  8. 《深入Java虚拟机学习笔记》- 第8章 连接模型

    Java虚拟机学习笔记(八)连接模型

  9. SqlServer中截取字符串

    SQL Server 中截取字符串常用的函数: .LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截 ...

  10. Android SDK Manager无法更新的解决办法

    Fetching https://dl-ssl.google.com/android/repository/addons_list-1.xmlFailed to fetch URL https://d ...