今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 如今的手机游戏交互基本上都是通过触摸交互的, 所以大家明确这节的重要性了吧, 本节篇幅比較大, 所以我就不扯闲话了

先来看看经常使用函数:

触摸事件:

addTargeteDelegate( 谁使用, 优先级, 是否拦截触摸消息);
//注冊单点触摸

virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event);
//触摸開始

virtual void ccTouchMoved(CCTouch * touch,CCEvent * event);
//触摸滑动

virtual void ccTouchEnded(CCTouch * touch,CCEvent * event);
//结束触摸

virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);//其它事件中断触摸

触摸事件集合:

virtual void registerWithTouchDispatcher( void);
//注冊多点触摸

addStandardDelegate();
//加入托付

setTouchEnabled( bool);
//开启多点触摸, 貌似使用了这个之后就不能使用单点

virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent); 

virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent); 

virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent); 

virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

我们先来实现触摸事件:

在头文件中面声明我们要重写的函数:

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre">	</span>//触摸開始函数
<span style="white-space:pre"> </span>virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre"> </span>//触摸移动函数
<span style="white-space:pre"> </span>virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);<span style="white-space:pre"> </span>//触摸结束函数

开启单点触摸, 而且创建三个标签用来显示信息:

注意: 一定要开启单点触摸, 不然没有效果

	//开启单点触摸
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate( this, 0, false); //创建三个标签
CCLabelTTF* begin = CCLabelTTF::create( "begin:-->X:0.0, -->Y:0.0", "Arial", 24);
CCLabelTTF* move = CCLabelTTF::create( "move:-->X:0.0, -->Y:0.0", "Arial", 24);
CCLabelTTF* end = CCLabelTTF::create( "end:-->X:0.0, -->Y:0.0", "Arial", 24);
begin->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 + 50));
move->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
end->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2 - 50));
addChild( begin, 0, 101);
addChild( move, 0, 102);
addChild( end, 0, 103);

我们来重写这三个函数:

getLocationInView()取得坐标系是以左上角为原点的哦

我们来看看效果:

看, 我们截取到了触摸事件的消息了吧

好了, 我们再来看看触摸事件集合:

为什么有了触摸事件之后我们还要使用触摸事件集合呢?如今的手机基本都支持多点触控, 而CCTouch不能获取多点触摸的事件, 所以触摸事件集合就应运而生了

我们 还是声明一下须要重写的函数:

virtual void registerWithTouchDispatcher();
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

在init里面开启多点触摸

//开启多点触摸
setTouchEnabled( true);

实现重写的函数:

void HelloWorld::registerWithTouchDispatcher()
{
//注冊多点触摸
CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate( this, 0);
} void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for ( ; iter != pTouches->end(); ++iter)
{
CCTouch* pTouch = (CCTouch*)(*iter);
switch ( pTouch->getID())
{
case 0:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "1", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 101);
}break;
case 1:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "2", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 102);
}break;
case 2:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "3", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 103);
}break;
case 3:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "4", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 104);
}break;
case 4:{
CCLabelTTF* ttf1 = CCLabelTTF::create( "5", "Arial", 24);
ttf1->setPosition( pTouch->getLocation());
addChild( ttf1, 0, 105);
}break;
default:
break;
}
} } void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for ( ; iter != pTouches->end(); ++iter)
{
CCTouch* pTouch = (CCTouch*)(*iter);
switch ( pTouch->getID())
{
case 0:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 101);
ttf->setPosition( pTouch->getLocation());
}break;
case 1:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 102);
ttf->setPosition( pTouch->getLocation());
}break;
case 2:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 103);
ttf->setPosition( pTouch->getLocation());
}break;
case 3:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 104);
ttf->setPosition( pTouch->getLocation());
}break;
case 4:{
CCLabelTTF* ttf = (CCLabelTTF*)this->getChildByTag( 105);
ttf->setPosition( pTouch->getLocation());
}break;
default:
break;
}
}
} void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for ( ; iter != pTouches->end(); ++iter)
{
CCTouch* pTouch = (CCTouch*)(*iter);
switch ( pTouch->getID())
{
case 0:{
removeChildByTag( 101);
}break;
case 1:{
removeChildByTag( 102);
}break;
case 2:{
removeChildByTag( 103);
}break;
case 3:{
removeChildByTag( 104);
}break;
case 4:{
removeChildByTag( 105);
}break;
default:
break;
}
}
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzY0MjQ5NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

看看效果:

额, 电脑上仅仅能显示一个触摸点, 我刚刚在手上測试了一下, 能够同一时候操作多个点的, 我等会上传安装文件,

我们来看看代码:

首先, 我们设置多点触控可用, 而且注冊了它, 这是必须的哦

我们在開始触摸的时候传了两个參数, 第一个參数是个容器, 我们将它取出来, 将begin()取出来作为開始标志, end()取出来作为结束标志, 遍历了这个容器, 在遍历的过程中, 我们取出了每一个对象的ID, 我们全部的触摸点都在这个容器里面, 和数组下标同样, 也是从0開始的, 所以我们取出当ID等于0的时候, 我们就绘制出第一个标签, 我们这里依次取出了5个, 同理, 在移动里面, 我们依据ID改动了他们的位置, 在结束触摸里面, 我们依据标记, 移除了对应的对象

下载安装文件

好了, 今天的就到这里, 希望大家还是多多练习, 有什么疑问就加群: 223856254

cocos2dX 事件之触摸事件和触摸事件集合的更多相关文章

  1. cocos2d-x 详解之 CCLayer(触摸事件)

    CCLayer继承自CCNode,在CCLayer中可以实现单点触摸.多点触摸和重力感应回调3种不同形式的交互.这部分的难点在于,当存在多个层都要去接收触摸时它的响应机制是如何处理的.了解内部的处理机 ...

  2. Android 使用代码主动去调用控件的点击事件(模拟人手去触摸控件)

    使用代码主动去调用控件的点击事件(模拟人手去触摸控件) //View 可以是LinearLayout,Button,TextView View.performClick();

  3. ##DAY4 事件的基本概念、触摸的基本概念、响应者链、手势

    ##DAY4  事件的基本概念.触摸的基本概念.响应者链.手势 #pragma mark ———————事件的基本概念 ——————————— 事件的基本概念: 1)事件是当用户的手指触击屏幕及在屏幕 ...

  4. 移动端触摸(touch)事件

    移动端时代已经到来,作为前端开发的我们没有理由也不应该坐井观天,而是勇敢地跳出心里的那口井,去拥抱蔚蓝的天空.该来的总会来,我们要做的就是接受未知的挑战.正如你所看到的,这是一篇关于移动端触摸事件的文 ...

  5. 2019-11-29-WPF-从触摸消息转触摸事件

    原文:2019-11-29-WPF-从触摸消息转触摸事件 title author date CreateTime categories WPF 从触摸消息转触摸事件 lindexi 2019-11- ...

  6. 移动端触摸、点击事件优化(fastclick源码学习)

    移动端触摸.点击事件优化(fastclick源码学习) 最近在做一些微信移动端的页面,在此记录关于移动端触摸和点击事件的学习优化过程,主要内容围绕fastclick展开.fastclick githu ...

  7. 2019-5-13-WPF-从触摸消息转触摸事件

    title author date CreateTime categories WPF 从触摸消息转触摸事件 lindexi 2019-05-13 09:43:48 +0800 2019-05-12 ...

  8. 【Cocos2dx 3.3 Lua】触屏事件

    cocos2dx 3.x触屏时间分为单点触摸和多点触摸:     单点触摸:(即只有注册的Layer才能接收触摸事件)      多点触摸点单用法(多个Layer获取屏幕事件):           ...

  9. 深入理解DOM事件机制系列第四篇——事件模拟

    × 目录 [1]引入 [2]模拟机制 [3]自定义事件 前面的话 事件是网页中某个特别的瞬间,经常由用户操作或通过其他浏览器功能来触发.但实际上,也可以使用javascript在任意时刻来触发特定的事 ...

  10. 深入理解DOM事件类型系列第一篇——鼠标事件

    × 目录 [1]类型 [2]顺序 [3]坐标位置[4]修改键[5]相关元素[6]鼠标按键[7]滚轮事件[8]移动设备 前面的话 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备.本文 ...

随机推荐

  1. 【转】CentOS上安装 jdk:rpm安装和源码安装

    1.安装 jdk-8u5-linux-x64.rpm 原文链接:http://www.cnblogs.com/xsi640/p/3756995.html 先下载最新的jdk版本 文件名:jdk-8u5 ...

  2. Python 第五篇(下):系统标准模块(shutil、logging、shelve、configparser、subprocess、xml、yaml、自定义模块)

    目录: shutil logging模块 shelve configparser subprocess xml处理 yaml处理 自定义模块 一,系统标准模块: 1.shutil:是一种高层次的文件操 ...

  3. Android 修改屏幕解锁方式

    Android 修改屏幕解锁方式 问题 在手机第一次开机的时候,运行手机激活的APP 在激活APP允许过程中,当用户按电源键的时候,屏幕黑掉,进入锁屏状态 手机默认的锁屏是滑动解锁 用户这个时候再一次 ...

  4. 7款Linux下阅读PDF的阅读器。

    5款Linux下阅读PDF的阅读器.1. Mupdf:link 2. Adobe Reader:link 3. Foxit Reader:link 4.Evince:link 5. Okular:li ...

  5. container_of用法及实现

    container_of 有的情况下,只知道 struct结构中莫个成员的指针,而需要知道整个struct的指针 (如网卡驱动里面,list) struct DDD {         int a; ...

  6. NYOJ10,skiing

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区域必须向下倾斜,并且 ...

  7. CodeFirst 表之间的关联

    多重性关系可以是Optional(一个属性可拥有一个单个实例或没有) Required(一个属性必须拥有一个单个实例) Many很多的(一个属性可以拥有一个集合或一个单个实例). Has方法包括如下几 ...

  8. Android UI 学习 自定义的布局 平滑移动 VelocityTracker()

    /**  * Helper for tracking the velocity of touch events, for implementing  * flinging and other such ...

  9. tcp接收xml数据解析

    避免tcp接收xml数据时加上xml数据长度,根据xml数据特点来解析recv到的xml数据 int nPos1 = 0; int nPos2 = 0; int nTempPos = 0; int n ...

  10. os内存使用管理之linux篇

    os内存使用管理之linux篇 看一下LINUX内存机制是怎么运作的,了解了基础知识,对于理解和操作是有很大帮助的. 抛砖引玉: Linux 优先使用物理内存,当物理内存还有空闲时,linux是不会施 ...