Cocos2D v3.x中关于重叠触摸层优先级的问题

在Cocos2D v2.x版本中可以通过以下方法设置本层的触摸优先级:

[[CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:-256 swallowsTouches:YES];

不过以上方法在Cocos2d v3.x中已经不复存在了.

总的来说在v3.x中触摸优先级问题变得更加简单了,它直接和不同层的z-order相关.

越靠近屏幕,即z序越大的层越先响应触摸事件,而z序越小的层越后响应触摸事件.在每个层的触摸事件里,如果调用[super xxx]方法则表示在本层触摸事件处理完成后,也将事件传递给下一层.如果不调用super方法,则事件会在本层被吞没,不会传递到下一层.

注意这里的层不一定指的是CCLayer类,因为在Cocos2d v3.x中任何可以响应触摸事件的节点都可以被当做层来用,比如CCNode.

举个例子,比如最上面是UI层UILayer,中间是Level层LevelLayer,最下方是MainScene层,比如它们的z序分别如下:

UILayer.zOrder = 200;
LevelLayer.zOrder = 100;
MainScene.zOrder = 0;

假设以上3个层都开启了触摸属性,否则是无论如何也收不到触摸事件的.

那么用户在按下屏幕一点时,UILayer层首先得到消息,接下来是LevelLayer层,最后是MainScene层.以上的前提是前两个层都调用super方法将事件传递给了下一层.

还有一点值得注意的是,如果某一层的z序很低,是无法单独提高该层子层节点的z序的.

比如现在LevelLayer层的z序为-100,所以现在变成MainScene层先捕获消息了(不考虑其他层),因为它的z序没有变还是0.现LevelLayer上还有一个Player子节点,如果将其z序设为100的话Player层能否在MainScene层之前捕获消息呢?

LevelLayer.zOrder = -100;
Player.zOrder = 100;
MainScene.zOrder = 0;

答案是:不可以!因为Player父节点的zOrder比MainScene层低,不管Player的z序被设置为多高都不可以在MainScene之前捕获消息.

时间: 2024-11-02 20:08:12

Cocos2D v3.x中关于重叠触摸层优先级的问题的相关文章

cocos2D v3.x 中action的回调block变化

cocos2D v2.x中有带参数的回调block: id blk = [CCCallBlockN actionWithBlock:^(CCNode *node){ node.position = orign; }]; 不过到了cocos2D v3.x中只有CCActionCallBlock一种block回调了,如果需要像以前那样传递参数,可以通过局部外围变量的方法,如下: CCNode *node = myNode; id blk = [CCActionCallBlock actionWith

cocos2D v3.x中动作回调函数的变化

cocos2D v3.x版本中的动作的回调函数不能再带任何参数并且不能返回任何值. 官方给出的传递参数的办法是: 选择器(selector)不能带有任何形参,选择器需要的参数必须通过ivar或property来间接传递. 通常更可取的避免通过ivar或property来传递参数的办法是使用CCActionCallBlock. 示例代码如下: id callFunc = [CCActionCallFunc actionWithTarget:self selector@selector(myCall

Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先说一下为什么要转换,这是为了后面的A*寻路算法做准备.由于在v1.0中,可能是Cocos2D本身有问题,以下 touchLocation = [_tileMap convertTouchToNodeSpace:touch]; 方法在执行到地图左边缘附近时,返回的CGPoint的x轴值不会再减小了.导致游戏主角不能再往地图左边靠近了.示意图如下(注意日志里输出

Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(四)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 现在打开MainScene.m文件,首先设置实例变量: @implementation MainScene{ CGSize _viewSize; CatSprite *_cat; CCTiledMap *_tileMap; CCTiledMapLayer *_bgLayer; CCTiledMapLayer *_objectLayer; //在cocos2Dv3

cocos2D v3.4 在TileMap中开启高清显示

在Tiled中制作一幅地图,用的图片砖块分辨率为32x32. iOS设备为iPhone 4s. 在未打开高清屏支持的cocos2d v2.x版本中,运行log显示480x320.遂启用高清屏支持: [CCdirector sharedDirector] enableRetinaDisplay:YES]; 重新运行App,可以发现分辨率变为960x640,Tile地图显示也是高清瓦片. 但是同样的地图,地图集图片在cocos2d v3.4中显示,即使app运行时分辨率是960x640,但是地图显示

Cocos2d-swift V3.x 中的update方法

在cocos2d V3.x中update方法如果实现,则会被自动调用;不用向早期的版本那样要显式schedule. 但是你还是要显式schedule其他方法或blocks使用node的schedule和unschedule方法.比如:scheduleOnce. update方法会在每一帧将对象(node)渲染到屏幕之前调用. 值得注意的是,你绝不能在cocos2d中的schedule时间事件中使用NSTimer,任何performSelector的变体方法以及Grand Central Disp

Cocos2D将v1.0的tileMap游戏转换到v3.4中一例(二)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 首先在CatMazeV3中新建CatSprite类,继承于Sprite.其中CatSprite.h文件如下所示: #import "CCSprite.h" @class MainScene; @interface CatSprite : CCSprite @property (nonatomic,assign,readonly) NSInteger n

在Flash中调用Html的层

本教程需要大家有一些关于HTML, CSS, Flash, JavaScript 和ASP的基础知识     用Html文本与Flash一起来制作动画是一个很好的方式. 它非常的简单, 而且容易上手,只需要使用ActionScript中的getURL()脚本就可以了,比你能想象到的任何其他编成语言(例如JavaScript)都更方便,功能也更强大.     请看下面这个情节: 在一个特殊工程中,设计师需要Flash 动画运行于页面的顶端,然后在Flash播放后,再显示文本.你可以在Flash中做

Creative Commons Licenses v3.0中英文版

Creative Commons Licenses v3.0中英文版,转自:http://creativecommons.org/licenses/ ,经整理贴出   Name Characteristics Version 3.0 Licenses: Attribution     Attribution-NoDerivs   Attribution-NonCommercial-NoDerivs Attribution-NonCommercial   Attribution-NonCommer