2012-07-12 48 views
0

我正在創建切換開關。我有一個CCScene包含一個包含ToggleNode的CCLayer。 ToggleNode正確顯示我放入的精靈和標籤。觸摸處理不起作用,因爲ToggleNode的邊界框似乎保持爲零。我趕在CCLayer(其中工程作爲ccTouchBegan:withEvent:方法正在進入)觸摸那裏,我有這樣的代碼:Cocos2d包圍盒保持爲零

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 
{ 
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; 

    NSLog(@"bounding box: %f, %f, %f, %f", toggleNode.boundingBox.origin.x, toggleNode.boundingBox.origin.y, toggleNode.boundingBox.origin.x + toggleNode.boundingBox.size.width, toggleNode.boundingBox.origin.y + toggleNode.boundingBox.size.height); 
    NSLog(@"touch: %f, %f", touchLocation.x, touchLocation.y); 

    if (CGRectContainsPoint(toggleNode.boundingBox, touchLocation)) { 
     [toggleNode toggle]; 
    } 

    return NO; 
} 

在ToggleNode結果的觸摸中:

bounding box: 512.000000, 384.000000, 512.000000, 384.000000 
touch: 508.000000, 378.000000 

哪使我相信邊框保持爲零。但爲什麼?保留問題?我仍然在學習cocos2d,但我不認爲這是正常行爲。

回答

6

如果ToggleNode是從CCNode派生的,則此行爲是正常的。 CCNode具有0大小的邊界框,並且contentSize屬性也爲零。

如果您從CCNode派生類,則由您將contentSize屬性(這也會更新邊界框)設置爲它應該具有的任何大小。

只有當您使用使用紋理的類(CCSprite,CCLabelTTF等)時,cocos2d纔會自行設置contentSize。

+0

如果你有一個CGRectZero的CCSprite會發生什麼,但是如果給它帶有rects和正確的內容大小的孩子呢?父類仍然有一個contentSize爲0 ..我注意到了一些非常奇怪的行爲,其中像(0.5,0.5)錨點那樣的父類將以預期的定位(居中)顯示,但是如果你設置父類的contentSize到孩子的大小,那麼它的定位就全部搞砸了。我不明白爲什麼會發生這種情況,我很好奇你是否應該讓CCSprite父母像內容大小爲0. – patrick 2015-07-23 05:29:40

+0

如果沒有紋理,則不應該使用CCSprite,請使用改爲CCNode。除非您告訴他們,否則兒童不會更改其父母的contentSize。如果將父級的contentSize從0,0更改爲自定義值,並且父級具有anchorPoint 0.5,0.5,則這將更改子節點位置,因爲它們錨定在父級的左下角,相對於父級的anchorPoint和contentSize。 – LearnCocos2D 2015-07-24 09:29:55

+0

用盡評論空間:通過使用非零的anchorPoint增加父級的contentSize,它的「左下角」向左和向下移動「(contentSize * anchorPoint)」點。但是這就是子節點被錨定的地方,而不是在他們的父輩位置,而是在他們的'(parent.position - contentSize * anchorPoint)'處。這就是爲什麼你應該爲父節點使用anchorPoint 0,0,或者如果父節點本身不應該繪製任何東西,就使用CCNode。 – LearnCocos2D 2015-07-24 09:31:45

1

你必須自己計算你的ToggleNode的contentSize。您可能還需要在計算其contentSize之後移動ToggleNode的子節點,以使它們不出現在其邊界框的「外部」。