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

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

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

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

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

  不多说,直接上代码

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

  1. //.h
  2. #ifndef Good_PlayGuide_h
  3. #define Good_PlayGuide_h
  4.  
  5. #include "cocos2d.h"
  6.  
  7. using namespace cocos2d;
  8.  
  9. class PlayerGuide:public CCSprite , public CCTargetedTouchDelegate
  10. {
  11. public:
  12. PlayerGuide();
  13. virtual ~PlayerGuide();
  14.  
  15. virtual bool init();
  16. virtual void onEnter();
  17. virtual void onExit();
  18.  
  19. virtual bool ccTouchBegan(CCTouch *touch, CCEvent *event);
  20. virtual void ccTouchMoved(CCTouch *touch, CCEvent *event);
  21. virtual void ccTouchEnded(CCTouch *touch, CCEvent *event);
  22.  
  23. void onSetSpriteAndPosition(float width,float height,CCPoint point);
  24. CCLayerColor *m_layer; // color layer
  25. float m_layerWidth; //layer width
  26. float m_layerHeight; // layer height
  27. CCRenderTexture *m_pTarget; // render texture
  28. };
  29. #endif
  1.  
  1. // cpp
  2. #include <iostream>
  3. #include "PlayerGuide.h"
  4.  
  5. PlayerGuide::PlayerGuide()
  6. {
  7. m_layerWidth = 0.0f;
  8. m_layerHeight = 0.0f;
  9. }
  10.  
  11. PlayerGuide::~PlayerGuide()
  12. {
  13.  
  14. }
  15.  
  16. bool PlayerGuide::init()
  17. {
  18. if (!CCSprite::init()) {
  19. return false;
  20. }
  21.  
  22. return true;
  23. }
  24.  
  25. void PlayerGuide::onEnter()
  26. {
  27. //since v2.0
  28. // CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -201, true);
  29. //当进入这个对象时,设置touch事件的响应权限,menu的响应级别是-128,我们要获取比这个要高的权限,(设置的数值越低,权限越高)
  30. CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, -, true);
  31. CCSprite::onEnter();
  32. }
  33.  
  34. void PlayerGuide::onExit()
  35. {
  36. //since v2.0
  37.    // CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
  38.    //退出时,把touch响应的事件 移除
  39. CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);
  40. CCSprite::onExit();
  41. }
  42. #pragma mark --------------------------setSpriteAndPosition----------------------------
  43.  
  44. /*******************************************************************************
  45. *@param width 设置高亮区域的宽度,height 高亮区域的高度,point 设置layer的position
  46. *
  47. *
  48. *******************************************************************************/
  49.  
  50. void PlayerGuide::onSetSpriteAndPosition(float width,float height, CCPoint point)
  51. {
  52. if (width != && height != ) {
  53. m_layerWidth = width;
  54. m_layerHeight = height;
  55. m_layer = CCLayerColor::layerWithColorWidthHeight(ccc4(0x00, 0x00, 0x00, 0xff), width, height);
  56. m_layer->retain();
  57. ccBlendFunc ccb = {GL_ZERO,GL_ONE_MINUS_SRC_ALPHA};
  58.  
  59. m_layer->setBlendFunc(ccb);
  60. m_layer->setPosition(point);
  61.  
  62. CCSprite *topright = CCSprite::spriteWithFile("yourfile");//自己设置圆角的小图,如果不需要圆角,可以直接把sprite去掉
  63. topright->getTexture()->setAliasTexParameters();
  64. ccBlendFunc cbf = {GL_ONE,GL_ONE_MINUS_DST_ALPHA};
  65. topright->setBlendFunc(cbf);
  66. topright->setPosition(ccp(m_layer->getContentSize().width - topright->getContentSize().width/,m_layer->getContentSize().height - topright->getContentSize().height/));
  67. topright->setOpacity(*0.5);
  68. m_layer->addChild(topright,);
  69.  
  70. CCSprite *topleft = CCSprite::spriteWithFile(IMG_PATH(IMAGE_PLAYERGUIDE_ROUNDED));
  71. topleft->getTexture()->setAliasTexParameters();
  72. ccBlendFunc cbf1 = {GL_ONE,GL_ONE_MINUS_DST_ALPHA};
  73. topleft->setBlendFunc(cbf1);
  74. topleft->setPosition(ccp(topleft->getContentSize().width/,m_layer->getContentSize().height - topleft->getContentSize().height/));
  75. topleft->setOpacity(*0.5);
  76. topleft->setFlipX(true);
  77. m_layer->addChild(topleft,);
  78.  
  79. CCSprite *buttomleft = CCSprite::spriteWithFile(IMG_PATH(IMAGE_PLAYERGUIDE_ROUNDED));
  80. buttomleft->getTexture()->setAliasTexParameters();
  81. ccBlendFunc cbf2 = {GL_ONE,GL_ONE_MINUS_DST_ALPHA};
  82. buttomleft->setBlendFunc(cbf2);
  83. buttomleft->setPosition(ccp(buttomleft->getContentSize().width/,buttomleft->getContentSize().height/));
  84. buttomleft->setOpacity(*0.5);
  85. buttomleft->setFlipX(true);
  86. buttomleft->setFlipY(true);
  87. m_layer->addChild(buttomleft,);
  88.  
  89. CCSprite *buttomright = CCSprite::spriteWithFile(IMG_PATH(IMAGE_PLAYERGUIDE_ROUNDED));
  90. buttomright->getTexture()->setAliasTexParameters();
  91. ccBlendFunc cbf3 = {GL_ONE,GL_ONE_MINUS_DST_ALPHA};
  92. buttomright->setBlendFunc(cbf3);
  93. buttomright->setPosition(ccp(m_layer->getContentSize().width - buttomleft->getContentSize().width/,buttomright->getContentSize().height/));
  94. buttomright->setOpacity(*0.5);
  95. buttomright->setFlipY(true);
  96. m_layer->addChild(buttomright,);
  97. }
  98.  
  99. CCSize s = CCDirector::sharedDirector()->getWinSize();
  100.  
  101. m_pTarget = CCRenderTexture::renderTextureWithWidthAndHeight(s.width, s.height);
  102. ccBlendFunc ccb1 = {GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA};
  103. m_pTarget->getSprite()->setBlendFunc(ccb1);
  104. m_pTarget->clear(0.0f, 0.0f, 0.0f, 0.5f);
  105.  
  106. m_pTarget->setPosition(ccp(s.width/,s.height/));
  107.  
  108. this->addChild(m_pTarget);
  109.  
  110. m_pTarget->begin();
  111. if (width != && height != ) {
  112. m_layer->visit();
  113. }
  114.  
  115. m_pTarget->end();
  116. }
  117.  
  118. bool PlayerGuide::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
  119. {
  120. CCPoint touchpoint = touch->locationInView(touch->view());
  121. touchpoint = CCDirector::sharedDirector()->convertToGL(touchpoint);
  122.  
  123. if (m_layerWidth != && m_layerHeight != ) {
  124. //如果点击高亮区域,则响应下层的区域
  125. CCRect rect = m_layer->boundingBox();
  126. if (CCRect::CCRectContainsPoint(rect, touchpoint)) {
  127. return false;
  128. }
  129.  
  130. return true;
  131. }
  132.  
  133. void PlayerGuide::ccTouchMoved(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
  134. {
  135.  
  136. }
  137.  
  138. void PlayerGuide::ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
  139. {
  140.  
  141. }

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. Vim 配色设置与配色脚本语法

    几个给tag加颜色的插件 https://github.com/octol/vim-cpp-enhanced-highlight:基于tag的c family语法高亮 https://github.c ...

  2. Android 内核初识(1)下载源码需求与教程

    官方文档: http://source.android.com/source/requirements.html  Requirements The Android build is routinel ...

  3. 2013ACM省赛题目

    地址就贴这一个吧 都在附近 当时回来也没做做 一伤心了 二是当时实在太弱了 先补两道DP E题的区间DP dp[i][j]  截止到i位置以字母j为结束的上升序列 正序 逆序各来一遍 再循环一遍保存一 ...

  4. Webapp meta标签解决移动缩放的问题

    webapp开发初期,会碰到在pc端开发好的页面在移动端显示过大的问题,这里需要在html head中加入meta标签来控制缩放 <meta name=" viewport" ...

  5. [swustoj 679] Secret Code

    Secret Code 问题描述 The Sarcophagus itself is locked by a secret numerical code. When somebody wants to ...

  6. OK335xS tmp75 Qt 温度读取

    /******************************************************************* * OK335xS tmp75 Qt 温度读取 * 说明: * ...

  7. 探秘Java虚拟机——内存管理与垃圾回收

    本文主要是基于Sun JDK 1.6 Garbage Collector(作者:毕玄)的整理与总结,原文请读者在网上搜索. 1.Java虚拟机运行时的数据区 2.常用的内存区域调节参数 -Xms:初始 ...

  8. POJ 1258 Agri-Net

    题意:给一个无向图的邻接矩阵,求最小生成树. 解法:Kruskal算法.把边按边权排序,从小到大插入生成树中,如果一个边的两个点都在生成树中则不插入,用并查集维护. 代码: #include<s ...

  9. Visual Studio中的一些较大的文件的作用

    1.sdf 这些是工程中的中间,用于预编译等作用,最终可执行文件是不需要的,默认情况下,删除后重新编译还会生成.如果不需要,在Visual Studio里进入如下设置: 进入"Tools & ...

  10. UESTC 250 windy数(数位DP)

    题意:题意:求区间[A,B]之间的,不含前导0,且相邻两数位之间相差至少为2的正整数有多少个. 分析:dp[i][j]表示,长度为i.以j为结尾的表示的个数,再加一个前导0判断即可 #include ...