1

再次返回并使用我之前发布的相同功能提出不同的问题:

- (AIEnemyUnit *) hitTestForEnemyUnit:(CGPoint)where {
    CALayer * layer = [self hitTest:where];

    while (layer) {
        if ([layer isKindOfClass:[AIEnemyUnit class]]) {
            return (AIEnemyUnit *)layer;
        } else {
            layer = layer.superlayer;
        }
    }

    return nil;
}

我有一个炸弹,用户将其拖到敌人的上方,使其直接显示在 AIEnemyUnit 上方。对于这个炸弹,我实现了 CALayer-containsPoint:在拖动过程中返回 NO 以允许 -hitTest: 穿过层。基本上,只要我只使用 CGImageRef 上下文,这种类型的命中测试就可以很好地处理这些“传递”层。然而,一旦我开始为炸弹添加额外效果的子层,我就 -hitTest:立即崩溃了。很明显,新层正在捕获-hitTest:. 我尝试通过重载-containsPoint:这些层来实现相同的技术,但它仍然返回炸弹的通用 CALayer 子类,而不是通过。

有没有更好的办法?

4

2 回答 2

2

也许“位置”点与您的“自我”层无关。您需要使用以下方法在图层坐标系之间转换这些点:

– convertPoint:fromLayer: 或 – convertPoint:toLayer:

请参阅http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html#//apple_ref/occ/instm/CALayer/convertPoint:fromLayer

于 2010-09-30T08:31:36.703 回答
0

我通过将所有内容放在与原始大小相同的第二个“根”层(称为“gameLayer”)上解决了这个问题。然后在 UIPanGestureRecognizer 期间,我将炸弹元素从“gameLayer”移动到我的 UIView.layer。然后,当我测试 AIEnemyUnit 时,我只在“gameLayer”上运行 hitTest。

- UIView.layer --------- gameLayer 
           |                |
     dragObj(bomb)     gameElements
                            |
                           bomb
于 2010-09-30T16:18:54.403 回答