Cocos2d-x 3.0final 终结者系列教程11-触摸机制

2023-11-08 04:32

本文主要是介绍Cocos2d-x 3.0final 终结者系列教程11-触摸机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

刚刚打完篮球,快中暑了,大脑不转,转载一部分来源:百度

在cocos2dx 3.0版本中,废弃了以往2.x版本的写法,我们先来看一下Layer.h中的一段代码

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1.     //单点触摸  
  2.     virtual bool onTouchBegan(Touch *touch, Event *unused_event);   
  3.     virtual void onTouchMoved(Touch *touch, Event *unused_event);   
  4.     virtual void onTouchEnded(Touch *touch, Event *unused_event);   
  5.     virtual void onTouchCancelled(Touch *touch, Event *unused_event);  
  6.     //多点触摸  
  7.     virtual void onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event);  
  8.     virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *unused_event);  
  9.     virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *unused_event);  
  10.     virtual void onTouchesCancelled(const std::vector<Touch*>&touches, Event *unused_event);  

单点触摸:(即只有注册的Layer才能接收触摸事件)

 onTouchBegan:     如果返回true:本层的后续Touch事件可以被触发,并阻挡向后层传递

                                 如果返回false,本层的后续Touch事件不能被触发,并向后传递,也就是不会调用onTouchMoved

简单点来说,如果

1.Layer 只有一层的情况:

virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
a.返回false,则ccTouchMoved(),ccTouchEnded()不会再接收到消息
b.返回true,则ccTouchMoved(),ccTouchEnded()可以接收到消息
2.Layer 有多层的情况:
virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
a.返回false,则本层的onTouchMoved(),onTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息
b.返回true,则本层的onTouchMoved(),onTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息

单点触摸简单用法:

在Layer中添加如下代码,重写onTouchxxx函数

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.        auto dispatcher = Director::getInstance()->getEventDispatcher();  
  2. auto listener = EventListenerTouchOneByOne::create();  
  3. listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan,this);  
  4. listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved,this);  
  5. listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded,this);  
  6. listener->setSwallowTouches(true);//不向下传递触摸  
  7. dispatcher->addEventListenerWithSceneGraphPriority(listener,this);  

 listener->setSwallowTouches(true),不向下触摸,简单点来说,比如有两个sprite ,A 和 B,A在上B在下(位置重叠),触摸A的时候,B不会受到影响

  listener->setSwallowTouches(false)反之,向下传递触摸,触摸A也等于触摸了B

多点触摸点单用法(多个Layer获取屏幕事件):

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.        auto dispatcher = Director::getInstance()->getEventDispatcher();  
  2. auto listener1 = EventListenerTouchAllAtOnce::create();  
  3. listener1->onTouchesBegan = CC_CALLBACK_2(GameLayer::onTouchesBegan,this);  
  4. listener1->onTouchesMoved = CC_CALLBACK_2(GameLayer::onTouchesMoved,this);  
  5. listener1->onTouchesEnded = CC_CALLBACK_2(GameLayer::onTouchesEnded,this);  
  6. dispatcher->addEventListenerWithSceneGraphPriority(listener1,this);  
或者setTouchEnabled(true),然后重写layer的onTouchsxxx函数

关于eventDispatcher:

  • 获取方法:

  • [cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
    1. auto dispatcher = Director::getInstance()->getEventDispatcher();  

事件监听器包含以下几种:

  • 触摸事件 (EventListenerTouch)
  • 键盘响应事件 (EventListenerKeyboard)
  • 加速记录事件 (EventListenerAcceleration)
  • 鼠标响应事件 (EventListenerMouse)
  • 自定义事件 (EventListenerCustom)

    以上事件监听器统一由 _eventDispatcher 来进行管理。

优先权:
1.优先级越低,越先响应事件
2.如果优先级相同,则上层的(z轴)先接收触摸事件

有两种方式将 事件监听器 listener1 添加到 事件调度器_eventDispatcher 中:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)  
  2.     void EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority)  

代码展开一下:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)  
  2. {  
  3.     CCASSERT(listener && node, "Invalid parameters.");  
  4.     CCASSERT(!listener->isRegistered(), "The listener has been registered.");  
  5.       
  6.     if (!listener->checkAvailable())  
  7.         return;  
  8.       
  9.     listener->setSceneGraphPriority(node);  
  10.     listener->setFixedPriority(0);  
  11.     listener->setRegistered(true);  
  12.       
  13.     addEventListener(listener);  
  14. }  

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority)  
  2. {  
  3.     CCASSERT(listener, "Invalid parameters.");  
  4.     CCASSERT(!listener->isRegistered(), "The listener has been registered.");  
  5.     CCASSERT(fixedPriority != 0, "0 priority is forbidden for fixed priority since it's used for scene graph based priority.");  
  6.       
  7.     if (!listener->checkAvailable())  
  8.         return;  
  9.       
  10.     listener->setSceneGraphPriority(nullptr);  
  11.     listener->setFixedPriority(fixedPriority);  
  12.     listener->setRegistered(true);  
  13.     listener->setPaused(false);  
  14.   
  15.     addEventListener(listener);  
  16. }  


(1)addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的。

(2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。

移除方法:
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. dispatcher->removeEventListener(listener);  

其实还可以这么用:

    //1加入用户触摸事件侦听

    auto listener=EventListenerTouchOneByOne::create();

    listener->setSwallowTouches(true);

    listener->onTouchBegan=[&](Touch * t,Event * e){

        //改变贪食蛇移动的方向

        int col=t->getLocation().x/32;

        int row=t->getLocation().y/32;

        int spHeadCol=spHead->getPositionX()/32;

        int spHeadRow=spHead->getPositionY()/32;

        if(abs(spHeadCol-col)>abs(spHeadRow-row))

        {

           if(spHeadCol<col)

            {

            spHead->m_dir=ENUM_DIR::DIR_RIGHT;

            }else

            {

                spHead->m_dir=ENUM_DIR::DIR_LEFT;

            }

        }

        else

            {if(spHeadRow<row)

                {

                spHead->m_dir=ENUM_DIR::DIR_UP;

                }else

                    {

                    spHead->m_dir=ENUM_DIR::DIR_DOWN;

                    }     

        }

        return true;

    }; //这条语句像不像Java中的匿名接口对象,像不像Objective-C中Block ,他有个很华丽的名字 lambda,读音为:腊母达,相信未来你会喜欢上这妹子的

//3注册这个侦听到消息分发器中   

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

   


这篇关于Cocos2d-x 3.0final 终结者系列教程11-触摸机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/367882

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0