2013-10-03 57 views
1

我有一個完整的畫布CCLayer,上面有幾個微小的CCLayer - 它們是按鈕。上的按鍵我能觸摸聽者:Cocos2D觸摸事件在每個(無關的)偵聽器中被觸發

- (id)init { 
    if ((self = [super init])) { 
    [self setTouchEnabled:YES]; 
    } 
    return self; 
} 

首先,我嘗試了默認的觸摸處理程序:

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"This is me: %d", self->button_id); 
} 

奇怪的結果是,無論我撫摸它總是會觸發所有按鈕的觸摸處理程序,即使我碰在一個乾淨的地方,什麼都不應該叫。

我正在閱讀有關文檔和博客,但似乎沒有什麼直接的解決方案。我也試過單次觸摸處理程序中加入:

- (void)onEnterTransitionDidFinish { 
    [CCDirector sharedDirector].touchDispatcher addTargetedDelegate:self priority:1 swallowsTouches:YES]; 
} 

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

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    NSLog(@"This is me: %d", self->button_id); 
} 

這種情況下,唯一的區別是,我只拿到了1監聽器觸發 - 總是我定義了一個最後的 - 又一次,無論觸摸發生的位置。

在我看來,問題不是事件委託,而是CCLayer邊界。這是我如何設置大小:

self.contentSize = CGSizeMake(10.0f, 10.0f); 

你有什麼想法,我錯了嗎?也許我錯過了一些必要的

謝謝!

回答

1

這真的取決於層的層次結構的所有觸摸將最終達到註冊節點。

但爲了節省您的麻煩,可以使用CCMenuCCMenuItem類輕鬆實現按鈕。

例如:

// Create a menu item with action method (when pressed) 
CCMenuItemImage *buttonItem= [CCMenuItemImage itemFromNormalImage:@"button1.png" selectedImage:@"button1.png" target:self selector:@selector(button1Pressed:)]; 

// Create a menu with the menu item and add it to your canvas layer 
CCMenu *menu= [CCMenu menuWithItems:buttonItem, nil]; 
[self addChild:menu]; 

而與此您將不再需要的小層了。只需將菜單添加到畫布層,並且不要忘記將其菜單項位置設置爲正確佈局。

相關問題