Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Cocos2d边界框保持为零_Ios_Cocos2d Iphone_Bounding Box - Fatal编程技术网

Ios Cocos2d边界框保持为零

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

我正在创建一个切换开关。我有一个场景,包含一个包含ToggleNode的CCLayer。ToggleNode与我放入的精灵和标签一起正确显示。触摸处理不起作用,因为ToggleNode的边界框似乎保持为零。我在CCLayer中捕捉到触摸(它与正在输入的CCtouchStart:withEvent:一样工作),在那里我有以下代码:

- (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。