zoukankan      html  css  js  c++  java
  • 【cocos2dx 小技巧】半透明屏蔽罩和弹出框的实现

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

    主要代码:

    //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, 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

  • 相关阅读:
    两小时后执行打开浏览器的操作
    Markdown语法
    Python机器学习2.2
    身份证姓名与身份证号校验
    根据银行卡号获取开户行
    生成微信小程序二维码
    .net 生成二维码
    微信支付API V3(.Net Core)
    .net 生成项目xml描述文件
    汉字排序问题
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7123422.html
Copyright © 2011-2022 走看看