2012-04-15 5 views
1

У меня есть CCLayer подкласс MyLayer, в котором я обрабатывать события прикосновения:Проблема с обнаружением крана на CCLayer подкласса

(BOOL) ccTouchBegan:(UITouch *) touch withEvent:(UIEvent *) event 

Я установил размер содержимого MyLayer экземпляров, как это:

`myLayer.contentSize = CGSizeMake(30.0, 30.0);` 

Я тогда добавьте MyLayer экземпляров в качестве детей ParentLayer. По какой-то причине я могу нажать в любом месте на экране, и экземпляр MyLayer обнаружит кран. Я хочу только обнаруживать краны на видимой части/размере содержимого. Как это сделать?

Являются ли экземпляры MyLayer каким-то образом унаследовавшим «область помощи» откуда-то еще? Я проверил, что contentSize экземпляра только что прослушивается (30, 30), как и ожидалось. Возможно, contentSize не позволяет указать область подкачки подкласса CCLayer.

ответ

4

Когда касание включено на конкретном 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... 
} 
+0

Это интересно. Я удивлен, что «CCLayer» получит штрихи вне его contentSize. – SundayMonday

+1

Это немного странно, я согласен. Однако CCLayers может быть довольно сложным, чтобы определить местоположение, когда они вложены друг в друга. Вероятно, это означает, что основной поток доступен для обработки графики. – bendu