Cocoa touch CCLayer子类上的抽头检测故障

Cocoa touch CCLayer子类上的抽头检测故障,cocoa-touch,cocos2d-iphone,subclass,cclayer,Cocoa Touch,Cocos2d Iphone,Subclass,Cclayer,我有一个CCLayer子类MyLayer,我在其中处理触摸事件: (BOOL) ccTouchBegan:(UITouch *) touch withEvent:(UIEvent *) event 我将MyLayer实例的内容大小设置如下: `myLayer.contentSize = CGSizeMake(30.0, 30.0);` 然后,我将MyLayer实例添加为ParentLayer的子实例。出于某种原因,我可以在屏幕上的任何地方点击,MyLayer实例将检测到点击。我只想检测可见部

我有一个
CCLayer
子类
MyLayer
,我在其中处理触摸事件:

(BOOL) ccTouchBegan:(UITouch *) touch withEvent:(UIEvent *) event
我将
MyLayer
实例的内容大小设置如下:

`myLayer.contentSize = CGSizeMake(30.0, 30.0);`
然后,我将
MyLayer
实例添加为
ParentLayer
的子实例。出于某种原因,我可以在屏幕上的任何地方点击
MyLayer
实例将检测到点击。我只想检测可见部分/内容大小上的点击我该怎么做?


MyLayer
实例是否以某种方式从其他地方继承了“可点击区域”?我已经验证了刚才点击的实例的
contentSize
(30,30)
,与预期的一致。可能contentSize不是指定
CCLayer
子类的可点击区域的方法。

在特定CCLayer上启用触摸时,它会接收窗口中的所有触摸事件。也就是说,如果有多个层,所有层都将接收相同的触摸

为了缓解这种情况,从UITouch获取位置,将其转换为Cocos2d坐标,然后检查它是否在您所关注的层的边界内

下面是一些可以使用的代码:

CCLayer * ccl = [[CCLayer alloc] init];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
if (CGRectContainsPoint(CGRectMake(ccl.position.x - ccl.contentSize.width/2, ccl.position.y - ccl.contentSize.height/2, ccl.contentSize.width, ccl.contentSize.height), location)) {
   //continue from there...
}

当触摸在特定CCLayer上启用时,它将接收窗口中的所有触摸事件。也就是说,如果有多个层,所有层都将接收相同的触摸

为了缓解这种情况,从UITouch获取位置,将其转换为Cocos2d坐标,然后检查它是否在您所关注的层的边界内

下面是一些可以使用的代码:

CCLayer * ccl = [[CCLayer alloc] init];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
if (CGRectContainsPoint(CGRectMake(ccl.position.x - ccl.contentSize.width/2, ccl.position.y - ccl.contentSize.height/2, ccl.contentSize.width, ccl.contentSize.height), location)) {
   //continue from there...
}

那很有趣。我很惊讶
CCLayer
会收到超出其contentSize的内容。我同意,这有点奇怪。但是,CCLayers可能非常复杂,无法确定它们彼此嵌套时的位置。这可能是为了让主线程可以用于图形处理。这很有趣。我很惊讶
CCLayer
会收到超出其contentSize的内容。我同意,这有点奇怪。但是,CCLayers可能非常复杂,无法确定它们彼此嵌套时的位置。这可能是为了保持主线程可用于图形处理。