我们经常须要推断用户的点击操作是否落于某个sprite之上,进而让这个sprite做出响应。

可是假设我们通过继承CCSprite类来实现自己的Sprite类的时候,产生的视图尺寸会充满屏幕。多个Sprite在同一层的时候会发生重叠,导致我们通过回调函数传递进的touch点是相对于最上层Sprite来说的。

好在我们能够通过CCDirector::sharedDirector()->convertToGL(CCTouch* touch->locationInView());的方法来获得touch point的绝对坐标。

然后通过遍历屏幕上全部的sprite,依次检查落点来推断用户点击应该被哪个Sprite接受。

但事实上Cocos2d-x已经为我们提供了一个很方便的方法来推断用户点击了哪个Sprite。

假如在这里我们有一个MySprite继承了CCSprite,同一时候为了响应点击事件,我们还须要继承CCTargetedTouchDelegate。
后者这个类为我们提供了三个virtual的回调函数:

virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMove(CCTouch* touch, CCEvent* event);
virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);

这三个函数分别在用户“点击”。“点击拖动”,“抬起手指”的时候被调用。

当中ccTouchBegan函数的返回值是bool类型,其原因就是系统会依据该回调函数的返回值来推断点击消息是否已经传递给用户须要的Sprite。

详细点儿:假设该回调函数返回true,说明程序猿已经觉得须要接受到这个触摸消息的Sprite已经接收到了这个触摸消息。那么程序的触摸消息传递就会到此为止,仅仅在本层被使用(也会被本层的ccTouchMove,ccTouchEnded所使用)。假设返回false,说明这个触摸消息并没有传递到须要接受这个消息的Sprite中去。这时系统会将这个触摸消息传递到下一层Sprite。而且由这一层的ccTouchBegan来处理这个消息。

贴个演示样例代码:

bool MySprite::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){
if(containsTouchLocation(touch)){
cout<<"Touch:"<<this->getTag()<<endl;
return true;
}
return false;
}

当中containsTouchLocation是用户自己实现的:通过在该函数中获取position,并与传递进函数的touch作比較,推断用户的触摸操作是否落于该sprite区域之内。

假设落在该区域,则返回true。中断这个消息链。同一时候这个sprite会对应对应的ccTouchMove,ccTouchEnded
假设没有落在该区域,则返回false。而且将这个消息传递给下一层的sprite。

cocos2d-x推断sprite点击的更多相关文章

  1. Cocos2d 中的Sprite大小调整问题

    以前用UIImageView,比如  UIImageView *view = [[UIImageViewalloc] initWithImage:[UIImageimageNamed:@"b ...

  2. Unity2D 之 Sprite点击事件

    以下方法纯属我YY,切勿当真!!! 给 Sprite添加点击事件步骤: 1. 创建一个 Sprite 2. 给Sprite添加一个 Box Collider 2D 3. 将如果脚本放到Sprite上: ...

  3. cocos2d JS touch屏幕点击事件监听 cc.EventListener.TOUCH

    var self = this; this.touchListener = cc.EventListener.create({ event: cc.EventListener.TOUCH_ONE_BY ...

  4. Python游戏引擎开发(五):Sprite精灵类和鼠标事件

    本次来实现Sprite类和鼠标事件. 说起这个Sprite啊,涉及过2D游戏研究领域的看官应该都听说过它. 它中文原意是"精灵",只是在不同人的眼中,它所表示的意义不同. 比方说在 ...

  5. Sprite Kit 入门教程

    Sprite Kit 入门教程  Ray Wenderlich on September 30, 2013 Tweet 这篇文章还可以在这里找到 英语, 日语 If you're new here, ...

  6. cocos2dx 3.x 精灵重叠时点击最上层的精灵

    ps. 这个方法只适用设置精灵的触摸.. //注册触摸事件..3.X后可以在这样写..不需要重新声明 EventListenerTouchOneByOne *listener = EventListe ...

  7. ios游戏开发 Sprite Kit教程:初学者 1

    注:本文译自Sprite Kit Tutorial for Beginners 目录 Sprite Kit的优点和缺点 Sprite Kit vs Cocos2D-iPhone vs Cocos2D- ...

  8. Sprite Kit教程:初学者

    作者:Ray Wenderlich 原文出处:点击打开链接 http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners 转自 ...

  9. Cocos2d学习之路三(使用Zwoptex创建精灵表单和CCAnimate动画)

    创建精灵表单: 创建动画先要把图片整合到一个图片上然后生成plist文件: 方法下载Zwoptex软件:http://www.zwopple.com/zwoptex/ 然后打开选择 create ne ...

随机推荐

  1. 基本数据类型 list and tuple 04

    列表和元组 一,列表 1.列表 由[]括起来 可以存放各种数据类型:  存放量比较大 2.列表的索引和切片  列表也有索引 lst [i] i 即列表中各元素的位置 2.1列表的切片 lst[star ...

  2. /etc目录下重要的目录和文件

    牢记: 1.*/etc/sysconfig/network-scripts/ifcfg-eth0  网卡的配置信息 重启网卡:1)/etc/init.d/network restart(所有网卡)   ...

  3. 单片机的图形UI

    https://www.st.com/content/st_com/en/stm32-graphic-user-interface.html TouchGFX Designer:如今免费,资源占用10 ...

  4. jndi理解

    java中很多这些接口规范,jndi就是其中一个,而下面那些包就是jndi接口的提供商程序实现包,他们都是遵循jndi规范的. 主要接口功能是:添加命名与对象的映射到jndi树中,客户能快速查找并使用 ...

  5. 11073 最热门的K个搜索串

    11073 最热门的K个搜索串时间限制:350MS 内存限制:65535K提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VCDescription大家都非常喜欢而习惯用baidu ...

  6. 性能测试工具Jmeter09-Jmeter参数化

     三种方式: 1.用户参数 操作步骤,如下 响应断言,断言也要记得变量更替 2.CSV数据配置 以下截图为我的参数项文件 3.随机参数化

  7. vue中遇到的坑

    如何解决在vue中替换图片.一个使用base64,而我们使用zepto之后,src找不到资源,因为已经打包了,难道强行写base64. 1. 引入文件时语法很重要! import "Foot ...

  8. 案例50-crm练习dao层的抽取BaseDao

    1 抽取BaseDao 2 BaseDao设计思路 3 BaseDao接口书写 package www.test.dao; import java.io.Serializable; import ja ...

  9. NodeJS 开发应用

    NodeJS 开发应用 使用的 Node 版本: V8.11.4 开发工具: VSCode 1.27.1 系统: Deepin 15.7 Desktop x64 项目结构 项目结构 Project i ...

  10. java 使用Queue在队列中异步执行任务

    先创建一个总的Handler(队列统一处理接口),名字就叫做 QueueTaskHandler public interface QueueTaskHandler { void processData ...