Попробуйте что-то еще подобное (обратите внимание, что ccTouchesBegan
не ccTouchBegan
):
- (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
приведет к тому, что будет выбран только первый объект в draggableSprites
из-за вашего оператора break
. С этим новым кодом каждый спрайт, ограничивающий прямоугольник, содержит анимацию. Код может быть не идеальным, потому что я набрал его прямо в Chrome, но вы поняли.
Еще одна важная вещь, которую стоит отметить, это то, что вы не можете запустить одно и то же действие на двух разных спрайтах, например:
id action = [CCScaleTo actionWithDuration:1 scale:1.0];
[someSprite runAction:action];
[someOtherSprite runAction:action];
[oneMoreSprite runAction:action];
Этот код не будет работать должным образом; только последний спрайт (oneMoreSprite
) будет анимирован. Чтобы повторно использовать анимацию CC с несколькими спрайтами, используйте этот код:
id action = [CCScaleTo actionWithDuration:1 scale:1.0];
[someSprite runAction:action];
[someOtherSprite runAction:[[action copy] autorelease]];
[oneMoreSprite runAction:[[action copy] autorelease]];
Мы создаем копию действия, чтобы оно могло выполняться другим спрайтом (someOtherSprite
, oneMoreSprite
), не удаляя его из исходного спрайта, someSprite
. Затем мы автоматически высвобождаем его, чтобы не было утечки памяти.