2012-01-15 8 views
0

私はCocos2dとObjective-Cを学んでいます。タッチ検出にはいくつかの問題があります。タッチ検出に関する問題

HelloWorldLayerにいくつかのスプライトがあり、いくつかのdraggableSprites(NSMutableArray)があります。 draggableSpritesの2つが別のものの上にあります(下の方が大きくなります)。

- (void)selectSpriteForTouch:(CGPoint)touchLocation { 
    CCSprite *touchSprite = nil; 
    for (CCSprite *sprite in dragableSprites) { 
     if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {    
      touchSprite = sprite; 
      break; 
     } 
    }  
    if (touchSprite != selSprite) { 
     [selSprite stopAllActions]; 
     [selSprite runAction:[CCRotateTo actionWithDuration:0.1 angle:0]]; 
     CCRotateTo * rotLeft = [CCRotateBy actionWithDuration:0.1 angle:-1.0]; 
     CCRotateTo * rotCenter = [CCRotateBy actionWithDuration:0.1 angle:0.0]; 
     CCRotateTo * rotRight = [CCRotateBy actionWithDuration:0.1 angle:1.0]; 
     CCSequence * rotSeq = [CCSequence actions:rotLeft, rotCenter, rotRight, rotCenter, nil]; 
     [touchSprite runAction:[CCRepeatForever actionWithAction:rotSeq]];    
     selSprite = touchSprite; 
    } 
} 

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch]; 
    [self selectSpriteForTouch:touchLocation]; 
    return TRUE; 
} 

しかし、私は上部または下部スプライトをタッチすると、底面のみ1は、(それがINITに最初に追加されました)揺れている:

それから私は触れたスプライトを揺るがすいくつかのコードを持っています。

私はコードCGRectContainsPoint(sprite.boundingBox, touchLocation)を交換する必要があると思いますが、私はちょうどその方法がわかりません。

私は、フォーラムにいくつかの夜を過ごしたが、私はまだトップスプライトシェイクを作る方法を理解することはできません...

答えて

0

は、(それがccTouchesBeganccTouchBeganではありません注意してください)より、このような何かを試してみてください:

- (void)startShakingSprite:(CCSprite*)sprite { 

    [sprite stopAllActions]; 
    [sprite runAction:[CCRotateTo actionWithDuration:0.1 angle:0]]; 
    CCRotateTo* rotLeft = [CCRotateBy actionWithDuration:0.1 angle:-1.0]; 
    CCRotateTo* rotCenter = [CCRotateBy actionWithDuration:0.1 angle:0.0]; 
    CCRotateTo* rotRight = [CCRotateBy actionWithDuration:0.1 angle:1.0]; 
    CCSequence* rotSeq = [CCSequence actions:rotLeft, rotCenter, rotRight, rotCenter, nil]; 
    [sprite runAction:[CCRepeatForever actionWithAction:rotSeq]]; 
} 

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent*)event { 
    //get the touch 
    UITouch* touch = [touches anyObject]; 
    //get its location 
    CGPoint location = [touch locationInView:[touch view]]; 
    //convert location to cocos2d coordinates 
    CGPoint point = CGPointMake(location.x, 480 - location.y); 

    //now we go through your array of objects and see which contains the touch 
    for(id sprite in draggableSprites) { 
     if(CGRectContainsPoint(sprite.boundingBox, point)) { 
      [self startShakingSprite:sprite]; 
     } 
    } 
} 

forループをselectSpriteForTouchに設定すると、breakステートメントのために、draggableSpritesの最初のオブジェクトのみが選択されます。この新しいコードでは、バウンディングボックスにタッチが含まれている各スプライトにアニメーションが適用されます。私はChromeに直接入力したのでコードは完璧ではないかもしれませんが、あなたはそのアイデアを得ています。

注意すべきもう一つの重要なことは、あなたがこのように、二つの異なるスプライトに同じアクションを実行できないということです。

id action = [CCScaleTo actionWithDuration:1 scale:1.0]; 
[someSprite runAction:action]; 
[someOtherSprite runAction:action]; 
[oneMoreSprite runAction:action]; 

このコードが意図したとおりに動作しません。最後のスプライト(oneMoreSprite)のみがアニメ化されます。複数のスプライトでの再使用のCCアニメーションするためには、このコードを使用します。それは、元のスプライトから削除せずに別のスプライト(someOtherSpriteoneMoreSprite)で実行できるように、我々は、アクションのコピーを作成

id action = [CCScaleTo actionWithDuration:1 scale:1.0]; 
[someSprite runAction:action]; 
[someOtherSprite runAction:[[action copy] autorelease]]; 
[oneMoreSprite runAction:[[action copy] autorelease]]; 

を、someSprite。次に、メモリリークを起こさないように自動リリースします。

+0

ありがとう! Breakステートメントを削除すると、スプライトのトップに役立ちます。 – OnOff

+0

うれしい私は助けることができました! –