2012-02-24 4 views
0

私はこれを数時間(実際には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が正しく動作していないと思われます。座標が正しく報告されていないと思われます。

+0

ここの情報を使用して:http://www.cocos2d-iphone.org/forum/topic/9636境界ボックスの位置の追加ログのログを使用して、境界ボックスが実際に私のスプライトで正しく描画されていることを確認できます – johnbakers

+0

、私はレイヤー上のスプライトの子のバウンディングボックスが画面に相対的ではないことを確認しました。したがって、cgrectcontainspointは間違った座標を取得していることを認識しません。 – johnbakers

答えて

0

IはCGRectContainsPointテストのための新しいCGRectを作成し、実際の画面上の矩形に境界ボックスを変換することによって、これを解決します。子スプライト(またはレイヤー)に配置されている場合、バウンディングボックステストは単独では機能しません。親に対して相対的なローカル位置だけを返します。

0

スプライトを取得しようとしているアレイに問題があると思います。いずれにせよ、これは私がスプライトタグを取得するためのコードを使用している方法です。

UITouch *touch = [touches anyObject]; 
CGPoint location = [touch locationInView:[touch view]]; 
location = [[CCDirector sharedDirector] convertToGL:location]; 


for(int i1=0;i1<=25;i1++) 
{ 
    CCSprite *sprite1 = (CCSprite *)[self getChildByTag:i1]; 
    if(CGRectContainsPoint([sprite1 boundingBox], location)) 

    { 
     //Your Code 
      break; 
    } 

} 
+0

標準のバウンディングボックスチェックを使用していないことがわかります。スプライトがタッチされたポイントであれば、そのタッチのタグを報告する必要があります。親子ノード関係と結合して境界ボックスをどのように動作させるかによるかもしれません – johnbakers

+0

Ok。私は自分のコードを更新しました。境界ボックスは、CGRectと同じ動作を返します...私はそれがバウンディングボックスの問題ではないと思います。 – Anish

関連する問題