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 のバウンディング ボックスを使用しても役に立ちません。アンカー ポイントに基づいて四角形を変更しても、役に立ちません。
なぜ負の値を取得しているのかを理解する必要があります...誰かこのナンセンスに光を当てることができますか?