2012-04-15 4 views
1

Ich habe eine CCLayer Unterklasse MyLayer, in dem ich mit Touch-Ereignisse:Ärger mit Leitungserkennung auf CCLayer Unterklasse

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

ich den Inhalt Größe MyLayer Instanzen wie folgt festgelegt:

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

ich dann Fügen Sie MyLayer Instanzen als Kinder von ParentLayer hinzu. Aus irgendeinem Grund kann ich irgendwo auf dem Bildschirm antippen und eine MyLayer Instanz wird den Hahn erkennen. Ich möchte nur Taps auf den sichtbaren Teil/Inhalt Größe erkennen. Wie kann ich das tun?

Sind die MyLayer Instanzen irgendwie erben einen "tappable Bereich" von woanders? Ich habe überprüft, dass die contentSize der gerade getappten Instanz (30, 30) wie erwartet ist. Vielleicht ist die contentSize nicht die Art, den abgreifbaren Bereich der CCLayer Unterklasse anzugeben.

Antwort

4

Wenn die Berührung auf einem bestimmten CCLayer aktiviert ist, empfängt sie alle Berührungsereignisse im Fenster. Wenn mehrere Ebenen vorhanden sind, erhalten alle Ebenen dieselben Berührungen.

Um dies zu vermeiden, besorgen Sie sich die Position aus dem UITouch, konvertieren Sie sie in Cocos2d-Koordinaten und prüfen Sie, ob sie innerhalb der Grenzen der Ebene liegt, mit der Sie sich befassen.

Hier ist ein Code, mit zu arbeiten:

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

Das ist interessant. Ich bin überrascht, dass ein 'CCLayer' Berührungen außerhalb seiner Inhaltsgröße erhalten würde. – SundayMonday

+1

Es ist ein bisschen seltsam, stimme ich zu. CCLayers können jedoch sehr komplex sein, um den Speicherort von ineinander verschachtelten Standorten zu bestimmen. Dies ist wahrscheinlich, um den Haupt-Thread für die Grafikverarbeitung verfügbar zu halten. – bendu