2012-10-29 93 views
0

我目前有一個「控制檯」CClayer,它正在處理已添加到其中的精靈的觸摸檢測。然而,我也有一些精靈想要做觸摸檢測,它們不屬於控制檯層......他們目前是從CCNode繼承的類的子類。如何正確處理多個圖層的觸摸事件?

我的理解是,越茯苓對象具有「isTouchEnabled」屬性設置爲true,更多的性能會受到影響,所以我很好奇,我應該怎麼處理這個?

我應該:

A)有控制檯的方法的touchesBegan執行屬於CCNode精靈的檢測?

B)就在CCNode對象上實現isTouchEnabled

C)一些其他的方法呢?

回答

0

嗯,首先,你應該只關心自己對性能,如果你關心你即看到或測量(在設備上不是一個模擬器)一些不適當的響應時間。

我會避免檢測涉及另一個節點的觸摸 - 它可能會變得混亂,軟件明智。我傾向於在觸摸位於檢測節點關注對象的位置時嚴格地返回YES(來自ccTouchBegan)。當您返回NO時,調度員會將觸摸傳遞給其他處理程序(在控制檯之下),直到一個這樣的CCNode咬緊牙關。種類如下:

- (void) onEnter{ 
    [[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 
    [super onEnter]; 
} 

- (void) onExit{ 
    [[[CCDirector sharedDirector] touchDispatcher] removeDelegate:self]; 
[super onExit]; 
} 

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{ 
    if (!_visible || !_enabled) { 
     return NO; 
    } 
    CGPoint loc = [touch locationInView:touch.view]; 
    loc = [[CCDirector sharedDirector] convertToGL:loc]; 

    if ([self containsPoint:loc]) { 
     // do your thing here ! 
     return YES; 
    } 

    return NO; 
} 

-(BOOL) containsPoint:(CGPoint) location { 
    // determine here whether this node should be handling 
    // this touch. 
} 
+0

所以你不使用touchBegan對父對象,並檢查在兒童精靈觸摸?你實際上是否觸碰過各個精靈本身? – patrick

+0

實際上我使用觸摸處理協議,在遊戲中這樣做是有意義的。以上是來自本地種植的滾動菜單。在基於區塊的RPG遊戲,遊戲對我有2個觸摸處理器:一個用於處理的WorldView:它知道,所有的士兵,是什麼牌,什麼「觸摸感應」對象奠定了地圖上。另一個是我的HumanController對象,基本上是用於選擇技能和動作的GUI,等等......我通常不會繼承CCSprite類:相反,我有一個帶有mapLayout處理函數的Soldier類。它決定如何表示士兵並使用WorldView的服務。 – YvesLeBorg