cocos2dx事件addEventListenerWithSceneGraphPriority方法-程序员宅基地

技术标签: cocos2d-x  cocos2dx  addEventListenerWith  回顾学习资料  eventDispatcher  

在官方文档中,node对象有一个_eventDispatcher成员变量,所以继承node的对象也有这个变量。

当我们需要去层等没有集成点击事件的节点监听点击事件时,需要这样,实例代码:

listener->onTouchBegan = [=](Touch* touch, Event* event){
    
    Vec2 locationInNode = this->convertToNodeSpace(touch->getLocation());
    Size s = this->getContentSize();
    Rect rect = Rect(0, 0, s.width, s.height);
    
    if (rect.containsPoint(locationInNode))
    {
        this->setColor(Color3B::RED);
        return true;
    }
    return false;
};

listener->onTouchEnded = [=](Touch* touch, Event* event){
    this->setColor(Color3B::WHITE);
    
    if (_removeListenerOnTouchEnded)
    {
        _eventDispatcher->removeEventListener(listener);
    }
};

if (_fixedPriority != 0)
{
    _eventDispatcher->addEventListenerWithFixedPriority(listener, _fixedPriority);
}
else
{
    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
}

作为初学者,我刚看到这样的代码有点不懂,两个添加事件监听的方法,即:

addEventListenerWithFixedPriority和addEventListenerWithSceneGraphPriority。

于是官网上学习,发现后者可以实现当节点销毁时,同时销毁添加的事件监听。

前者官网上有相应的解释,但是不没有理解。后来学习了官网实例,才了解了addEventListenerWithFixedPriority的作用。所以学习还是要理论和实践相结合。

对于addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority),需要传两个参数,一个是需要监听的事件,另一个是监听的事件等级,等级越小,事件越靠前


这个是官方示例,当我点击黄色和红色区域时,先收到点击事件的是红色图片。如下图:


因为给上面各个图片的点击事件中,蓝色的fixedPriority为30, 红色的fixedPriority为35,黄色的fixedPriority为40,所以,如果点击蓝色和红色的共同区域,先收到事件的是蓝色;点击红色和黄色的共同区域,先收到事件的是红色。

下面是实例代码:

// FixedPriorityChangedTest

class TouchableSprite : public Sprite
{
public:
    static TouchableSprite* create(int priority = 0)
    {
        auto ret = new (std::nothrow) TouchableSprite(priority);
        if (ret && ret->init())
        {
            ret->autorelease();
        }
        else
        {
            CC_SAFE_DELETE(ret);
        }
        return ret;
    }

protected:
    TouchableSprite(int priority)
    : _listener(nullptr)
    , _fixedPriority(priority)
    , _removeListenerOnTouchEnded(false)
    {
    }
    
public:
    void onEnter() override
    {
        Sprite::onEnter();
        
        auto listener = EventListenerTouchOneByOne::create();
        listener->setSwallowTouches(true);
        
        listener->onTouchBegan = [=](Touch* touch, Event* event){
            
            Vec2 locationInNode = this->convertToNodeSpace(touch->getLocation());
            Size s = this->getContentSize();
            Rect rect = Rect(0, 0, s.width, s.height);
            
            if (rect.containsPoint(locationInNode))
            {
                this->setColor(Color3B::RED);
                return true;
            }
            return false;
        };
        
        listener->onTouchEnded = [=](Touch* touch, Event* event){
            this->setColor(Color3B::WHITE);
            
            if (_removeListenerOnTouchEnded)
            {
                _eventDispatcher->removeEventListener(listener);
            }
        };
        
        if (_fixedPriority != 0)
        {
            _eventDispatcher->addEventListenerWithFixedPriority(listener, _fixedPriority);
        }
        else
        {
            _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
        }

        _listener = listener;
    }
    
    void onExit() override
    {
        _eventDispatcher->removeEventListener(_listener);
        
        Sprite::onExit();
    }

    void removeListenerOnTouchEnded(bool toRemove) { _removeListenerOnTouchEnded = toRemove; };
    
    inline EventListener* getListener() { return _listener; };
    
private:
    EventListener* _listener;
    int _fixedPriority;
    bool _removeListenerOnTouchEnded;
};

void FixedPriorityTest::onEnter()
{
    EventDispatcherTestDemo::onEnter();
    
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
    Size size = Director::getInstance()->getVisibleSize();
    
    auto sprite1 = TouchableSprite::create(30);
    sprite1->setTexture("Images/CyanSquare.png");
    sprite1->setPosition(origin+Vec2(size.width/2, size.height/2) + Vec2(-80, 40));
    addChild(sprite1, 10);
    
    auto sprite2 = TouchableSprite::create(35);
    sprite2->setTexture("Images/MagentaSquare.png");
    sprite2->setPosition(origin+Vec2(size.width/2, size.height/2));
    addChild(sprite2, 20);
    
    auto sprite3 = TouchableSprite::create(40);
    sprite3->setTexture("Images/YellowSquare.png");
    sprite3->setPosition(Vec2(0, 0));
    sprite2->addChild(sprite3, 1);

}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013654125/article/details/78630789

智能推荐

X-Anylabeling: 一款多SOTA深度学习模型集成的新一代自动标注工具-程序员宅基地

文章浏览阅读4k次,点赞8次,收藏42次。是一款全新的交互式自动标注工具,其基于进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助和YOLO等主流模型提供强大的 AI 支持。无须任何复杂配置,下载即用,支持自定义模型,极大提升用户标注效率!本文主要为大家介绍一款新颖实用的基于交互式的全自动标注工具——,更多功能和特性可直接下载体验!源码链接:https://github.com/CVHub520/X-AnyLabeling视频教程:https://www.bilibili.com/video/BV1AV4y1U7h3/?_x-anylabeling

在控制台应用程序下,创建窗口,避开WinMain函数入口-程序员宅基地

文章浏览阅读202次。---恢复内容开始--- 一直以来,采用C语言方式的Windows编程的时候,程序的入口必须是WinMain()函数,当开始学习MFC的时候,又觉的MFC的框架结构繁冗混乱,萌生了自己写一个窗口类编写Windows程序,同时想和C#一样避开WinMain的启动函数,所以在网上搜寻并总结了这样一篇文章,作为笔记和大家一起学习。稍后如果我有精力的话,我会自己慢慢的封装一些窗口类,简化Wi..._win注册窗体一定要从winmain进入吗

C/C++学习笔记丨用C++语言编写贪吃蛇!_c++编写贪吃蛇所用的知识-程序员宅基地

文章浏览阅读312次。游戏描述如下:1.贪吃蛇可以自动直线前进,或者玩家可以通过方向键操纵贪吃蛇上下左右前进,每次前进一格。2.贪吃蛇在规定的区域内活动,当: ①贪吃蛇触碰到墙壁时; ②贪吃蛇的蛇头触碰到蛇身或者蛇尾时; ③玩家的键盘输入不是方向键时; 命令行显示“Game Over!”并且退出游戏。3.贪吃蛇活动的区域内每次随机产生一颗“豆豆”,当贪吃蛇吃到“豆豆”后蛇身增长一格,自动前进时间缩 短100ms(默认是1000ms,且不能少于100ms)。贪吃蛇长度每为8的倍数I..._c++编写贪吃蛇所用的知识

MapReduce论文中文版-程序员宅基地

文章浏览阅读6.3k次。摘要MapReduce是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。用户首先创建一个Map函数处理一个基于 key/value pair的数据集合,输出中间的基于key/value pair的数据集合;然后再创建一个Reduce函数用来合并所有的具有相同中间key值的中间value值。现实世界中有很多满足上述处理模型的例子, 本论文将详细描述这个模型。MapRe_mapreduce论文中文

win10 mfc100u.dll丢失的解决方法_mfc100u dll下载-程序员宅基地

文章浏览阅读1.5k次。转载这位博主_mfc100u dll下载

制作树苺派/香橙派(orangepi) SD卡备份镜像_树苺派系统备份与还原_orange pi 香橙派emmc系统备份方法-程序员宅基地

文章浏览阅读6.7k次,点赞6次,收藏40次。操作扯扯淡新的改变准备工具正式开干1、将sd卡装入读卡器,然后插上电脑,挂载到ubuntu2、备份SD卡镜像还原方法一:方法二:总结扯扯淡前面一直是做linux运维以及python相关的知识,前段时间无意间拿到手一块orangepi,即香橙派,一直没有在意,近来有点空就拿出来捣鼓一下。树莓派、香橙派、香蕉派这些以水果称呼的嵌入式开发板让人听起来有种不一样的味道,但是许多人对于树莓派与香蕉派很容..._orange pi 香橙派emmc系统备份方法

随便推点

Java+springboot+Mysql大学生综合素质测评系统51615-计算机毕业设计(可赠源码)-程序员宅基地

文章浏览阅读43次。本系统使用Java技术开发,SpringBoot框架,采用的数据库是Mysql。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。本文从实践经验出发,阐述目前高校学生工作管理的信息化现状﹔然后提出大学生综合素质测评管理系统的必要性以及系统设计的必要性、目标和意义﹔最后﹔介绍了对大学生综合素质测评管理系统的研究和设计实现,以对提高高校学生管理工作起到一定的促进作用。

掘根宝典之c++内联函数(看这篇就够了)-程序员宅基地

文章浏览阅读586次,点赞14次,收藏11次。我们引入inline这个关键字以 inline 修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。下面举个例子inline void A(int a)//前面加了个inlineint main()int w=99;A(w);//A(w)直接展开为{a=99;函数A()就是一个内联函数。

【雕爷学编程】Arduino智慧校园之基于RFID卡片的门禁系统_arduino 读卡器-程序员宅基地

文章浏览阅读806次,点赞17次,收藏24次。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。它们可能有错误、不适用或者无法编译。门禁系统中使用的RFID卡片具有唯一的标识号码,可以与门禁设备进行通信,实现人员的身份验证和门禁控制。这意味着用户可以自由地访问和修改Arduino的设计和代码,以满足校园的特定需求,并且能够与其他开源硬件和软件兼容。5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。_arduino 读卡器

mybatis 使用for update,对数据进行行级锁定_mybatis for update-程序员宅基地

文章浏览阅读4.6w次,点赞5次,收藏44次。for upate使用场景在Spring Date JPA之 for update中已经介绍过了,想要了解,可以看博客:https://blog.csdn.net/zc_ad/article/details/83578487,在这边会介绍一下在mybatis中的使用场景。使用了mybatis-plus,前面有些过基础教程,地址:https://blog.csdn.net/zc_ad/article..._mybatis for update

C语言函数的定义、声明、分类以及调用(一)_c语言函数声明-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏7次。多维数组名也可以作为函数实参,此时被调用函数中形参数组可以指定每一维的大小,也可省略第一维的大小,但第二维的大小不能省略,而且要和实参数组第二维的大小相同。1、使用数组元素作为实参,在循环语句控制下将数组元素a[i]的值传递给形参x,并将其值减32后保存数数组元素b[i]中,调用函数时,形参x的值发生了改变,而实参a[i]的值并没有发生变化。由于数组名表示数组的首地址,因此实参向形参传递的不是数组的值,而是实参的首地址,这样的形参数组和实参数组共占用相同的内存单元。1、函数的定义、声明、分类以及调用。_c语言函数声明

python爬取表情包图片_res=requests.get(img[i][1]) with open('images/'+ti-程序员宅基地

文章浏览阅读487次。上次写了爬取笔趣阁小说,这次来爬点常用的表情包图片。_res=requests.get(img[i][1]) with open('images/'+title[i]+'.jpg','wb') as f:

推荐文章

热门文章

相关标签