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

  • 相关阅读:
    运算符的方向--好神奇
    a++ 和 ++a ;
    c语言中!和~的区别
    函数的参数,参数为数组
    反射的理解
    ThreadLocal类
    多线程面试题-sleep()和wait()区别
    话题1-关键字
    实现多线程的另一种方式-Callable
    线程池
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7123422.html
Copyright © 2011-2022 走看看