私はこれを数時間(実際には2日間)勉強していて、何が間違っているのか分かりません。接触は受け入れられて処理されますが、isTouchHandled
テストでは早期にTRUEがトリガーされます。あたかも異なるバウンディングボックスがタッチされたものと同じようにタッチされたかのように見える。私はいくつかのオーバーラップしないCCSpriteボタンを持っていて、それぞれがlevelButtons
配列を指しています。どれがタッチされたかを見るために繰り返します。それは常に間違ったものです。CGRectContainsPointsとバウンディングボックスのチェックが数ピクセルでオフになっています
これらのスプライトが他のレイヤーにある場合、CGRectContainsPoints
メソッドはスローされますか?言い換えれば、position
によって報告されたピクセル位置の生の等価性を使用してCGRectContainsPoints
ですか?その場合、スクリーン全体に対するスプライトの位置は、それが親である子である場合、報告された位置とは異なります。多分これには何か関係がありますか?私の配列とその内容のタグが正しく整列しているので、何度もログに記録してチェックしました。バウンディングボックスチェックのようです。
-(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
CCLOG (@"levelButtons size:%i",[self.levelButtons count]);
BOOL isTouchHandled = NO;
for (int i=0;i<25;i++){
CCSprite*temp=(CCSprite*)[self.levelButtons objectAtIndex:i];
CCLOG(@"iteration temp.tag: %i for object: %i",temp.tag,i);
isTouchHandled= CGRectContainsPoint([temp boundingBox], [[CCDirector sharedDirector] convertToGL:[touch locationInView: [touch view]]]);
if (isTouchHandled) {
CCLOG(@"level touched: %i",temp.tag);
break;
}
}
return isTouchHandled;
}
UPDATE:ちなみに、私もちょうどCCSpriteをサブクラス化し、画像のうち、スプライトの私の配列を取って、この方法では、個々のスプライトにトウシュ・メソッドを追加します。結果は同じだったので、あなたのrect
が他の子供の子である場合、CGRectContainsPointsが正しく動作していないと思われます。座標が正しく報告されていないと思われます。
ここの情報を使用して:http://www.cocos2d-iphone.org/forum/topic/9636境界ボックスの位置の追加ログのログを使用して、境界ボックスが実際に私のスプライトで正しく描画されていることを確認できます – johnbakers
、私はレイヤー上のスプライトの子のバウンディングボックスが画面に相対的ではないことを確認しました。したがって、cgrectcontainspointは間違った座標を取得していることを認識しません。 – johnbakers