Ios Cocos2d边界框保持为零
我正在创建一个切换开关。我有一个场景,包含一个包含ToggleNode的CCLayer。ToggleNode与我放入的精灵和标签一起正确显示。触摸处理不起作用,因为ToggleNode的边界框似乎保持为零。我在CCLayer中捕捉到触摸(它与正在输入的CCtouchStart:withEvent:一样工作),在那里我有以下代码:Ios Cocos2d边界框保持为零,ios,cocos2d-iphone,bounding-box,Ios,Cocos2d Iphone,Bounding Box,我正在创建一个切换开关。我有一个场景,包含一个包含ToggleNode的CCLayer。ToggleNode与我放入的精灵和标签一起正确显示。触摸处理不起作用,因为ToggleNode的边界框似乎保持为零。我在CCLayer中捕捉到触摸(它与正在输入的CCtouchStart:withEvent:一样工作),在那里我有以下代码: - (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touch
- (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,但我认为这不是正常行为。你必须自己计算你的ToggleNode的
内容大小。在计算ToggleNode的contentSize
后,您可能还需要移动ToggleNode的子节点,以便它们不会显示在其边界框的“外部”。如果ToggleNode是从CCNode派生的,则此行为是正常的。CCNode的边界框大小为0,contentSize属性也为零
如果您从CCNode派生类,则由您将contentSize属性(这也会更新边界框)设置为其应有的大小
只有当您使用使用纹理的类(CCSprite、CCLabelTTF和其他)时,cocos2d才会自行设置contentSize。如果您的CCSprite具有CGRectZero,但为其提供具有Rect和适当内容大小的子级,会发生什么情况?父级的contentSize仍然为0。。我注意到一些非常奇怪的行为,像这样一个锚定点为(0.5,0.5)的父对象将显示预期的位置(居中),但是如果您将父对象的contentSize设置为子对象的大小,那么它的位置就完全错误了。我不明白为什么会发生这种情况,我很好奇你是否应该让像这样的CCSprite父母的内容大小为0。如果没有纹理,你不应该使用CCSprite,而是使用CCNode。孩子们不会改变父母的内容大小,除非你告诉他们。如果将父节点的contentSize从0,0更改为自定义值,并且父节点的锚点为0.5,0.5,则这将更改子节点位置,因为它们相对于父节点的锚点和contentSize锚定在父节点的左下角。注释空间不足:通过使用非零值增加父节点的contentSize主播点,其“左下”角向左和向下移动(contentSize*anchorPoint)
。但这就是子节点被锚定的位置,不是在它们的paren't位置,而是在它们的(parent.position-contentSize*anchorPoint)
。这就是为什么应该使用anchorPoint 0,0作为父节点,或者如果父节点本身不应该绘制任何内容,则只使用CCNode。