Cocos2d-x 3.2新手指导框GuideLayer 实现

实现思路:

我们可以用Cocos2d-x提供给我们的LayerColor,在你想要被点击的区域周围添加4块LayerColor

如下图所示:

代码实现:

GuideLayer.h

 1 #ifndef __GUIDELAYER_H__
 2 #define __GUIDELAYER_H__
 3
 4
 5 /******************************************
 6  *
 7  * 在很多的游戏里(特别是RPG游戏),一开始都会有一个关于操作的介绍的。
 8  * 除了系统希望你所点击的区域外,其余区域都会变暗,而且你点暗的区域是不会有任何反应的。
 9  *
10  * 我们可以用Cocos2d-x提供给我们的LayerColor,在你想要被点击的区域周围添加4块LayerColor
11  *
12  *
13  * 如图所示
14  *
15  *        区域1
16  * 区            区
17  * 域            域
18  * 3            4
19  *        区域2
20  *
21  *
22 *******************************************/
23
24 #include "cocos2d.h"
25
26 USING_NS_CC;
27
28 class GuideLayer :public Layer{
29
30 public:
31     // 构造 析构
32     GuideLayer();
33     ~GuideLayer();
34
35     // 用于创建一个指导层,参数:可触控区域
36     static GuideLayer* create(const Rect& rect);
37
38     // 用于创建一个指导层,参数:可触控区域,不可触控区域的颜色
39     static GuideLayer* create(const Rect& rect, const Color4B& color);
40
41     // 初始化
42     bool init(const Rect& rect);
43     bool init(const Rect& rect, const Color4B& color);
44
45     // 触摸函数调用
46     virtual bool onTouchBegan(Touch *touch, Event *unused_event);
47
48 private:
49     // 不可触摸的 4 个区域的颜色
50     LayerColor* _area1;
51     LayerColor* _area2;
52     LayerColor* _area3;
53     LayerColor* _area4;
54
55     // 默认的颜色( 黑色,透明度为 25% )
56     Color4B defaultColor;
57
58     Rect _rect;
59
60     EventListenerTouchOneByOne *_listener;
61
62 };
63
64
65 #endif    // __GUIDELAYER_H__

GuideLayer.cpp

  1 #include "GuideLayer.h"
  2
  3 GuideLayer::GuideLayer() :
  4   defaultColor(0, 0, 0, 0.25 * 255){
  5
  6 }
  7
  8 GuideLayer::~GuideLayer(){
  9
 10 }
 11
 12 GuideLayer* GuideLayer::create(const Rect& rect){
 13
 14     GuideLayer *ret = new GuideLayer();
 15     if (ret && ret->init(rect)){
 16         ret->autorelease();
 17         return ret;
 18     }
 19     CC_SAFE_DELETE(ret);
 20     return nullptr;
 21 }
 22
 23 GuideLayer* GuideLayer::create(const Rect& rect, const Color4B& color){
 24
 25     GuideLayer *ret = new GuideLayer();
 26     if (ret && ret->init(rect, color)){
 27         ret->autorelease();
 28         return ret;
 29     }
 30     CC_SAFE_DELETE(ret);
 31     return nullptr;
 32 }
 33
 34 bool GuideLayer::init(const Rect& rect){
 35
 36     if (!Layer::init())
 37         return false;
 38     _rect = rect;    // 将传进来的 rect 赋值给 _rect 成员变量
 39     // 获取屏幕的可视区域的大小
 40     Size visibleSize = Director::getInstance()->getVisibleSize();
 41     // 为区域 1、2、3、4 设置颜色 参数:颜色,宽度,高度
 42     // 设置锚点,设置位置
 43     _area1 = LayerColor::create(defaultColor, visibleSize.width, visibleSize.height - rect.getMaxY());
 44     _area1->setAnchorPoint(Vec2(0, 0));
 45     _area1->setPosition(Vec2(0, rect.getMaxY()));
 46     this->addChild(_area1);
 47
 48     _area2 = LayerColor::create(defaultColor, visibleSize.width, rect.getMinY());
 49     _area2->setAnchorPoint(Vec2(0, 0));
 50     _area2->setPosition(Vec2(0, 0));
 51     this->addChild(_area2);
 52
 53     _area3 = LayerColor::create(defaultColor, rect.getMinX(), rect.getMaxY() - rect.getMinY());
 54     _area3->setAnchorPoint(Vec2(0, 0));
 55     _area3->setPosition(Vec2(0, rect.getMinY()));
 56     this->addChild(_area3);
 57
 58     _area4 = LayerColor::create(defaultColor, visibleSize.width - rect.getMinX(), rect.getMaxY() - rect.getMinY());
 59     _area4->setAnchorPoint(Vec2(0, 0));
 60     _area4->setPosition(Vec2(rect.getMaxX(), rect.getMinY()));
 61     this->addChild(_area4);
 62
 63     // 设置监听器,截断非 rect 外区域的触摸事件
 64     _listener = EventListenerTouchOneByOne::create();
 65     _listener->onTouchBegan = CC_CALLBACK_2(GuideLayer::onTouchBegan, this);
 66     Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(_listener, this);
 67
 68     return true;
 69 }
 70
 71 bool GuideLayer::init(const Rect& rect, const Color4B& color){
 72
 73     Color4B color4b = defaultColor;
 74     defaultColor = color;
 75     // 调用默认的 init() 方法
 76     if (init(rect)){
 77         defaultColor = color4b;
 78         return true;
 79     }
 80     else{
 81         return false;
 82     }
 83 }
 84
 85 bool GuideLayer::onTouchBegan(Touch *touch, Event *unused_event){
 86
 87     // 就是先检测触摸点是否在里亮的区域,
 88     // 如果不是,则阻断触摸点的向下传递,
 89     // 如果是,则允许触摸点向下传递。
 90
 91     //Vec2 touchLocation = touch->getLocation();
 92     Vec2 touchPoint = Director::getInstance()->convertToGL(touch->getLocationInView());
 93     _listener->setSwallowTouches(false);   // 设置向下传递触摸事件,true 表示不向下传递
 94     if (_rect.containsPoint(touchPoint)){
 95         log("(x,y) <===>  (%f,%f)", touchPoint.x, touchPoint.y);
 96         return false;
 97     }
 98     else{
 99         _listener->setSwallowTouches(true);    // 设置不向下传递触摸事件
100         return true;
101     }
102 }

在HelloWorldScene.cpp中的

bool HelloWorld::init(){

  …………

// 添加新手指引界面

//Rect rect = Rect(200, 200, 250, 250);
    Size spriteHW = sprite->getContentSize();
    Rect rectspriteHw = Rect(sprite->getPositionX() - spriteHW.width / 2, sprite->getPositionY() - spriteHW.height / 2, sprite->getPositionX() - 200,                          sprite->getPositionY() - 200);
    //Rect rectspriteHw = Rect(0, 0, sprite->getPositionX(), sprite->getPositionY());
    //Layer *sc = GuideLayer::create(rectspriteHw,Color4B(255,255,255,100));
    Layer *sc = GuideLayer::create(rectspriteHw);
    //sc->setPosition(100, 100);
    this->addChild(sc);

}

结果图:

时间: 2024-08-28 03:44:45

Cocos2d-x 3.2新手指导框GuideLayer 实现的相关文章

as3 页游中,新手指导中,屏蔽所有交互对象,但除了指定交互对象可用的方法【转http://blog.csdn.net/linjf520/article/details/9450945】

package { import flash.display.InteractiveObject; import flash.display.Stage; import flash.events.MouseEvent; /** * 新手指导管理器 * @author jave.lin * @date 2013-7-24 */ public class GuideManager{ private static var stage:Stage; /**设置舞台*/ public static fun

ClippingNode做游戏的新手指导

auto stencil=Sprite::create("arrow.png"); stencil->setPosition(btn_right->getPosition()); btn_right = Button::create("arrow.png"); 游戏开发中,很多游戏都会出现新手指导,让玩家熟悉游戏的操作流程. 那做为苦逼的我们,如何实现新手指导?(虽然很苦逼,有时却很快乐-) (1)背景置灰.图标高亮 (2)屏蔽其他图标的点击事件 1.

Cocos2d 官网介绍,新手必看!!!!!!!!!!!!!!!!!!!!!!!!!

1.之前一直没仔细看cocos2d官网,后来发现很坑 http://cocos2d-x.org/   官网分成英文,中文,还有日本语,建议大家用英语. 我之前给大家做教程,发现下载的一些东西你在中文网站是找不到的. 我们进入这个网站默认是英文的. 2.我们下一步点击Download       我给大家详细介绍一下这些都是什么东西.     ---DOWNLOAD V3.10这是目前官网上最新的框架里面包含了 lua javascript   c++ ---Html5 lite version 

新手指导:教你如何查看识别hadoop是32位还是64位

问题导读: 1.从哪些地方可以识别hadoop是32位还是64位?2.hadoop本地库在什么位置? 来源:about云 本文链接:http://www.aboutyun.com/thread-12796-1-1.html hadoop在安装的时候,我们需要知道hadoop版本是32位还是64位. hadoop官网本来提供的都是32位,因为我们大部分都是64位,所以不得不编译.后来官网从hadoop2.5版本开始就提供了64位.为了防止我们用错,下面我们来实际操作和观察. 我们来从官网下载的ha

新手指导插件.配合jquery使用

/*! * by zhangxinxu(.com) 2017-05-18 * 新版上线时候的黑色半透明镂空遮罩指引效果实现jQuery小插件 * 兼容到IE8+ * MIT使用协议,使用时候保留版权 * 参考:http://www.zhangxinxu.com/wordpress/?p=6171 */ $.guide = function (options) { var defaults = { beforeFunc:function(a){a();},//执行向导前要处理的函数 clickFu

[新手指导]Ubuntu12.04.02 root 用户登录设置

Ubuntu12.04.02 root 用户登录设置Ubuntu12.04.02 默认是不允许 root 登录的, 在登录窗口只能看到普通用户和访客登录. 以普通身份登陆 Ubuntu 后我们需要做一些修改. 步骤 1 : 普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端窗口里面输入命令后回车 : $sudo -s 步骤 2 : 然后输入安装 Ubuntu12.04.02 时设置的系统密码,即可进入 root 用户权限模式. 步骤 3 : 在终端窗口中执行 $gedit /etc/

cocos2d programming guide 翻译 引导页(完结)

http://bbs.tairan.com/article-25-1.html Cocos2d官方入门指导 原文地址:http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:index翻译:sile(泰然翻译组)sile:在子龙的鼓励下翻译了这个系列的文章,也算是为自己和初学者提供一个方便学习的机会,自己一直是搞acm的,第一次接触项目之类的文章,翻译不好的地方还希望大家指出,我好改正,谢谢大家了,因为没有网盘,所以就直接发布出来吧,明天应该

openstack学习线路指导

首先我们想学习openstack,那么openstack是什么?能干什么?涉及的初衷是什么?由什么来组成?刚接触openstack,说openstack不是一个软件,而是由多个组件进行组合,这是一个更深层次的理解,当我们看到dashboard的时候,我们或许对openstack感觉有一点感性认识了.dashboard可以理解为openstack与用户交流的一个窗口,而dashboard对于真正的使用者来讲,它的功能上面有一定的局限性.而对于初学者通过它,可能会对openstack有一定的了解.o

如何优化cocos2d程序的内存使用和程序大小

在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个非常有意义的话题:"请简单地讲述你认为新手cocos2d程序员在他开始编码之前,最应该先知道,或者应该关注和注意的事项."这个问题的答案很多,有人讲是"如何加载和保存游戏数据",有人讲的是"如何实现有限状态机"等等.而最吸引我的则是,有一