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 の真上に表示されるように、ユーザーが敵の上にドラッグする爆弾があります。この爆弾では-containsPoint:、 -hitTest: がレイヤーを通過できるように、ドラッグ中に NO を返すように CALayer を実装しました。基本的に、このタイプのヒット テストは、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

元のレイヤーと同じサイズの 2 番目の「ルート」レイヤー (「gameLayer」と呼ばれる) にすべてを配置することで、これを解決しました。次に、UIPanGestureRecognizer 中に、爆弾要素を「gameLayer」から UIView.layer に移動します。次に、AIEnemyUnit のテスト中に、「gameLayer」でのみ hitTest を実行します。

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