加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【cocos2dx 小技巧】半透明屏蔽罩和弹出框的实现

发布时间:2020-12-14 19:49:33 所属栏目:百科 来源:网络整理
导读:今天介绍一下,弹出框的和屏蔽罩的小实现~ 弹出框主要用到了cocos2dx生命周期里面的OnEnter()函数,就是当Layer被addChild的时候会调用的函数(所以如果把OnEnter的代码加到init里面效果应该也是一样的~) 屏蔽罩的实现是用了MenuItemImage和LayerColor,前者可

今天介绍一下,弹出框的和屏蔽罩的小实现~
弹出框主要用到了cocos2dx生命周期里面的OnEnter()函数,就是当Layer被addChild的时候会调用的函数(所以如果把OnEnter的代码加到init里面效果应该也是一样的~)
屏蔽罩的实现是用了MenuItemImage和LayerColor,前者可以设置区域大小并获取点击,后者则可以设置Color4B。 效果图如下:

主要代码:

//ShaderLayer.h
void setClickBgBlock(std::function<void()> block);
std::function<void()> clickBGBlock;     
//ShaderLayer.cpp
auto item = MenuItemImage::create();
item -> setContentSize(visibleSize);
item -> setCallback([&](Ref *pSender){
    //背景图点击时候执行
    if (clickBGBlock != NULL) {
        this -> clickBGBlock();
    }
});

如果对ios中的block不熟悉的话,就搜一下lambda 吧(我觉得就是个匿名函数指针)。然后当MenuItemImage被点击时,就调用clickBGBlock()函数;

//HelloWorldScene.cpp
//屏蔽在popUp上的触摸
auto listener = EventListenerTouchOneByOne::create();
listener -> setSwallowTouches(true);
listener -> onTouchBegan = [](Touch *touch,Event *event){
    auto target = static_cast<Sprite *>(event -> getCurrentTarget());
    Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
    Size s = target->getContentSize();
    Rect rect = Rect(0,s.width,s.height);
    if(rect.containsPoint(locationInNode)){
        //这里return true swallowTouches才有效
        return true;
    }
    return false;
};

这一段代码,是通用的,只要在最后面再加一句addEventListenerWithSceneGraphPriority就可以监听触摸控制,(你监听的target的ContentSize内)。

(我总觉得应该还有更简单的方法可以实现这样的功能,如果你知道,请第一时间告知我一声~)
附上代码+图片:http://7sblre.com1.z0.glb.clouddn.com/PopUpAndShaderLayer.zip

欢迎访问我的博客:helkyle.tk

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读