0

ccnodes (スプライト、ラベルなど) を個別にタッチ イベントに応答させようとしています...

次のコードがあります。

@implementation CCNode (TouchDetection)

(BOOL)containsPoint:(CGPoint)point padding:(NSArray *)padding {
    NSAssert(([padding count] == 4), @"padding must consist of [top, right, bottom, left] values!");
    int paddingTop    = [padding[0] integerValue];
    int paddingRight  = [padding[1] integerValue];
    int paddingBottom = [padding[2] integerValue];
    int paddingLeft   = [padding[3] integerValue];
    CGRect rect = CGRectMake(0, 0, paddingLeft + self.contentSize.width + paddingRight, paddingTop + self.contentSize.height + paddingBottom);
    return CGRectContainsPoint(rect, locationInNodeSpace);
}

-(BOOL)containsTouch:(UITouch *)touch padding:(NSArray *)padding {    
    CCDirector* director = [CCDirector sharedDirector];
    CGPoint locationGL = [director convertToGL:[touch locationInView:[[CCDirector sharedDirector] view]]];
    return [self containsPoint:locationGL padding:padding];
}

@end

これは、0,0 が中心になるように固定されたノードを除いて、うまく機能しました。この実装は、原点が 0,0 の長方形と比較されているため、この場合は明らかに機能しません...したがって、左側のこれらのノードのいずれかをタップすると、それらは機能しませんlocationInNodeSpace が負であるため、四角形の外側に登録します。

コードを次のように変更しました。

(BOOL)containsPoint:(CGPoint)point padding:(NSArray *)padding {
    NSAssert(([padding count] == 4), @"padding must consist of [top, right, bottom, left] values!");
    int paddingTop    = [padding[0] integerValue];
    int paddingRight  = [padding[1] integerValue];
    int paddingBottom = [padding[2] integerValue];
    int paddingLeft   = [padding[3] integerValue];
    float paddedWidth = paddingLeft + self.contentSize.width + paddingRight;
    float paddedHeight = paddingTop + self.contentSize.height + paddingBottom;
    CGRect rect = CGRectMake(-paddedWidth / 2, -paddedHeight / 2, paddedWidth, paddedHeight);
    CGPoint locationInNodeSpace = [self convertToNodeSpace:point];
    return CGRectContainsPoint(rect, locationInNodeSpace);
}

これらのケースでは修正されましたが、0,0 が中心にないノードでは正しく機能しません。

私はこれについて間違った方法で進んでいますか?すべてを同じように固定するのが最善ですか?

アップデート:

明らかに、この問題はアンカーポイントとは何の関係もありません。contentSize が 220,180 に設定されている CCNode があります。そのアンカー ポイントは 0,0 です... ここで何が起こっているかを確認するために、いくつかの NSLogging を追加しました。左下隅をタップすると、次のように表示されます。

2013-09-28 09:24:11.205 [4101:c07] ================> anchor:{0, 0}  location in node:{-77, -65.5}  location in world:{1131, 1298.5}  rect:{{0, 0}, {220, 180}}  boundingBox:{{220, 170}, {220, 180}}  padding: 0 0 0 0

ノード スペース内の位置が NEGATIVE であるため、このタッチは検出されません。CCNode の中心の左と下にあるものはすべて負の位置になります。

右上隅をタップすると、次のように表示されます。

2013-09-28 09:24:12.175 [4101:c07] ================> anchor:{0, 0}  location in node:{89, 64.5}  location in world:{1297, 1428.5}  rect:{{0, 0}, {220, 180}}  boundingBox:{{220, 170}, {220, 180}}  padding: 0 0 0 0

したがって、CCNode のバウンディング ボックスを使用しても役に立ちません。アンカー ポイントに基づいて四角形を変更しても、役に立ちません。

なぜ負の値を取得しているのかを理解する必要があります...誰かこのナンセンスに光を当てることができますか?

4

1 に答える 1

0

アンカー ポイントの効果を無効にするには、次のようにします。

CGRect rect = CGRectMake(self.position.x -(self.contentSize.width * self.anchorPoint.x),
                         self.position.y - (self.contentSize.height * self.anchorPoint.y),
                         paddingLeft + self.contentSize.width + paddingRight, 
                         paddingTop + self.contentSize.height + paddingBottom);

しかし、 CGRect rect= [self boundingBox] が探しているものかどうか疑問に思っていました。

それがうまくいくかどうか教えてください!テストできていません。

于 2013-09-23T03:07:26.777 に答える