cocos2d-x推断sprite点击

我们经常须要推断用户的点击操作是否落于某个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。

原文地址:https://www.cnblogs.com/mqxnongmin/p/10640455.html

时间: 2024-10-27 12:09:04

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

Unity2D 之 Sprite点击事件

以下方法纯属我YY,切勿当真!!! 给 Sprite添加点击事件步骤: 1. 创建一个 Sprite 2. 给Sprite添加一个 Box Collider 2D 3. 将如果脚本放到Sprite上: using UnityEngine; using System.Collections; /// <summary> /// 主要是按钮: /// a. 默认的点击效果 /// b. 切换点击的图片 /// </summary> public class ButtonSprite :

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

ps. 这个方法只适用设置精灵的触摸.. //注册触摸事件..3.X后可以在这样写..不需要重新声明 EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = [](Touch* pTouch, Event* pEvent){ return true; }; listener->onTouchMoved = [](Touch* pTouch, Eve

华容道06--屏幕点击事件和角色间的碰撞

角色的碰撞检测 用一个二维数组记录每行每列是否已经被占用了,0是还没占用的状态下面是完整代码: GameLayer.h GameLayer.h #ifndef _GAME_LAYER_H_ #define _GAME_LAYER_H_ #include "cocos2d.h" class Level ; class RoleSprite ; class GameLayer : public cocos2d::Layer { public: static cocos2d::Scene*

iOS导入cocos2d游戏

一.xcode中在自己项目中引入cocos2dx,需要导入cocos2d_libs静态库.首先需要到官网下载cocos2d引擎,cocos2d引擎下载链接点击进入官网 二.将cocos2d引擎拷贝到工程目录,在工程中add Files..添加到工程中. 三.添加依赖库 四.对工程进行配置 1.Build Settings中配置 设置Valid Architectures 2.Build Options ->Enable Bitcode 设置为NO 3.设置Other Linker Flages

【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现

CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成为极客学院的会员,能够免费领取30天学习时间,免费拿极客学院VIP,1000+高清视频.学习Android.HTML5.iOS各种开发技术,限时领取.手快的戳:http://e.jikexueyuan.com/invite/index.html?ZnJvbV9jb2RlPVkxblJUZSZ1bmF

cocos2dx 3.x(捕鱼达人炮台角度换算)

1 // 2 // GameScence.hpp 3 // NotesDamo 4 // 5 // Created by apple on 16/10/23. 6 // 7 // 8 9 #ifndef GameScence_hpp 10 #define GameScence_hpp 11 12 #include <stdio.h> 13 #include "cocos2d.h" 14 15 class GameScence : public cocos2d::Layer

Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

提要 此篇是一个国外教程的翻译,虽然有点老,但是适合新手入门.自己去写代码,debug,布置场景,可以收获到很多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一篇中,我们学会了怎么在Unity中搭建游戏的场景,并且设置模型的物理属性. 在第二篇中,我们学会了怎么在unity中使用脚本,并且创建了大部分的游戏逻辑,包括投球和得分! 在这最后一节中,我们将会为用户创建一个菜单系统,并且和GameController进行交互,我们开始吧. 在设备上测试 到目前为止,

Cocos2d-x 3.x版2048游戏开发

今天给大家介绍如何快速开发2048这样一款休闲游戏,理解整个2048游戏的开发流程,从中你将可以学习到以下内容: 2048游戏的逻辑 Cocos2d-x中上下左右手势的识别 游戏中卡片类的创建 添加卡片到游戏中 游戏中的逻辑实现 游戏中随机卡片的生成 游戏结束判断 游戏分数的添加 游戏美化 笔者的开发环境:    Cocos2d-x 3.1.1(开发引擎)    Visual Studio 2012(Win32)    Xcode 5.1(Mac系统下) 这里注明一下,本教程来自极客学院,小巫对

Cocos2d-x之Action

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 在Cocos2d-x中的Node对象可以有动作,特效和动画等动态特性.因此在Node类中定义了这些动态特性,因此精灵,标签,菜单,地图和粒子系统等都具有这些动态特性.在cocos2d-x中为了让游戏画面动起来,有两种方法,例如:位置.大小,旋转等等.另外:一种就是使用动作: cocos2d-x中提供了丰富的动作类,这些动作类分为动作包括:属性变化动作(如:缩放,旋转等),瞬时动作,持续性动作,变速运动,控制动作,视觉特效动作,复合动作