【问题标题】:Cocos2d bounding box remains zeroCocos2d 边界框保持为零
【发布时间】:2012-07-12 00:31:03
【问题描述】:

我正在创建一个切换开关。我有一个 CCScene,其中包含一个包含 ToggleNode 的 CCLayer。 ToggleNode 正确显示了我放入的精灵和标签。触摸处理不起作用,因为 ToggleNode 的边界框似乎保持为零。我在 CCLayer 中捕捉到了触摸(作为 ccTouchBegan: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 中学习,但我认为这不是正常行为。

【问题讨论】:

    标签: ios cocos2d-iphone bounding-box


    【解决方案1】:

    如果 ToggleNode 是从 CCNode 派生的,这种行为是正常的。 CCNode 的边界框大小为 0,contentSize 属性也为零。

    如果您从 CCNode 派生您的类,则由您将 contentSize 属性(这也会更新边界框)设置为它应该具有的任何大小。

    只有当你使用一个使用纹理的类(CCSprite、CCLabelTTF 等)时,cocos2d 才会自己设置 contentSize。

    【讨论】:

    • 如果你有一个带有 CGRectZero 的 CCSprite,但给它的孩子有矩形和适当的内容大小,会发生什么?父级的 contentSize 仍然为 0.. 我注意到一些非常奇怪的行为,其中锚点为 (0.5,0.5) 的父级将以预期的定位(居中)显示,但是如果您设置父级的 contentSize到孩子的大小,那么它的定位就全部搞砸了。我不明白为什么会这样,我很好奇你是否应该让这样的 CCSprite 父母的内容大小为 0。
    • 如果 CCSprite 没有纹理,则不应使用它,而是使用 CCNode。孩子不会改变他们父母的 contentSize,除非你告诉他们。如果您将父级的 contentSize 从 0,0 更改为自定义值,并且父级的 anchorPoint 为 0.5,0.5,那么这将更改子节点的位置,因为它们相对于父级的 anchorPoint 和 contentSize 锚定在父级的左下角。
    • 评论空间不足:通过使用非零锚点增加父级的 contentSize,其“左下”角将(contentSize * anchorPoint) 点向左和向下移动。但这就是子节点锚定的地方,不是在它们的父位置,而是在它们的(parent.position - contentSize*anchorPoint)。这就是为什么你应该为父节点使用anchorPoint 0,0,或者如果父节点不应该自己绘制任何东西,则只使用CCNode。
    【解决方案2】:

    您必须自己计算 ToggleNode 的contentSize。您可能还需要在计算其contentSize 后移动 ToggleNode 的子节点,这样它们就不会出现在其边界框的“外部”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      相关资源
      最近更新 更多